如何在GUI中实现游戏逻辑

时间:2017-06-29 09:17:47

标签: java swing user-interface

我正在尝试创建游戏Connect Four,我使用swing创建了GUI,其中每个“box”是一个带有代表玩家颜色的图像的按钮。我在另一个类中编写了游戏的逻辑但现在如果我写这个主要它甚至不会显示按钮,而如果我只创建一个新的GUI它

public static void main(String[] args)
{
    Connect4 grid = new Connect4();
    grid.inizializeGrid(7,6);
    Connect4GUI GUI= new Connect4GUI();
}
编辑:这是两个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
}
}

1 个答案:

答案 0 :(得分:0)

定义“Connect4GUI”的构造函数,该构造函数接受“Connect4”类的参数:

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;
     }

    //..............
}