Rendere interattivo un giochino

di il
14 risposte

Rendere interattivo un giochino

Salve. Ho creato un giochino in cui due giocatori lanciano a turno un dado. Chi ottiene il numero più grande guadagna un punto. Dopo 10 turni vince il giocatore che ha guadagnato più punti. Il programma è testuale e funziona in automatico una volta avviato (non sono ancora sicuro del suo totale funzionamento). Quello che vorrei fare è renderlo interattivo, nel senso che deve esserci una piccola interfaccia in cui l'utente lancia il dado cliccando su un tasto. Un altro dubbio che ho è capire quando è necessario ricorrere al multithreading. In questo caso non credo che serva, giusto? Cioè,nemmeno nel codice che ho già fatto.. ma volevo provare questo particolare lock.
Comunque, questo è il codice:

Dado

package giocodadi;


public class Dado {
    
    private int[] valori;
    
    public Dado() {
        valori = new int[6];
        valori[0] = 1;
        valori[1] = 2;
        valori[2] = 3;
        valori[3] = 4;
        valori[4] = 5;
        valori[5] = 6;
    }
    
    public int getNumeroCasuale() {
        int indice = (int) (Math.random()*6);
        return valori[indice];
    }
}
Game

package giocodadi;


import java.util.concurrent.locks.*;


public class Game {


    public static void main(String[] args) {
        
        //Credo il dado
        Dado dado = new Dado();
        //Oggetto per gestire il lock
        ReentrantLock lock = new ReentrantLock(true);
        //Creo i giocatori
        Giocatore giocatoreA = new Giocatore("Andrea",dado,lock);
        Giocatore giocatoreB = new Giocatore("Luca",dado,lock);
        //Creo il controllore
        Controllore c = new Controllore(giocatoreA,giocatoreB);
        giocatoreA.setControllore(c);
        giocatoreB.setControllore(c);
        //Creo i threads
        Thread gA = new Thread(giocatoreA);
        Thread gB = new Thread(giocatoreB);
        //Avvio i threads
        gA.start();
        gB.start();
    }
}
Giocatore

package giocodadi;


import java.util.Random;
import java.util.concurrent.locks.Lock;


public class Giocatore implements Runnable {
    
    private Dado dado;
    private final Lock lock;
    private final String nome;
    private Random random;
    private Controllore controllore;
    
    public Giocatore(String nome,Dado dado, Lock lock) {
        this.dado = dado;
        this.lock = lock;
        this.nome = nome;
        random = new Random();
    }
    
    public void setControllore(Controllore c) {
        this.controllore = c;
    }
    
