如何在GUI中实现游戏的逻辑
我正在尝试创建游戏Connect Four,并且我使用swing创建了GUI,其中每个“框”都是一个带有表示玩家颜色的图像的按钮。我写了游戏的逻辑在其他类,但现在如果我写这篇文章主要它甚至不会告诉我的按钮,而如果我只创建一个新的GUI它如何在GUI中实现游戏的逻辑
public static void main(String[] args)
{
Connect4 grid = new Connect4();
grid.inizializeGrid(7,6);
Connect4GUI GUI= new Connect4GUI();
}
编辑:这些都是2个CLASSE,他们在意大利对不起Forza4 = Connect4
package Forza4;
import java.util.Random;
public class Forza4 {
public boolean aggiungiPedina(int[][]g,int col,int p){
boolean spazio = false;
int indiceRiga = -1;
for(int i=0;i<g.length;i++){
if(g[i][col]==0){
spazio = true;
indiceRiga=i;
}
}
if(!spazio){
return false;
}
g[indiceRiga][col]=p;
return true;
}
public int[][] inizializzaGriglia(int n,int m,int t){
int[][] griglia = new int[n][m];
Random r = new Random();
int primoGiocatore = r.nextInt(2)+1;
int secondoGiocatore = primoGiocatore==1 ? 2: 1;
while(t>0){
int col = r.nextInt(m);
boolean aggiunta = aggiungiPedina(griglia, col, primoGiocatore);
while(!aggiunta){
col = r.nextInt(m);
aggiunta = aggiungiPedina(griglia, col, primoGiocatore);
}
col = r.nextInt(m);
aggiunta = aggiungiPedina(griglia, col, secondoGiocatore);
while(!aggiunta){
col = r.nextInt(m);
aggiunta = aggiungiPedina(griglia, col, secondoGiocatore);
}
}
return griglia;
}
public boolean verificaVittoria(int[][] g, int p){
for(int i=0;i<g.length;i++){
for(int j=0;j<g[0].length;j++){
if(g[i][j]==p){
boolean orizz = verificaOrizzontale(g,i,j,p);
boolean vert = verificaVerticale(g,i,j,p);
boolean obliquo = verificaObliquo(g,i,j,p);
if(orizz||vert||obliquo){
return true;
}
}
}
}
return false;
}
public boolean verificaOrizzontale(int[][]g,int row,int col,int p){
int cont = 0;
for(int j=col;j<g[0].length;j++){
if(g[row][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
cont=0;
for(int j=col;j>=0;j--){
if(g[row][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
return false;
}
public boolean verificaVerticale(int[][]g,int row,int col,int p){
int cont = 0;
for(int i=row;i<g.length;i++){
if(g[i][col]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
cont=0;
for(int i=row;i>=0;i--){
if(g[i][col]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
return false;
}
public boolean verificaObliquo(int[][]g,int row,int col,int p){
int cont = 0;
for(int i=row, j=col;i<g.length && j<g[0].length;i++, j++){
if(g[i][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
cont=0;
for(int i=row, j=col;i>=0 && j<g[0].length;i--, j++){
if(g[i][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
for(int i=row, j=col;i>=0 && j>=0;i--, j--){
if(g[i][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
for(int i=row, j=col;i<g.length && j>=0;i++, j--){
if(g[i][j]==p){
cont++;
}else{
break;
}
}
if(cont==4)
return true;
return false;
}
}
package grafica;
import javax.swing.*;
import Forza4.*;
import java.awt.event.*;
import java.util.*;
public class Forza4GUI
{ private JFrame frame;
/* INIZIO PARTE DA PERSONALIZZARE */
private JButton bottoneN;
private JLabel etichetta1;
private ArrayList<JButton> bottoniGriglia;
/* FINE PARTE DA PERSONALIZZARE */
public Forza4GUI()
{ frame = new JFrame();
frame.getContentPane().setLayout(null);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
impostaLF();
frame.setVisible(true);
inizializzaContenuto();
/* INIZIO PARTE DA PERSONALIZZARE */
frame.setBounds(30, 30, 630,650);
frame.setTitle("Forza 4");
/* FINE PARTE DA PERSONALIZZARE */
}
private ImageIcon caricaIcona(String nomeFile)
{ return new ImageIcon(getClass().getResource(nomeFile));
}
private void impostaLF()
{ try
{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e)
{ System.out.println(e);
System.exit(0);
}
}
private void inizializzaContenuto()
{ /* INIZIO PARTE DA PERSONALIZZARE */
bottoneN = new JButton("Nuova Partita");
frame.getContentPane().add(bottoneN);
bottoneN.setBounds(150, 30, 120, 30);
bottoneN.addActionListener(new PressioneBottoneN());
etichetta1 = new JLabel("jj");
frame.getContentPane().add(etichetta1);
etichetta1.setBounds(350,30 , 100, 30);
bottoniGriglia=new ArrayList<JButton>();
ActionListener listener = new PressioneBottoni();
int x=-90;
int k=0;
for(int i=1;i<=7;i++)
{
int y=-10;
x+=90;
for (int j=1;j<=6;j++)
{
k++;
JButton bottone=new JButton();
frame.getContentPane().add(bottone);
bottone.addActionListener(listener);
bottone.setActionCommand("" + k);
y+=91;
bottone.setBounds(x,y,90,91);
bottoniGriglia.add(bottone);
bottone.setIcon(caricaIcona("PallinoBiancoBordo.png"));
}
}
/* FINE PARTE DA PERSONALIZZARE */
}
/* INIZIO PARTE DA PERSONALIZZARE */
private class PressioneBottoni implements ActionListener
{ public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
}
}
private class PressioneBottoneN implements ActionListener
{ public void actionPerformed(ActionEvent e)
{
etichetta1.setText("Ricomincia!");
}
}
/* FINE PARTE DA PERSONALIZZARE */
public static void main(String[] args)
{
Forza4 griglia = new Forza4();
griglia.inizializzaGriglia(7,6,1);
Forza4GUI GUI= new Forza4GUI(); //DA PERSONALIZZARE CON IL NOME DELLA CLASSE CREATA
}
}
定义构造函数接受的类 “Connect4” 的参数 “Connect4GUI”:
public class Connect4GUI {
private Connect4 myConnect4;
public Connect4GUI (Connect4 c){
myConnect4 = c;
}
//..............
}
然后你的主变:
public static void main(String[] args)
{
Connect4 grid = new Connect4();
grid.inizializeGrid(7,6);
Connect4GUI GUI= new Connect4GUI(grid);
}
然后,您可以在“Connect4GUI”的方法中访问“myConnect4”。
编辑:
,你必须从这个新的构造函数中调用默认的构造函数:
public class Connect4GUI {
private Connect4 myConnect4;
public Connect4GUI (Connect4 c){
this();
myConnect4 = c;
}
//..............
}
我以这种方式尝试过,但它启动的过程中没有创建与GUI的窗口 – Andreascopp
对不起,但我没有得到它应该如何工作......我只有一个构造函数需要一个Connect4实例,实际上它给了我一个错误 – Andreascopp
代码(对应于Connect4GUI)中的类“Forza4GUI”具有默认构造函数(不带参数的构造函数)。现在,它必须有两个构造函数(默认+新建) – AhmadWabbi
我们需要Connect4'的'代码和'Connect4GUI'帮助 –
我已经做了,我希望这是可以理解的 – Andreascopp
首先将所有组件添加到顶层容器,然后将其可见属性设置为“true”。 –