- 34
- 0
- CPU
- AMD Athlon 64 X2 4200+
- Scheda Madre
- Asus A8N sli-premium
- HDD
- Hdd maxtor 80 Gb, Hdd maxtor 120 gb
- RAM
- 2Gb (1+1 Corsair PC3200)
- GPU
- GeForce 6800GS
- Audio
- integrata
- Monitor
- Samsung SyncMaster 152b
- PSU
- 500W (nn ricordo la marca)
- OS
- Windows XP Service Pack 2
Salve a tutti. Ho realizzato un giochino dei dadi, in cui a turno utente e computer tirano un dado per tot volte, e vince chi alla fine ha totalizzato un punteggio più alto. Il tutto è interattivo. Per aggiornare in tempo reale la grafica ho sfruttato il pattern observer. Il "problema" è che il codice è orribile.
Ho la grafica --> classe View (observer)
Ho la logica --> classe Partita (observable)
Ho un mio JPanel personalizzato --> classe Grid (observer)
Il JPanel personalizzato mostra i dadi giocati mano a mano.
La classe Partita è un runnable, e il suo metodo run() è questo:
Come vedete io costruisco messaggi troppo complessi per far capire alla view cosa deve aggiornare.
Vorrei che ci fosse una separazione più netta. Ad esempio vorrei che la classe Messaggio fosse decisamente più banale, tipo questa (trovata in rete):
In partita vorrei evitare di agire su Messaggio quindi, e lanciare semplicemente:
Creando tutti gli stati necessari, in modo tale che i vari osservatori sappiano esattamente cosa fare
ogni volta.
Non lo so fare però, perché da quel che potete vedere nel metodo run() ci sono parecchie variabili
che vado ad impostare a Messaggio che poi verranno utilizzate dalle View. Come posso fare per passare
i medesimi dati alle View senza passare per Messaggio?
Ho la grafica --> classe View (observer)
Ho la logica --> classe Partita (observable)
Ho un mio JPanel personalizzato --> classe Grid (observer)
Il JPanel personalizzato mostra i dadi giocati mano a mano.
La classe Partita è un runnable, e il suo metodo run() è questo:
Codice:
public synchronized void run() {
int i = 0;
Messaggio m = new Messaggio();
while (start <= 5) {
//E' il turno del computer
if (turno == 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
int risultato = dado.getNumeroCasuale();
giocatoreA.setGiocata(risultato);
setChanged();
String text = buildMessage(1);
m.setText(text);
m.setX(x);
m.setY(y);
m.setNotIsFineMano();
m.setUrlDado(dado.getUrlImage());
notifyObservers(m);
turno = 1;
x++;
i++;
}
// E' il turno dell'utente
if (turno == 1) {
while (userHavePlayed == false) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
userHavePlayed = false;
setChanged();
int risultato = dado.getNumeroCasuale();
giocatoreB.setGiocata(risultato);
String text = buildMessage(2);
m.setText(text);
m.setX(x);
m.setY(y);
m.setNotIsFineMano();
m.setUrlDado(dado.getUrlImage());
notifyObservers(m);
turno = 0;
x++;
i++;
}
if (i == 2) {
// Aggiorna il punteggio dei giocatori
if (giocatoreA.getGiocata() > giocatoreB.getGiocata()) {
setChanged();
String text = buildMessage(3);
m.setText(text);
m.setIsFineMano();
notifyObservers(m);
giocatoreA.addPunti(1);
}
if (giocatoreA.getGiocata() < giocatoreB.getGiocata()) {
setChanged();
String text = buildMessage(4);
m.setText(text);
m.setIsFineMano();
notifyObservers(m);
giocatoreB.addPunti(1);
}
if (giocatoreA.getGiocata() == giocatoreB.getGiocata()) {
setChanged();
String text = buildMessage(5);
m.setText(text);
m.setIsFineMano();
notifyObservers(m);
}
System.out.println();
start++;
y++;
}
i = 0; //reset indice mano
x = 0; //reset indice colonna
}
// Fine partita
if(giocatoreA.getPunti() > giocatoreB.getPunti()) {
setChanged();
String text = buildMessage(6);
m.setText(text);
notifyObservers(m);
finePartita();
}
if(giocatoreA.getPunti() < giocatoreB.getPunti()) {
setChanged();
String text = buildMessage(7);
m.setText(text);
notifyObservers(m);
finePartita();
}
if(giocatoreA.getPunti() == giocatoreB.getPunti()) {
setChanged();
String text = buildMessage(8);
m.setText(text);
notifyObservers(m);
finePartita();
}
}
Come vedete io costruisco messaggi troppo complessi per far capire alla view cosa deve aggiornare.
Vorrei che ci fosse una separazione più netta. Ad esempio vorrei che la classe Messaggio fosse decisamente più banale, tipo questa (trovata in rete):
Codice:
public class MsgObserver {
public final static int START = 0;
public final static int DOWNLOAD = 1;
public final static int READLINE = 2;
public final static int END = 3;
public final static int EXCEPTION = 4;
public int code;
public Object msg;
public MsgObserver(int code, Object msg) {
this.code = code;
this.msg = msg;
}
}
In partita vorrei evitare di agire su Messaggio quindi, e lanciare semplicemente:
Codice:
changedState(new MsgObserver(MsgObserver.START, null));
Creando tutti gli stati necessari, in modo tale che i vari osservatori sappiano esattamente cosa fare
ogni volta.
Non lo so fare però, perché da quel che potete vedere nel metodo run() ci sono parecchie variabili
che vado ad impostare a Messaggio che poi verranno utilizzate dalle View. Come posso fare per passare
i medesimi dati alle View senza passare per Messaggio?