    public void run() {
        while (controllore.getTurniPassati() <= 10) {
            lock.lock();
            try {
                if(controllore.getContaTurni() < 2) {
                    System.out.println("E' il turno "
                            + controllore.getTurniPassati());
                    int giocata = giocaDado();
                    System.out.println(nome
                            + " ha lanciato il dado ed ha ottenuto " + giocata);
                    controllore.incrementaTurno();
                    controllore.incrementaContaTurni();
                    controllore.setPunti(this, giocata);
                    // Genera un'attesa random.
                    attendi();
                }
                else {
                    controllore.resetContaTurni();
                    controllore.fineMano();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
    
    public void attendi() {
        // Genero un'attesa tra 100 e 1000 millisecondi.
        int j = 100;
        int n = 1000 - j;
        int attesa = random.nextInt(n) + j;
        try {
            Thread.sleep(attesa);
        } catch (InterruptedException e) {
            System.out.println("Qualcosa è andato storto...");
        }
    }
    
    public int giocaDado() {
        int res = dado.getNumeroCasuale();
        return res;
    }
    
    public String toString() {
        return nome;
    }
}
Controllore

package giocodadi;


public class Controllore {


    private int turniPassati;
    private Giocatore giocatoreA;
    private Giocatore giocatoreB;
    private int puntiA;
    private int puntiB;
    private int contaTurni;
    private int giocataA;
    private int giocataB;
    
    public Controllore(Giocatore gA, Giocatore gB) {
        turniPassati = 1;
        this.giocatoreA = gA;
        this.giocatoreB = gB;
        puntiA = 0;
        puntiB = 0;
        contaTurni = 0;
        giocataA = 0;
        giocataB = 0;
    }
    
    //Setta i valori intermedi ottenuti dal lancio del dado
    public void setPunti(Giocatore g, int giocata) {
        if(g.equals(giocatoreA)) {
            giocataA = giocata;
        }
        if(g.equals(giocatoreB)) {
            giocataB = giocata;
        }
    }
    
    //Sono passati due turni. E' finita la mano. Aggiorna il punteggio dei giocatori.
    public void fineMano() {
        
        if(giocataA == giocataB) {
            System.out.println("\nPareggio." + "\n");
            giocataA = 0;
            giocataB = 0;           
            if(this.getTurniPassati() == 10) {
                decretaVincitore();
            }
        }
        if(giocataA > giocataB) {
            System.out.println("\nVince la mano il giocatore " + giocatoreA.toString() + "\n");
            puntiA++;
            giocataA = 0;
            giocataB = 0;        
            if(this.getTurniPassati() == 10) {
                decretaVincitore();
            }
        }
        if(giocataA < giocataB) {
            System.out.println("\nVince la mano il giocatore " + giocatoreB.toString() + "\n");
            puntiB++;
            giocataA = 0;
            giocataB = 0;
            if(this.getTurniPassati() == 10) {
                decretaVincitore();
            }
        }
    }
    
    //La partita è finita. Stampa il vincitore
    public void decretaVincitore() {
        if(puntiA == puntiB) {
            System.out.println("Pareggio!");
        }
        if(puntiA > puntiB) {
            System.out.println("Vince il giocatore: " + giocatoreA.toString() + " " + puntiA + " a " + puntiB);
        }
        else
            System.out.println("Vince il giocatore: " + giocatoreB.toString() + " " + puntiB + " a " + puntiA);
    }
    
    public int getContaTurni() {
        return contaTurni;
    }
    
    public void incrementaContaTurni() {
        contaTurni++;
    }
    
    public void resetContaTurni() {
        this.contaTurni = 0;
    }
    
    public int getTurniPassati() {
        return turniPassati;
    }
    
    public void incrementaTurno() {
        turniPassati++;
    }
}

14 Risposte

  • Re: Rendere interattivo un giochino

    No infatti non c'è alcun bisogno del multithreading.
    Per l'interfaccia costruisci una classe che estende JFrame applica il tuo bottone imposta l'evento del JButton e fai partire il tuo dado.

    Ciao
  • Re: Rendere interattivo un giochino

    Si questo lo so però mi sto impiccando! Non riesco a ragionare in modo semplice. Vorrei che il codice fosse ben organizzato. Posto il codice nuovo, che non è finito, e da errore se provo a modificare gli oggetti della gui (e temo di sapere il motivo). Inoltre ci saranno tanti errori logici.
    Una volta che gioca il pc, gioco io ed il pc non gioca più. Vorrei fare in modo che mentre sta
    giocando il pc, la pressione del tasto da parte dell'utente non generi alcun evento.

    Dado
    
    package giocodatiinterattivo;
    
    public class Dado {
    	
    	private int[] valori;
    	
    	public Dado() {
    		valori = new int[6];
    		valori[0] = 1;
    		valori[1] = 2;
    		valori[2] = 3;
    		valori[3] = 4;
    		valori[4] = 5;
    		valori[5] = 6;
    	}
    	
    	public int getNumeroCasuale() {
    		int indice = (int) (Math.random()*6);
    		return valori[indice];
    	}
    }
    
    Game
    
    package giocodatiinterattivo;
    
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    @SuppressWarnings("serial")
    public class Game extends JFrame {
    	
    	private JButton tiraDado;
    	private JLabel datiGioco;
    	private JPanel northPanel;
    	private JPanel centralPanel;
    	private JPanel southPanel;
    	private JTextArea textArea;
    	private MyListener listener;
    	private Partita partita;
    	private Giocatore giocatoreA;
    	private Giocatore giocatoreB;
    	private Interfaccia interfaccia;
    	private Dado dado;
    	
    	public static void main(String[]args) {
    		java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Game().setVisible(true);
                }
            });
    	}
    	
    	public Game() {
    		System.out.println("NUOVA PARTITA\n");
    		initComponents();
    	}
    	
    	public void initComponents() {
            
            //Inizializzo i dati per il gioco
    		
            dado = new Dado();
            giocatoreA = new Giocatore("Andrea",dado);
            giocatoreB = new Giocatore("Loris",dado);
            Partita partita = new Partita(giocatoreA,giocatoreB);
            interfaccia = new Interfaccia(this,partita);
            partita.setInterfaccia(interfaccia);
            
            //Inizializzo i dati per l'interfaccia 
            
            Container c = this.getContentPane();
            c.setLayout(new BorderLayout());
            
            tiraDado = new JButton("Tira Dado");
            datiGioco = new JLabel();
            textArea = new JTextArea("Andamento del gioco\n");
            textArea.setEditable(false); 
            
            listener = new MyListener(this,partita);
            tiraDado.addActionListener(listener);
            
            northPanel = new JPanel();
            centralPanel = new JPanel();
            southPanel = new JPanel();
            
            northPanel.setPreferredSize(new Dimension(300,50));
            centralPanel.setPreferredSize(new Dimension(300,200));
            southPanel.setPreferredSize(new Dimension(300,50));
            
            northPanel.setLayout(new BorderLayout());
            centralPanel.setLayout(new BorderLayout());
            southPanel.setLayout(new BorderLayout());
            
            northPanel.add(datiGioco, BorderLayout.CENTER);
            centralPanel.add(textArea, BorderLayout.CENTER);
            southPanel.add(tiraDado, BorderLayout.CENTER);
            
            c.add(northPanel, BorderLayout.NORTH);
            c.add(centralPanel, BorderLayout.CENTER);
            c.add(southPanel, BorderLayout.SOUTH);
            
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Dadi - By Stefano Loris");
            setResizable(false);
            setSize(300,300);
            setVisible(true);
    	}
    	
    	public Partita getPartita() {
    		return partita;
    	}
    	
    	public JLabel getLabelDatiGioco() {
    		return datiGioco;
    	}
    	
    	public JTextArea getTextArea() {
    		return textArea;
    	}
    	
    	public JButton getButton() {
    		return tiraDado;
    	}
    }
    
    Giocatore
    
    package giocodatiinterattivo;
    
    public class Giocatore {
    	
    	private String nome;
    	private Dado dado;
    	
    	public Giocatore(String nome, Dado dado) {
    		this.nome = nome;
    		this.dado = dado;
    	}
    	
    	public int giocaDado() {
    		int res = dado.getNumeroCasuale();
    		return res;
    	}
    	
    	public String toString() {
    		return nome;
    	}
    }
    
    MyListener
    
    package giocodatiinterattivo;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class MyListener implements ActionListener {
    
    	private Partita partita;
    	private Game game;
    	
    	public MyListener(Game g, Partita p) {
    		partita = p;
    		game = g;
    	}
    	
    	public void actionPerformed(ActionEvent e) {
    		partita.giocoUtente();
    	}
    }
    
    Interfaccia
    
    package giocodatiinterattivo;
    
    public class Interfaccia {
    	
    	private Partita partita;
    	private Game game;
    	
