Ciao a tutti!
Sto svolgendo il seguente esercizio:
"Scrivere un programma Java dotato di interfaccia grafica che implementa una slot machine a 5 dischi ciascuno dotato di 10 simoboli dallo 0 al 9. Il giocatore inizia la partita con un credito pari a 100. Ogni giocata costa 1 credito.
Le combinazioni danno il punteggio positivo o negativo:
9 9 9 9 9 -> +100
8 8 8 8 8 -> +75
7 7 7 7 7 -> +50
6 6 6 6 6 -> -50
5 5 5 5 5 -> -75
0 0 0 0 0 -> -100
Coppia di numeri uguali -> +10
Tris di numeri uguali -> +20
Coppia di numeri uguale e tris di numeri uguali (full) -> +30
Numeri uguali nelle posizioni 0 2 4 e numeri uguali nelle posizioni 1 e 3 -> +40
Scala dalla posizione 0 a quella 4 -> Raddoppio del credito
Scala dalla posizione 4 a quella 0 -> Dimezzamento del credito
Il gioco termina quando il giocatore perde tutto o preme l'apposito pulsante.
Realizzare la simulazione dei dischi utilizzando un thread per implementare la rotazione (far variare le velocita' casualmente bloccando prima il disco in posizione 0 ed alla fine quello in posizione 4."
Il codice che ho realizzato finora è questo:
import java.awt.*;
import javax.swing.*;
public class SlotMachineTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
SlotMachineFrame frame = new SlotMachineFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
public class Rullo
{
private int numero;
private int contatore;
public int getNumero()
{
return numero;
}
public void setNumero(int valore)
{
this.numero = valore;
}
public int getContatore ()
{
return contatore;
}
public void setContatore (int c)
{
this.contatore = c;
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SlotMachineFrame extends JFrame
{
public static final int WIDTH = 300;
public static final int HEIGHT = 300;
private JLabel giocatore;
private JLabel creditoGiocatore;
private JLabel domandaPuntata;
private JLabel numero1;
private JLabel numero2;
private JLabel numero3;
private JLabel numero4;
private JLabel numero5;
private JPanel infoGiocatore;
private JPanel menuPuntata;
private JPanel rulli;
private JTextField puntata;
private JButton pulsanteRulli;
private JButton esci;
private int contatore;
public SlotMachineFrame()
{
setTitle("$$$ SLOT MACHINE $$$");
setSize (WIDTH,HEIGHT);
giocatore = new JLabel ("Giocatore: ");
creditoGiocatore = new JLabel("100");
pulsanteRulli = new JButton ("GIOCA!");
domandaPuntata = new JLabel ("Quanto vuoi puntare?");
esci = new JButton ("Esci");
menuPuntata = new JPanel();
puntata = new JTextField(3);
menuPuntata.add(domandaPuntata);
menuPuntata.add(puntata);
add(menuPuntata,BorderLayout.NORTH);
puntata.addActionListener(new inseriscoPuntata());
pulsanteRulli.setEnabled(false);
esci.addActionListener(new ActionListener ()
{
public void actionPerformed (ActionEvent event)
{
System.exit(0);
}
});
infoGiocatore = new JPanel();
infoGiocatore.add(giocatore);
infoGiocatore.add(creditoGiocatore);
infoGiocatore.add(pulsanteRulli);
infoGiocatore.add(esci);
add(infoGiocatore,BorderLayout.SOUTH);
numero1 = new JLabel("0");
numero2 = new JLabel("0");
numero3 = new JLabel("0");
numero4 = new JLabel("0");
numero5 = new JLabel("0");
rulli = new JPanel();
rulli.add(numero1);
rulli.add(numero2);
rulli.add(numero3);
rulli.add(numero4);
rulli.add(numero5);
add(rulli,BorderLayout.CENTER);
//if (pulsanteRulli.isEnabled()==true)
//{
// System.out.println("Hai cliccato GIOCA!");
pulsanteRulli.addActionListener(new cliccoPulsante());
//}
}
private class inseriscoPuntata implements ActionListener
{
public void actionPerformed (ActionEvent event)
{
try
{
int puntataInt = Integer.parseInt(puntata.getText());
int credito = Integer.parseInt(creditoGiocatore.getText());
if (puntataInt <= credito)
{
pulsanteRulli.setEnabled(true);
}
else
{
JOptionPane.showMessageDialog(rootPane, "Non hai abbastanza"
+ "credito!");
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(rootPane, "Valore digitato non"
+ "valido!");
}
}
}
private class cliccoPulsante implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
pulsanteRulli.setEnabled(false);
Rullo rulloNumeriRandom = new Rullo();
rulloNumeriRandom.setContatore(0);
Runnable r = new RulloNumeri(rulloNumeriRandom);
Thread t = new Thread (r);
t.start();
while (t.isAlive())
{
switch (rulloNumeriRandom.getContatore())
{
case 1: numero1.setText(""+rulloNumeriRandom.getNumero());
break;
case 2: numero2.setText(""+rulloNumeriRandom.getNumero());
break;
case 3: numero3.setText(""+rulloNumeriRandom.getNumero());
break;
case 4: numero4.setText(""+rulloNumeriRandom.getNumero());
break;
case 5: numero5.setText(""+rulloNumeriRandom.getNumero());
break;
}
}
pulsanteRulli.setEnabled(true);
}
}
}
public class RulloNumeri implements Runnable
{
private int random;
private Rullo rullo;
private int c=1;
public RulloNumeri (Rullo rulloNumeriRandom)
{
this.rullo = rulloNumeriRandom;
}
public void run()
{
try
{
for (int i=0; i<5; i++)
{
rullo.setContatore(c);
System.out.println("C vale: "+c);
random = (int) (Math.random() * 9) + 1;
rullo.setNumero(random);
System.out.println("numero estratto e': " + rullo.getNumero());
c++;
Thread.sleep((int) (Math.random() * 3000) + 1);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Il problema è questo: vorrei far aggiornare le JLabel "numero" nella classe SlotMachineFrame ogni volta che viene generato un numero casuale dalla random nella classe RulloNumeri (1° numero estratto -> si aggiorna numero1; 2° numero estratto -> si aggiorna numero2 ecc. ecc.). La soluzione dello switch/case che ho usato funziona in parte: le JLabel vengono aggiornate ma tutte assieme, alla conclusione del thread principale. Inoltre, l'intera applicazione si "blocca" durante l'esecuzione del thread, cioè rende impossibile l'esecuzione di qualunque altra azione, ad esempio, la pressione del pulsante "Esci". Il thread, in parole povere, prende il controllo di tutta l'applicazione. Al momento non riesco a trovare una soluzione valida. Qualche suggerimento?
Grazie in anticipo per l'aiuto!