Ragazzi ho fatto un programmino in cui l'utente gioca a dadi con il computer. Ad ogni turno, chi ottiene il lancio migliore ottiene un punto. Dopo 10 turni chi ha più punti vince.
Tralasciando che il codice che ho buttato giù non mi piace, perché ho capacità progettuali schifose (quindi si accettano consigli), vorrei trovare un modo elegante per aggiornare la grafica (testo della JLabel e della JTextArea) per mostrare all'utente l'andamento del gioco.
Nella classe partita trovate una bozza di utilizzo di SwingWorker, che non so usare

Il codice è questo:

Dado

codice:
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];
	}
}
Interfaccia

codice:
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);
	}
}
Messaggio

Questa classe nel codice non ancora la utilizzo, però volevo usarla per aggiornare la
grafica tramite il metodo "aggiornaGrafica()" presente nella classe Partita.

codice:
package giocodatiinterattivo;

public class Messaggio {
	
	private String mex;  //Testo 
	private int id;      //Identifica quale componente grafico aggiornare
	
	public void setMessaggio(String mex) {
		this.mex = mex;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getMex() {
		return mex;
	}
	
	public int getId() {
		return id;
	}
}
Giocatore

codice:
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

codice:
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

codice:
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;
	}
}
Partita

codice:
package giocodatiinterattivo;

import javax.swing.JOptionPane;
import javax.swing.SwingWorker;

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 Messaggio messaggio;
	
	public Partita(Giocatore a, Giocatore b) {
		turniPassati = 0;
    	giocatoreA = a;
    	giocatoreB = b;
    	puntiA = 0;
    	puntiB = 0;
    	giocataA = 0;
    	giocataB = 0;
    	turno = 0;
    	userHavePlayed = false;
    	messaggio = new Messaggio();
    	//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() {
		int risultato = giocatoreA.giocaDado();
		turniPassati++;
		System.out.println("Il computer tira il dado ed ottiene " + risultato);
		setPunti(0,risultato);
		setTurnoUtente();
	}
	
	public void giocoUtente() {
		int risultato = giocatoreB.giocaDado();
		turniPassati++;
		System.out.println("Hai tirato il dado ed hai ottenuto " + risultato);
		setPunti(1,risultato);
		setUserHavePlayed();
		setTurnoPc();
		//Chiamo la routine del gioco principale
		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");
    }
    
    private void aggiornaMessaggio(int id, String mex) {
    	messaggio.setId(id);
    	messaggio.setMessaggio(mex);
    }
    
	private void aggiornaGrafica() {

		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {

			@Override
			protected Void doInBackground() throws Exception {
				if(messaggio.getId() == 1) {
					//Devo modificare la JTextArea
					interfaccia.aggiornaTextArea(messaggio.getMex());
				}
				if(messaggio.getId() == 0) {
					//Devo modificare la JLabel
					interfaccia.aggiornaLabel(messaggio.getMex());
				}
				return null;
			}
		};
		worker.execute();
	}
    
    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;
    }
}
C'è anche un problema logico. Quando l'utente sceglie di fare una nuova partita, il computer tira due volte il dado. Vi prego mi servono consigli