    	public Interfaccia(Game g, Partita p) {
    		game = g;
    		partita = p;
    	}
    	
    	public void aggiornaLabel(String text) {
    		game.getLabelDatiGioco().setText(text);
    	}
    	
    	public void aggiornaTextArea(String text) {
    		game.getTextArea().append(text);
    	}
    	
    	public void aggiornaButton(String text) {
    		game.getButton().setText(text);
    	}
    	
    	public void setButtonEnabled() {
    		game.getButton().setEnabled(true);
    	}
    	
    	public void setButtonNotEnabled() {
    		game.getButton().setEnabled(false);
    	}
    }
    
    Partita
    
    package giocodatiinterattivo;
    
    import javax.swing.JOptionPane;
    
    public class Partita {
    
    	private int turniPassati;          
        private Giocatore giocatoreA;
        private Giocatore giocatoreB;
        private int puntiA;
        private int puntiB;
        private int giocataA;
        private int giocataB;
        private Interfaccia interfaccia;
        private int turno;                 //0: turno computer, 1: turno utente
        private boolean userHavePlayed;
    	
    	public Partita(Giocatore a, Giocatore b) {
    		turniPassati = 0;
        	giocatoreA = a;
        	giocatoreB = b;
        	puntiA = 0;
        	puntiB = 0;
        	giocataA = 0;
        	giocataB = 0;
        	turno = 0;
        	userHavePlayed = false;
        	//Chiamo la routine principale del gioco
        	game();
    	}
    	
    	public void setInterfaccia(Interfaccia interfaccia) {
    		this.interfaccia = interfaccia;
    	}
    	
    	private void game() {
    
    		if (isTurnoComputer()) {
    			/* user non ha giocato (inizio della mano) */
    			if (!userHavePlayed) {
    				giocoPc();
    			}
    			/* user ha già risposto al gioco pc: calcolo punti e vincitore */
    			else {
    				fineMano();
    			}
    		}
    		/* turno user */
    		else {
    			/* user non ha giocato (inizio della mano) */
    			if (!userHavePlayed) {
    				/*
    				 * non accade nulla serve il gioco dell'utente
    				 */
    			}
    			/* user ha giocato e attende risposta pc */
    			else {
    				giocoPc(); /* risposta pc */
    				fineMano(); /* punti e vincitore */
    			}
    		}
    	}
    	
    	private void giocoPc() {
    		//System.out.println("In giocoPc()");
    		int risultato = giocatoreA.giocaDado();
    		turniPassati++;
    		System.out.println("Sono passati " + turniPassati + " turni.");
    		//interfaccia.aggiornaTextArea("Il computer tira il dado ed ottiene " + risultato);
    		System.out.println("Il computer tira il dado ed ottiene " + risultato);
    		setPunti(0,risultato);
    		setTurnoUtente();
    	}
    	
    	public void giocoUtente() {
    		//System.out.println("In giocoUtente()");
    		int risultato = giocatoreB.giocaDado();
    		turniPassati++;
    		System.out.println("Sono passati " + turniPassati + " turni.");
    		//interfaccia.aggiornaTextArea("Hai tirato il dado ed hai ottenuto " + risultato);
    		System.out.println("Hai tirato il dado ed hai ottenuto " + risultato);
    		setPunti(1,risultato);
    		setUserHavePlayed();
    		setTurnoPc();
    		game();
    	}
    	
    	//Setta i valori intermedi ottenuti dal lancio del dado
        public void setPunti(int giocatore, int giocata) {
        	if(giocatore == 0) {
        		giocataA = giocata;
        	}
        	if(giocatore == 1) {
        		giocataB = giocata;
        	}
        }
        
      //Sono passati due turni. E' finita la mano. Aggiorna il punteggio dei giocatori.
        public void fineMano() {
        	
        	if(giocataA == giocataB) {
        		//interfaccia.aggiornaTextArea("Pareggio");
        		System.out.println("\nPareggio\n");
        		giocataA = 0;
        		giocataB = 0;   	
        		checkPartita();
        		userHavePlayed = false;
        	}
        	if(giocataA > giocataB) {
        		//interfaccia.aggiornaTextArea("\nVince la mano il giocatore " + giocatoreA.toString() + "\n");
        		System.out.println("\nIl computer ha vinto la mano.\n");
        		puntiA++;
        		giocataA = 0;
        		giocataB = 0;	
        		checkPartita();
        		userHavePlayed = false;
        	}
        	if(giocataA < giocataB) {
        		//interfaccia.aggiornaTextArea("\nVince la mano il giocatore " + giocatoreB.toString() + "\n");
        		System.out.println("\nHai vinto la mano.\n");
        		puntiB++;
        		giocataA = 0;
        		giocataB = 0;
        		checkPartita();
        		userHavePlayed = false;
        	}
        	
        	//Richiamo la routine principale del gioco
        	game();
        }
        
        private void checkPartita() {
        	if(this.getTurniPassati() == 10) {
    			decretaVincitore();		
    			int risposta = JOptionPane.showConfirmDialog(null,"Vuoi fare una nuova partita?",
    					"Fine Partita",JOptionPane.YES_NO_OPTION);
    			if(risposta == JOptionPane.YES_OPTION) {
    				Game game = new Game();
    			}
    			if(risposta == JOptionPane.NO_OPTION) {
    				System.exit(0);
    			}
    		}
        }
        
