PROBLEMA Realizzazione interfaccia grafica Forza 4 in java

Darjo Dariani

Nuovo Utente
33
2
CPU
Intel I5 3570@3,4Ghz
Scheda Madre
Gigabyte GA-Z77-D3H
HDD
Western Digital Caviar Blu 1TB 7200rpm 64mb
RAM
Corsair Vengeance Blue 2x4GB 1600 Mhz CL9
GPU
EVGA GTX970 4GB SC
PSU
PC Xilence Redwing Series 700 R3 700W
Case
Midi MS-Tech
Salve a tutti, devo realizzare per l'università una IA che giochi a Forza 4 (già realizzata) e facoltativamente un'interfaccia grafica. Brevemente spiego come funziona la classe che implementa questa interfaccia: il gioco viene gestito da una libreria fornita che invoca il mio HumanPlayer attraverso il metodo start, che serve a iniziare una nuova partita, il metodo tellMove che serve a ricevere la mossa fatta dal computer e il metodo humanPlayerMove che comunica la mossa fatta dall'utente. Come inner class ho aggiunto la classe Buttongrid per realizzare la griglia di caselle, la classe cella che dovrebbe rappresentarmi un gettone inserito e un actionlistener che alla pressione del mouse mi aggiorna il gettone. Inoltre per poter scorrere attraverso le coordinate le celle (che altro non sono che un'estensione di jbutton) ho utilizzato un arraylist, dato che le coordinate x,y predefinite si riferiscono all'origine situata all'estremo in alto a sinistra dello schermo. Come si vede dal codice la parte che si occupa di aggiornare la tabella di gioco e uguale sia per la mossa del computer, sia per la mossa umana. I miei problemi sono due: il primo è che mentre mi aggiorna subito la griglia con la mossa del computer, se io clicko su una casella, per vederla aggiornata devo passarci sopra il cursore del mouse! Il secondo è che mi aggiorna soltanto il primo gettone in una colonna, se clicko per due turni di fila sulla stessa colonna mi va in loop il programma!

La classe HumanPlayer è la seguente:

Codice:
package gj.forza4.player;import gj.forza4.player.HumanPlayer.ButtonGrid.cella;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.*; 


import java.util.ArrayList;


public class HumanPlayer extends AbstractHumanPlayer {


    private int altezza;
    private int mossa;
    private int N = 7;
    private ArrayList<cella> cellaList = new ArrayList<cella>();
    
    public int getAltezza() 
    {
        return altezza;
    }


    public void setAltezza(int altezza) 
    {
        this.altezza = altezza;
    }


    public int getLarghezza() 
    {
        return larghezza;
    }


    public void setLarghezza(int larghezza) 
    {
        this.larghezza = larghezza;
    }


    private int larghezza;
    
    public void start(int nr, int nc) 
    {
        ButtonGrid tabellaDiGioco = new ButtonGrid(6,7);
    }


    public void tellMove(int c) 
    {
        mossa = c;
        int r = 5;
        for (int indice = r*7+mossa ; indice >= 0 ; r--)
        {
            cella cella = cellaList.get(indice);
            if    (cella.getFlag()==0)
            {
                cella.setFlag(2);
                repaint();
                break;
            }
        }        
    }
    


    protected void humanPlayerMove(int chosencol) 
    {
        setMove(chosencol);
    }


    public class ButtonGrid
        {
        private JFrame griglia = new JFrame ("Forza4");
        
        public JFrame getGriglia() 
        {
            return griglia;
        }


        public void setGriglia(JFrame griglia) 
        {
            this.griglia = griglia;
            griglia.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public ButtonGrid(int width, int length)
        {
            griglia.setLayout(new GridLayout(width,length));
            for(int y = width-1 ; y >= 0 ; y--)
            {
                for(int x = 0 ; x < length ; x++)
                {
                    cella cella = new cella(0);
                    griglia.add(cella);
                    cella.setBackground(new Color (0 , 50 , 255));
                    cella.setCol(x);
                    cella.setRaw(y);
                    cella.setBorderPainted(false);
                    cella.setVisible(true);
                    cella.addActionListener(new aggiornaCella());
                    cellaList.add(cella);
                }
            }
        
        griglia.setResizable(false);
        larghezza = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        altezza = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        griglia.setSize(larghezza/2, altezza-altezza/5);
        griglia.setLocation(larghezza/4, altezza/10);
        griglia.setVisible(true);
        
        }
        
        public class cella extends JButton
        {    
            
            public cella(int flag) 
            {
                super();
                this.flag = flag;
            }


            private int flag = 0; //0 vuoto, 1 mossa mia, 2 mossa opponent
            private int raw = 0;
            
            public int getRaw() 
            {
                return raw;
            }


            public void setRaw(int x) 
            {
                this.raw = x;
            }


            public int getCol() 
            {
                return col;
            }


            public void setCol(int y) 
            {
                this.col = y;
            }


            private int col = 0;
            
            public int getFlag() 
            {
                return flag;
            }


            public void setFlag(int flag) 
            {
                this.flag = flag;
            }


            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                if(flag==0)
                {
                    g.setColor(new Color (255,255,255));
                    g.fillRoundRect(2, 2,larghezza/15, (altezza-altezza/5)/7+3, larghezza/15+1, (altezza-altezza/5)/7);
                }
                if(flag==1)
                {
                    g.setColor(new Color (255,0,0));
                    g.fillRoundRect(2, 2,larghezza/15, (altezza-altezza/5)/7+3, larghezza/15+1, (altezza-altezza/5)/7);
                }
                if(flag==2)
                {
                    g.setColor(new Color (255,255,0));
                    g.fillRoundRect(2, 2,larghezza/15, (altezza-altezza/5)/7+3, larghezza/15+1, (altezza-altezza/5)/7);
                }
            }
            
        }
        
        
        public class aggiornaCella implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                cella cella = (cella)e.getSource();
                mossa = cella.getCol();
                humanPlayerMove(mossa);
                int r = 5;
                for (int indice = r*7+mossa ; indice >= 0 ; r--)
                {
                    cella = cellaList.get(indice);
                    if    (cella.getFlag()==0)
                    {
                        cella.setFlag(1);
                        repaint();
                        break;
                    }
                }
            }
        }
        
    }
}

EDIT: risolto il loop sul programma, la condizione dei for di scorrimento delle colonne era sbagliata :)
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!