Corso di Interfacce Utente - A.A. 2004-2005
PROGETTO DI LABORATORIO
Descrizione della classe Labirinto
La classe Java Labirinto implementa
le strutture dati e le funzioni
dell'applicazione relative alla creazione del labirinto e alla gestione
dei movimenti di Teseo e del minotauro.
Costanti di classe
-
NORD, SUD, EST, OVEST
Costanti intere che indicano le quattro direzioni possibili.
Per riflettere il modo in cui Java disegna (cioe' con l'asse
delle y diretto verso il basso), la direzione NORD corrisponde
alle y piu' piccole e la direzione SUD alle y piu' grandi.
-
MURO, LIBERO, MURETTO, BUCO
Costanti intere che indicano i quattro possibili tipi di pareti.
Metodi di classe
Questi metodi sono di classe (statici) e manipolano le direzioni:
-
int ruotaOrario(int direzione)
Restituisce la direzione ruotata in senso orario
(esempio: chiamata con parametro Labirinto.EST
restituisce Labirinto.SUD, ecc.).
- int ruotaAntiorario(int direzione)
Restituisce la direzione ruotata in senso anti-orario
(esempio: chiamata con parametro Labirinto.EST
restituisce Labirinto.NORD, ecc.).
- int inverti(int direzione)
Restituisce la direzione invertita
(esempio: chiamata con parametro Labirinto.EST
restituisce Labirinto.OVEST, ecc.).
Costruttore
-
Labirinto(int N, int M)
Crea un labirinto costituito da una griglia
di N caselle in orizzontale e M caselle in verticale.
Le caselle del labirinto saranno identificate da coppie di
interi (x,y) dove x varia da 0 a N-1 e y varia da 0 a M-1.
Per riflettere il modo in cui Java disegna (cioe' con l'asse
delle y diretto verso il basso),
y=0 corrisponde al lato NORD e y=M-1 al lato SUD della griglia.
Metodi di oggetto
-
int dimensioneX() e int dimensioneY()
Restituiscono rispettivamente
il numero di celle della griglia in orizzontale e in verticale.
-
int tipoParete(int x, int y, int direzione)
Ritorna il tipo di parete che delimita la casella (x,y) nella direzione
data.
La direzione e' una fra
Labirinto.NORD, Labirinto.SUD, Labirinto.EST, Labirinto.OVEST.
Il tipo di parete ritornato e' uno fra
Labirinto.MURO, Labirinto.LIBERO, Labirinto.MURETTO,
Labirinto.BUCO.
-
int xTeseo() e int yTeseo()
Ritornano le coordinate x ed y (rispettivamente)
della casella in cui si trova Teseo.
-
int xMinotauro() e int yMinotauro()
Ritornano le coordinate x ed y (rispettivamente)
della casella in cui si trova il minotauro.
-
int dirTeseo() e int dirMinotauro()
Ritornano la direzione di marcia corrente rispettivamente
di Teseo e del minotauro.
Il valore di ritorno e' uno fra
Labirinto.NORD, Labirinto.SUD, Labirinto.EST, Labirinto.OVEST.
-
boolean mossaValidaTeseo() e
boolean mossaValidaMinotauro()
Ritorna true se il personaggio puo' muovere nella sua direzione
di marcia corrente:
- Teseo non puo' muovere se c'e' un muro oppure
se c'e' l'uscita del labirinto
- il minotauro Non puo' muovere se c'e' un muro (mentre, al contrario di
Teseo, puo' muovere se c'e' l'uscita del labirinto - e allora vince)
-
void cambiaDirTeseo(int direzione) e
void cambiaDirMinotauro(int direzione)
Assegnano la direzione di marcia a Teseo e al minotauro, rispettivamente.
La direzione e' una fra
Labirinto.NORD, Labirinto.SUD, Labirinto.EST, Labirinto.OVEST.
-
boolean tentaMossaTeseo() e
boolean tentaMossaMinotauro()
Tenta di muovere il personaggio nella sua direzione di marcia corrente.
Il valore di ritorno e' true se Teseo si muove effettivamente
(la parete e' libera, oppure
e' un muretto e questo e' il secondo tentativo eseguito per
scavalcarlo, oppure e' un buco e questo e' il terzo tentativo
eseguito per attraversarlo).
Altrimenti il valore di ritorno e' false.
In questo caso, chiamando mossaValidaTeseo() si puo'
capire se la mossa e' fallita perche' non era valida.
-
boolean muoviAutomTeseo() e
boolean muoviAutomMinotauro()
Fa eseguire automaticamente una mossa al personaggio.
La mossa e' sempre valida.
Il valore di ritorno e' true se il personaggio
si muove effettivamente,
false altrimenti (cioe' se nella direzione corrente
c'e' un muretto o un buco e non e' stato fatto ancora un numero
sufficiente di tentativi).
-
boolean fineGioco()
Ritorna true se e solo se e' finito il gioco.
-
boolean haVintoTeseo()
boolean haVintoMinotauro()
Ritornano true se il gioco e' finito e se il vincitore e'
Teseo o il minotauro, rispettivamente.
-
nuovo()
Reinizializza il labirinto, mantenendo stesse dimensioni ma
cambiando la disposizione dei muri e riportando Teseo e il minotauro
alla situazione iniziale.
-
void disegnaLabirinto()
Metodo che puo' essere utile per debug.
Disegna su standard output una rappresentazione del labirinto.
I muri sono indicati con linee, i muretti con puntini,
i muri forati con sequenze di linee interrotte al centro.
Le posizioni di Teseo e del minotauro sono indicate con T e M
rispettivamente.
Main
La classe ha un metodo main e dunque puo' essere eseguita.
Richiede due numeri da linea di comando:
il numero di celle in orizzontale e in verticale.
Costruisce un labirinto con le dimensioni specificate e lo disegna
su standard output.
Per esempio:
java Labirinto 4 3
puo' produrre questo output (la disposizione dei muri e' casuale e
cambia ad ogni esecuzione):
+---+---+---+---+
| |
| |
| |
+---+- -+- -+ +
| | M | |
| | M | |
| | M | |
+ +...+...+ +
| | T
| | T
| | T
+---+---+---+---+
Avvertenze
La mossa di un personaggio da parte dell'utente si implementa
chiamando cambiaDirXXX seguita da tentaMossaXXX.
Se tentaMossaXXX ritorna false e mossaValida
ritorna anch'essa false, allora bisogna avvertire l'utente che ha
tentato una mossa non valida.
La mossa di un personaggio da parte del sistema si implementa
chiamando muoviAutomXXX.
In ogni caso, dopo che il personaggio si e' mosso occorre chiamare
fineGioco per controllare se il gioco e' finito.
Se il gioco e' finito, per capire chi e' il vincitore
bisogna chiamare le funzioni haVintoTeseo e
haVintoMinotauro.
Il controllo di fine gioco e' necessario
perche' eventuali chiamate a
tentaMossaXXX o muoviAutomXXX continuano ad
avere effetto sui personaggi anche se il gioco e' finito.
Il meccanismo automatico di movimento dei personaggi e' molto grezzo:
non e' stata implementata nessuna strategia di gioco,
semplicemente si sceglie di avanzare in una direzione a caso.
Quindi non preoccupatevi se il sistema sembra giocare in modo stupido.