Ho scritto questo codice, che non funziona esattamente bene, nel senso che ogni tanto da come vincitore anche chi non è effettivamente il vincitore
Giocatore
codice:
package GiocoDellaMela;
import java.util.Random;
/*
* Classe che rappresenta un giocatore.
* Il suo scopo è mangiare tutte le mele presenti
* nel suo cesto prima degli altri giocatori.
*/
public class Giocatore implements Runnable {
private String nome;
private Cesto cesto;
private Controllore controllore;
private Random random = new Random();
public Giocatore(String nome, Cesto cesto, Controllore c) {
this.nome = nome;
this.cesto = cesto;
this.controllore = c;
}
public void run() {
while(!cesto.meleFinite()) {
cesto.mangiaMela();
stampa();
attendi();
}
controllore.setStato();
controllore.setVincitore(this.nome);
}
/*
* Simula una pausa random tra una mela mangiata ed un'altra
*/
private 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 void stampa() {
String s = "Il giocatore " + this.nome + " ha mangiato " + cesto.getMeleMangiate() + " mele" + "\n";
System.out.println(s);
}
}
Gestore
codice:
package GiocoDellaMela;
public class Gestore extends Thread {
private static Controllore controllore;
public Gestore() {
controllore = new Controllore();
}
/* Controllo continuo della partita
* per verificare chi è il vincitore.
*/
public void run() {
while(controllore.getStato() == 0) {}
System.out.println("Il vincitore è: " + controllore.getVincitore());
}
public static void main(String[]args) {
Gestore gestore = new Gestore();
Cesto primoCesto = new Cesto(20);
Cesto secondoCesto = new Cesto(20);
Giocatore andrea = new Giocatore("Andrea", primoCesto, controllore);
Giocatore loris = new Giocatore("Loris", secondoCesto, controllore);
Thread andreaThread = new Thread(andrea);
Thread lorisThread = new Thread(loris);
gestore.setPriority(MAX_PRIORITY);
gestore.start();
andreaThread.start();
lorisThread.start();
}
}
Cesto
codice:
package GiocoDellaMela;
/*
* Classe che rappresenta un cesto pieno di mele, che
* può essere svuotato dai giocatori.
*/
public class Cesto {
private int mele;
private int meleMangiate;
public Cesto(int mele) {
this.mele = mele;
this.meleMangiate = 0;
}
public int getMele() {
return mele;
}
public int getMeleMangiate() {
return meleMangiate;
}
public void setMele(int mele) {
this.mele = mele;
}
public void mangiaMela() {
if(!meleFinite()) {
mele--;
}
meleMangiate++;
}
public boolean meleFinite() {
return mele == 0;
}
}
Controllore
codice:
package GiocoDellaMela;
public class Controllore {
private int stato;
private String vincitore = null;
public Controllore() {}
public synchronized void setStato() {
stato = 1;
}
public synchronized void setVincitore(String vincitore) {
this.vincitore = vincitore;
}
public synchronized int getStato() {
return stato;
}
public synchronized String getVincitore() {
return vincitore;
}
}
Mi vien da pensare che devo implementare una wait-notify nel gestore per controllare la partita.. vero?