        //La partita è finita. Stampa il vincitore
        public void decretaVincitore() {
        	if(puntiA == puntiB) {
        		//interfaccia.aggiornaLabel("Pareggio!");
        		System.out.println("Pareggio\n");
        	}
        	if(puntiA > puntiB) {
        		//interfaccia.aggiornaLabel("Vince il giocatore: " + giocatoreA.toString() + " " + puntiA + " a " + puntiB);
        		System.out.println("Vince il computer " + puntiA + " a " + puntiB + "\n");
        	}
        	else
        		//interfaccia.aggiornaLabel("Vince il giocatore: " + giocatoreB.toString() + " " + puntiB + " a " + puntiA);
        		System.out.println("Hai vinto " + puntiB + " a " + puntiA + "\n");
        }
        
        public void setUserHavePlayed() {
        	userHavePlayed = true;
        }
        
        private int getTurniPassati() {
        	return turniPassati;
        }
        
        public Interfaccia getInterfaccia() {
        	return interfaccia;
        }
        
        private void setTurnoUtente() {
        	turno = 1;
        }
        
        private void setTurnoPc() {
        	turno = 0;
        }
        
        public boolean isTurnoComputer() {
        	return turno == 0;
        }
    }
    
    Aggiornamento: Ora il gioco va, solo che non riesco ad interagire con la grafica. Quello che stampo vorrei che fosse mostrato nella JTextArea.
  • Re: Rendere interattivo un giochino

    Fai un metodo per far giocare il computer ed uno per il turno umano.
    Cosicché mentre è il turno del PC all'interno del listener fai un if dove puoi specificare che sei il turno è del computer non deve far nulla.
  • Re: Rendere interattivo un giochino

    Il computer gioca istantaneamente. A quanto pare non serve più. L'unico problema che ho è che non so come modificare la grafica runtime.
  • Re: Rendere interattivo un giochino

    Che grafica devi modificare?

    Ciao
  • Re: Rendere interattivo un giochino

    Ma l'hai visto il codice? C'è la classe Game che estende JFrame. Essa è composta essenzialmente
    da una JLabel, una JTextArea ed un JButton. Il JButton lo uso per tirare il dado, e funziona. Però mentre il gioco è in corso, vorrei mostrare l'andamento della partita all'interno della JTextArea. Se dai un'occhiata alla classe Partita, noterai alcune System.out.println(...). Quello che ora io stampo vorrei invece appenderlo alla JTextArea.
  • Re: Rendere interattivo un giochino

    Se lo vuoi fare in tempo reale devi usare i Thread.
    Se invece il tuo problema è solo appendere i risultati alla JTextArea basta fare
    
    textArea.append(text + newline);
    
    dove newline è una variabile:
    
    string newline = "\n";
    
    Ciao
  • Re: Rendere interattivo un giochino

    Ho visto il codice.
    prima di tutto c'è un errore quanto una casa in Game
    
        package giocodatiinterattivo;
    
        import java.awt.BorderLayout;
        import java.awt.Container;
        import java.awt.Dimension;
        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        import javax.swing.JTextArea;
    
        @SuppressWarnings("serial")
        public class Game extends JFrame {
           
           private JButton tiraDado;
           private JLabel datiGioco;
           private JPanel northPanel;
           private JPanel centralPanel;
           private JPanel southPanel;
           private JTextArea textArea;
           private MyListener listener;
           private Partita partita;   //OK
           private Giocatore giocatoreA;
           private Giocatore giocatoreB;
           private Interfaccia interfaccia;
           private Dado dado;
           
