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?