           public static void main(String[]args) {
              java.awt.EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        new Game().setVisible(true);
                    }
                });
           }
           
           public Game() {
              System.out.println("NUOVA PARTITA\n");
              initComponents();
           }
           
           public void initComponents() {
               
                //Inizializzo i dati per il gioco
              
                dado = new Dado();
                giocatoreA = new Giocatore("Andrea",dado);
                giocatoreB = new Giocatore("Loris",dado);
               
                Partita partita = new Partita(giocatoreA,giocatoreB);  //ERRORE
                
                partita = new Partita(giocatoreA,giocatoreB);  //OK
    
                interfaccia = new Interfaccia(this,partita);
                partita.setInterfaccia(interfaccia);
               
                //Inizializzo i dati per l'interfaccia
               
                Container c = this.getContentPane();
                c.setLayout(new BorderLayout());
               
                tiraDado = new JButton("Tira Dado");
                datiGioco = new JLabel();
                textArea = new JTextArea("Andamento del gioco\n");
                textArea.setEditable(false);
               
                listener = new MyListener(this,partita);
                tiraDado.addActionListener(listener);
               
                northPanel = new JPanel();
                centralPanel = new JPanel();
                southPanel = new JPanel();
               
                northPanel.setPreferredSize(new Dimension(300,50));
                centralPanel.setPreferredSize(new Dimension(300,200));
                southPanel.setPreferredSize(new Dimension(300,50));
               
                northPanel.setLayout(new BorderLayout());
                centralPanel.setLayout(new BorderLayout());
                southPanel.setLayout(new BorderLayout());
               
                northPanel.add(datiGioco, BorderLayout.CENTER);
                centralPanel.add(textArea, BorderLayout.CENTER);
                southPanel.add(tiraDado, BorderLayout.CENTER);
               
                c.add(northPanel, BorderLayout.NORTH);
                c.add(centralPanel, BorderLayout.CENTER);
                c.add(southPanel, BorderLayout.SOUTH);
               
                setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
                setTitle("Dadi - By Stefano Loris");
                setResizable(false);
                setSize(300,300);
                setVisible(true);
           }
           
           public Partita getPartita() {
              return partita;
           }
           
           public JLabel getLabelDatiGioco() {
              return datiGioco;
           }
           
           public JTextArea getTextArea() {
              return textArea;
           }
           
           public JButton getButton() {
              return tiraDado;
           }
        }
    
    Ho marcato i campi con i tag OK e ERRORE
    Se tu dichiari la varibile partita è inutile che in initComponents chiami
    
    Partita partita = new Partita(giocatoreA,giocatoreB);  
    
    perché in tal caso quanto ti andrai a richiamare partita ti ritornerà un errore di NullPointerException

    Per quello che vuoi fare tu ho modificato due sorgenti (più questo errore di prima)
    di Seguito:

    MyListener
    
    package giocodatiinterattivo;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class MyListener implements ActionListener {
    
       private Partita partita;
       private Game game;
       
       public MyListener(Game g, Partita p) {
          partita = p;
          game = g;
       }
       
       public void actionPerformed(ActionEvent e) {
          partita.giocoUtente();
          game.getTextArea().setText(partita.getBuffer().toString());
          game.getTextArea().setCaretPosition(partita.getBuffer().toString().length());
       }
    }
    
    Partita
    
    package giocodatiinterattivo;
    
    import javax.swing.JOptionPane;
    
    public class Partita {
    
       private int turniPassati;         
        private Giocatore giocatoreA;
        private Giocatore giocatoreB;
        private int puntiA;
        private int puntiB;
        private int giocataA;
        private int giocataB;
        private Interfaccia interfaccia;
        private int turno;                 //0: turno computer, 1: turno utente
        private boolean userHavePlayed;
        private StringBuffer sbf=new StringBuffer(200);
       
       public Partita(Giocatore a, Giocatore b) {
          turniPassati = 0;
          
           giocatoreA = a;
           giocatoreB = b;
           puntiA = 0;
           puntiB = 0;
           giocataA = 0;
           giocataB = 0;
           turno = 0;
           userHavePlayed = false;
           //Chiamo la routine principale del gioco
           game();
       }
       
       public void setInterfaccia(Interfaccia interfaccia) {
          this.interfaccia = interfaccia;
       }
       
       private void game() {
    
          if (isTurnoComputer()) {
             /* user non ha giocato (inizio della mano) */
             if (!userHavePlayed) {
                giocoPc();
             }
             /* user ha già risposto al gioco pc: calcolo punti e vincitore */
             else {
                fineMano();
             }
          }
          /* turno user */
          else {
             /* user non ha giocato (inizio della mano) */
             if (!userHavePlayed) {
                /*
                 * non accade nulla serve il gioco dell'utente
                 */
             }
             /* user ha giocato e attende risposta pc */
             else {
                giocoPc(); /* risposta pc */
                fineMano(); /* punti e vincitore */
             }
          }
       }
       
       private void giocoPc() {
          //System.out.println("In giocoPc()");
          int risultato = giocatoreA.giocaDado();
          turniPassati++;
          sbf.append("Sono passati " + turniPassati + " turni.\n");
          System.out.println("Sono passati " + turniPassati + " turni.");
          //interfaccia.aggiornaTextArea("Il computer tira il dado ed ottiene " + risultato);
          sbf.append("Il computer tira il dado ed ottiene " + risultato+"\n");
          System.out.println("Il computer tira il dado ed ottiene " + risultato);
          setPunti(0,risultato);
          setTurnoUtente();
       }
       
       public void giocoUtente() {
          //System.out.println("In giocoUtente()");
          int risultato = giocatoreB.giocaDado();
          turniPassati++;
          sbf.append("Sono passati " + turniPassati + " turni.\n");
          System.out.println("Sono passati " + turniPassati + " turni.");
          //interfaccia.aggiornaTextArea("Hai tirato il dado ed hai ottenuto " + risultato);
          sbf.append("Hai tirato il dado ed hai ottenuto " + risultato+"\n");
          System.out.println("Hai tirato il dado ed hai ottenuto " + risultato);
          setPunti(1,risultato);
          setUserHavePlayed();
          setTurnoPc();
          game();
       }
       
       public StringBuffer getBuffer(){
       		return sbf;
       }
       
       //Setta i valori intermedi ottenuti dal lancio del dado
        public void setPunti(int giocatore, int giocata) {
           if(giocatore == 0) {
              giocataA = giocata;
           }
           if(giocatore == 1) {
              giocataB = giocata;
           }
        }
       
      //Sono passati due turni. E' finita la mano. Aggiorna il punteggio dei giocatori.
        public void fineMano() {
           
           if(giocataA == giocataB) {
              //interfaccia.aggiornaTextArea("Pareggio");
              System.out.println("\nPareggio\n");
              giocataA = 0;
              giocataB = 0;      
              checkPartita();
              userHavePlayed = false;
           }
           if(giocataA > giocataB) {
              //interfaccia.aggiornaTextArea("\nVince la mano il giocatore " + giocatoreA.toString() + "\n");
              System.out.println("\nIl computer ha vinto la mano.\n");
              puntiA++;
              giocataA = 0;
              giocataB = 0;   
              checkPartita();
              userHavePlayed = false;
           }
           if(giocataA < giocataB) {
              //interfaccia.aggiornaTextArea("\nVince la mano il giocatore " + giocatoreB.toString() + "\n");
              System.out.println("\nHai vinto la mano.\n");
              puntiB++;
              giocataA = 0;
              giocataB = 0;
              checkPartita();
              userHavePlayed = false;
           }
           
           //Richiamo la routine principale del gioco
           game();
        }
       
        private void checkPartita() {
           if(this.getTurniPassati() == 10) {
             decretaVincitore();      
             int risposta = JOptionPane.showConfirmDialog(null,"Vuoi fare una nuova partita?",
                   "Fine Partita",JOptionPane.YES_NO_OPTION);
             if(risposta == JOptionPane.YES_OPTION) {
                Game game = new Game();
             }
             if(risposta == JOptionPane.NO_OPTION) {
                System.exit(0);
             }
          }
        }
       
        //La partita è finita. Stampa il vincitore
        public void decretaVincitore() {
           if(puntiA == puntiB) {
              //interfaccia.aggiornaLabel("Pareggio!");
              System.out.println("Pareggio\n");
           }
           if(puntiA > puntiB) {
              //interfaccia.aggiornaLabel("Vince il giocatore: " + giocatoreA.toString() + " " + puntiA + " a " + puntiB);
              System.out.println("Vince il computer " + puntiA + " a " + puntiB + "\n");
           }
           else
              //interfaccia.aggiornaLabel("Vince il giocatore: " + giocatoreB.toString() + " " + puntiB + " a " + puntiA);
              System.out.println("Hai vinto " + puntiB + " a " + puntiA + "\n");
        }
       
        public void setUserHavePlayed() {
           userHavePlayed = true;
        }
       
        private int getTurniPassati() {
           return turniPassati;
        }
       
        public Interfaccia getInterfaccia() {
           return interfaccia;
        }
       
        private void setTurnoUtente() {
           turno = 1;
        }
       
        private void setTurnoPc() {
           turno = 0;
        }
       
        public boolean isTurnoComputer() {
           return turno == 0;
        }
    }
    
    In Partita ho creato uno StringBuffer che per inserire queste info.
    E poi ho creato un get per farmelo tornare.

    Cmq copia i tre sorgenti e dovrebbe fare quanto vuoi.

    Utimo appunto inserisci un JScrollPane e ad esso includi il componente textare così anche se i commenti vanno verso il basso con la barra puoi spostarti...
    Ovviamente tutto il processo è migliorabile, ma quello sono sicuro puoi pensarci te..

    Ciao
  • Re: Rendere interattivo un giochino

    L'errore di Game era di copia-incolla, altrimenti me ne sarei accorto
    Hai ragione per lo scroller, non ci avevo pensato
    Ora vedo il codice..

    Ok, ho apportato le modifiche. C'è un piccolo dettaglio però. Non riesco a scrivere il vincitore nella JTextArea.
    
    public void decretaVincitore() {
        	if(puntiA == puntiB) {
        		sbf.append("Pareggio\n");
        	}
        	if(puntiA > puntiB) {
        		sbf.append("Vince il computer " + puntiA + " a " + puntiB + "\n");
        	}
        	else
        		sbf.append("Hai vinto " + puntiB + " a " + puntiA + "\n");
        }
    
    Questa roba non appare, perché non viene svuotato dal listener suppongo..
  • Re: Rendere interattivo un giochino

    Certo...
    aggiungi lo stringbuffer anche su decreta vincitore...
    però è sbaglito che ti crei un'altra finestra alla fine del processo...
  • Re: Rendere interattivo un giochino

    Ho risolto tramite JOptionPane in decretaVincitore(). Anche se quando c'è il pareggio, esce prima una finestra con scritto pareggio, e dopo aver premuto ok, esce fuori una finestra con scritto "hai vinto 5 a 5 (ad esempio xD)", poi esce quella che ti chiede se vuoi rigiocare o meno.

    Non ho capito a cosa ti riferisci con la nuova finestra. E' errato fare Game game = new Game()?

    Ps: ho fatto una modifica. Ho aggiunto Game a partita.

    Da Game faccio:
    
    partita.setGame(this);
    
    E in Partita ho:
    
    private Game game;
    
    ...
    
    public void setGame(Game game) {
    		this.game = game;
    	}
    
    In modo tale che posso chiudere il game corrente tramite game.dispose().

    Aggiornamento: ho risolto. Il problema era in decretaVincitore(). Ho sostituito l'ultimo else con un if.
  • Re: Rendere interattivo un giochino

    Allora, questo è il codice di cui dispongo ora:

    Dado
    
    package giocodadi;
    
    public class Dado {
    	
    	private int[] valori;
    	
    	public Dado() {
    		valori = new int[6];
    		valori[0] = 1;
    		valori[1] = 2;
    		valori[2] = 3;
    		valori[3] = 4;
    		valori[4] = 5;
    		valori[5] = 6;
    	}
    	
    	public int getNumeroCasuale() {
    		int indice = (int) (Math.random()*6);
    		return valori[indice];
    	}
    }
    
    Game
    
    package giocodadi;
    
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    
    @SuppressWarnings("serial")
    public class Game extends JFrame {
    	
    	private JButton tiraDado;
    	private JTextArea textArea;
    	private JPanel mainPanel;
    	private Grid grid;
    	private JPanel rightPanel;
    	private JScrollPane textAreaScroller;
    	private JScrollPane gridScroller;
    	private MyListener listener;
    	private Partita partita;
    	private Giocatore giocatoreA;
    	private Giocatore giocatoreB;
    	
    	public static void main(String[]args) {
    		//Creo la GUI nell'EDT
    		java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Game().setVisible(true);
                }
            });
    	}
    	
    	public Game() {
    		initComponents();
    	}
    	
    	public void initComponents() {
            
            //Inizializzo i dati per il gioco
    		
            Dado dado = new Dado();
            giocatoreA = new Giocatore("Andrea",dado);
            giocatoreB = new Giocatore("Loris",dado);
            partita = new Partita(giocatoreA,giocatoreB);
            partita.setGame(this);
            
            //Inizializzo i dati della gui 
            
            Container c = this.getContentPane();
            
            tiraDado = new JButton("Inizia Partita");
            textArea = new JTextArea("Andamento del gioco\n");
            textArea.setEditable(false); 
            textAreaScroller = new JScrollPane(textArea);
            
            textArea.setText("NUOVA PARTITA");
            
            listener = new MyListener(this,partita);
            tiraDado.addActionListener(listener);
            
            //Approccio top-down
            
            mainPanel = new JPanel(new BorderLayout());
            grid = new Grid();
            rightPanel = new JPanel(new BorderLayout());
            gridScroller = new JScrollPane(grid);
            
            rightPanel.add(textAreaScroller, BorderLayout.NORTH);
            rightPanel.add(tiraDado, BorderLayout.SOUTH);        
            mainPanel.add(gridScroller, BorderLayout.WEST);
            mainPanel.add(rightPanel, BorderLayout.EAST);
            
            textAreaScroller.setPreferredSize(new Dimension(200,220));
            rightPanel.setPreferredSize(new Dimension(200,250));
            grid.setPreferredSize(new Dimension(200,300));
            tiraDado.setPreferredSize(new Dimension(200,50));
            
            c.add(mainPanel);
            
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setTitle("JDadi - By Stefano Loris");
            setResizable(false);
            setSize(420,300);
            setLocationRelativeTo(null);
            setVisible(true);
    	}
    	
    	public void setButtonText(String text) {
    		tiraDado.setText(text);
    	}
    	
    	public void setAreaText(String text) {
    		textArea.setText(text);
    	}
    	
    	public void setCaretPosition(int position) {
    		textArea.setCaretPosition(position);
    	}
    	
    	public String getButtonText() {
    		return tiraDado.getText();
    	}
    }
    
    Giocatore
    
    package giocodadi;
    
    public class Giocatore {
    
    	private final Dado dado;
    	private final String nome;
    	private int punti;  
    	private int giocata;
    
    	public Giocatore(String nome, Dado dado) {
    		this.dado = dado;
    		this.nome = nome;
    	}
    
    	// Tira il dado e si salva il punteggio della giocata.
    	public void gioca() {
    		giocata += dado.getNumeroCasuale();
    	}
    
    	public void resetGiocata() {
    		giocata = 0;
    	}
    
    	@Override
    	public String toString() {
    		return nome;
    	}
    
    	public int getPunti() {
    		return punti;
    	}
    
    	public void setPunti(int punti) {
    		this.punti = punti;
    	}
    
    	public void addPunti(int punti) {
    		this.punti += punti;
    	}
    
    	public int getGiocata() {
    		return giocata;
    	}
    
    	public void setGiocata(int giocata) {
    		this.giocata = giocata;
    	}
    
    	public void addGiocata(int giocata) {
    		this.giocata += giocata;
    	}
    }
    
    Grid
    
    package giocodadi;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import javax.swing.BorderFactory;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class Grid extends JPanel {
    
    	private JLabel[][] labels = new JLabel[20][2];
    	
    	public Grid() {
    		
    		for(int i=0; i<labels.length; i++) {
    			for(int j=0; j<labels[0].length; j++) {
    				labels[i][j] = new JLabel();
    				labels[i][j].setPreferredSize(new Dimension(60,60));
    				labels[i][j].setBorder(BorderFactory.createLineBorder(Color.black));
    			}
    		}
    		
    		GridBagLayout layout = new GridBagLayout();
    		GridBagConstraints lim = new GridBagConstraints();
    		setLayout(layout);
    		
    		//gridx = colonna, gridy = riga.
    		//weightx e weighty servono per sfruttare lo spazio in eccesso.
    		//weightx per il peso orizzontale, weighty per il peso verticale.
    		lim.gridx = 0;
    		lim.gridy = 0;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[0][0], lim);
    		add(labels[0][0]);
    		
    		lim.gridx = 1;
    		lim.gridy = 0;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[0][1], lim);
    		add(labels[0][1]);
    		
    		lim.gridx = 0;
    		lim.gridy = 1;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[1][0], lim);
    		add(labels[1][0]);
    		
    		lim.gridx = 1;
    		lim.gridy = 1;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[1][1], lim);
    		add(labels[1][1]);
    		
    		lim.gridx = 0;
    		lim.gridy = 2;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[2][0], lim);
    		add(labels[2][0]);
    		
    		lim.gridx = 1;
    		lim.gridy = 2;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[2][1], lim);
    		add(labels[2][1]);
    		
    		lim.gridx = 0;
    		lim.gridy = 3;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[3][0], lim);
    		add(labels[3][0]);
    		
    		lim.gridx = 1;
    		lim.gridy = 3;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[3][1], lim);
    		add(labels[3][1]);
    		
    		lim.gridx = 0;
    		lim.gridy = 4;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[4][0], lim);
    		add(labels[4][0]);
    		
    		lim.gridx = 1;
    		lim.gridy = 4;
    		lim.weightx = 1;
    		lim.weighty = 1;
    		layout.setConstraints(labels[4][1], lim);
    		add(labels[4][1]);
    	}
    }
    
    MyListener
    
    package giocodadi;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class MyListener implements ActionListener {
    	
    	private Game game;
    	private Partita partita;
    	
    	public MyListener(Game game, Partita partita) {
    		this.game = game;
    		this.partita = partita;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if(!game.getButtonText().equals("Tira Dado")) {
    			game.setButtonText("Tira Dado");
    		}
    		partita.giocoUtente();
    		game.setAreaText(partita.getBuffer().toString());
    	    game.setCaretPosition(partita.getBuffer().toString().length());
    	}
    }
    
    Partita
    
    package giocodadi;
    
    import javax.swing.JOptionPane;
    
    public class Partita {
    
    	private int turniGioco = 5;
    	private int turniGiocoC = 1;
    	private Game game;
    	private int turno;
    	private boolean userHavePlayed;
    	private StringBuffer sbf = new StringBuffer(200);
    	private final Giocatore giocatoreA;
    	private final Giocatore giocatoreB;
    
    	public Partita(Giocatore gA, Giocatore gB) {
    		giocatoreA = gA;
    		giocatoreB = gB;
    		userHavePlayed = false;
    		//Chiamo la routine di gioco principale
    		game();
    	}
    	
    	public void game() {
    		if (isTurnoComputer()) {
    			/* user non ha giocato (inizio della mano) */
    			if (!userHavePlayed) {
    				giocoPc();
    			}
    			/* user ha già risposto al gioco pc: calcolo punti e vincitore */
    			else {
    				fineMano();
    			}
    		}
    		/* turno user */
    		else {
    			/* user non ha giocato (inizio della mano) */
    			if (!userHavePlayed) {
    				 //Non accade nulla. Serve il gioco dell'utente
    			}
    			/* user ha giocato e attende risposta pc */
    			else {
    				giocoPc();  /* risposta pc */
    				fineMano(); /* punti e vincitore */
    			}
    		}
    	}
    	
    	public void giocoUtente() {
    		giocatoreB.gioca();
    		sbf.append("Hai ottenuto " + giocatoreB.getGiocata() + "\n");
    		userHavePlayed = true;
    		setTurnoPc();
    		//Chiamo la routine del gioco principale
    		game();
    	}
    
    	public void giocoPc() {
    		giocatoreA.gioca();
    		sbf.append("Il computer ha ottenuto " + giocatoreA.getGiocata() + "\n");
    		setTurnoUtente();
    	}
    
    	private void fineMano() {
    		if(giocatoreA.getGiocata() == giocatoreB.getGiocata()) {
    			resetMano("\nPareggio\n\n");
        	}
        	if(giocatoreA.getGiocata() > giocatoreB.getGiocata()) {
        		giocatoreA.addPunti(1);
        		resetMano("\nIl computer ha vinto la mano.\n\n");
        	}
        	if(giocatoreA.getGiocata() < giocatoreB.getGiocata()) {
        		giocatoreB.addPunti(1);
        		resetMano("\nHai vinto la mano.\n\n");
        	}
    		turniGiocoC++;		
    		//Chiamo la routine di gioco principale
    		game();
    	}
    	
    	private void resetMano(String text) {
    		checkPartita();
    		sbf.append(text);
    		giocatoreA.resetGiocata();
    		giocatoreB.resetGiocata();
    		userHavePlayed = false;
    	}
    	
    	private void checkPartita() {
    		if(turniGioco == turniGiocoC) {
    			decretaVincitore();		
    			int risposta = JOptionPane.showConfirmDialog(null,"Vuoi fare una nuova partita?",
    					"Fine Partita",JOptionPane.YES_NO_OPTION);
    			if(risposta == JOptionPane.YES_OPTION) {
    				game.dispose();
    				@SuppressWarnings("unused")
    				Game game = new Game();
    			}
    			if(risposta == JOptionPane.NO_OPTION) {
    				System.exit(0);
    			}
    		}
    	}
    	
    	private void decretaVincitore() {
    		if(giocatoreA.getPunti() == giocatoreB.getPunti()) {
        		JOptionPane.showMessageDialog(null, "PAREGGIO!");
        	}
        	if(giocatoreA.getPunti() > giocatoreB.getPunti()) {
        		JOptionPane.showMessageDialog(null, "Vince il computer " + giocatoreA.getPunti() + " a " + giocatoreB.getPunti());
        	}
        	if(giocatoreA.getPunti() < giocatoreB.getPunti()) {
        		JOptionPane.showMessageDialog(null, "Hai vinto " + giocatoreB.getPunti() + " a " + giocatoreA.getPunti());
        	}
    	}
    	
    	private boolean isTurnoComputer() {
    		return turno == 0;
    	}
    	
    	private void setTurnoUtente() {
    		turno = 1;
    	}
    
    	private void setTurnoPc() {
    		turno = 0;
    	}
    	
    	public void setGame(Game g) {
    		game = g;
    	}
    	
    	public StringBuffer getBuffer() {
    		return sbf;
    	}
    }
    
    Come vedete ho inserito una griglia. Vorrei fare in modo che in una colonna compaiano le facce dei dadi giocati dal computer, e nell'altra quelle del giocatore. Magari colorando di verde il bordo della cella corrispondente al vincitore della mano.
    Il comportamento dovrebbe essere questo (ad esempio):
    1) Gioca il computer, compare la faccia del dado ottenuta.
    2) Attesa del mio lancio.
    3) Tiro il dado e compare la faccia del dado che ho ottenuto di fianco a quella del computer.
    4) Il bordo della cella relativa al dado vincente si colora di verde.
    Si ricomincia dal punto 1.

    Per come è strutturato ora il programma non so esattamente come fare. Qualche consiglio?
  • Re: Rendere interattivo un giochino

    Come vedete ho inserito una griglia. Vorrei fare in modo che in una colonna compaiano le facce dei dadi giocati dal computer, e nell'altra quelle del giocatore. Magari colorando di verde il bordo della cella corrispondente al vincitore della mano.
    Il comportamento dovrebbe essere questo (ad esempio):
    1) Gioca il computer, compare la faccia del dado ottenuta.
    2) Attesa del mio lancio.
    3) Tiro il dado e compare la faccia del dado che ho ottenuto di fianco a quella del computer.
    4) Il bordo della cella relativa al dado vincente si colora di verde.
    Si ricomincia dal punto 1.

    Per come è strutturato ora il programma non so esattamente come fare. Qualche consiglio?
    non è che sia proprio semplice.
    ti dovrai creare una JFrame che riceve i dati dalla classi che simulano il lancio del dado e opera il controllo.
    Consiglio di che? costruisciti il JFrame interfaccialo come detto prima..se poi hai problemi posta...
  • Re: Rendere interattivo un giochino

    L'ho realizzato, ma il codice è orribile. Ci apro un'altra discussione che è meglio
Devi accedere o registrarti per scrivere nel forum
14 risposte