Esercitazione di laboratorio del corso di

Interazione Uomo-Macchina: Interfacce Grafiche


Modalita' di lavoro

A gruppi composti da non piu' di tre persone. I gruppi possono non essere gli stessi delle esercitazioni guidate. Inoltre e' possibile farla a casa, anche per conto proprio (non in gruppo). Per favore segnalatemi qualsiasi variazione o aggiunta rispetto ai gruppi delle esercitazioni guidate.

Data di consegna

Indice



Lavoro da svolgere

Realizzare un'interfaccia grafica per un "gioco del labirinto", descritto sotto.

Descrizione del gioco

In questo gioco si ha un labirinto dove si muovono due personaggi: Teseo e il minotauro.
Lo scopo di Teseo e' di raggiungere il minotauro prima che questo trovi l'uscita del labirinto.
Lo scopo del minotauro e' di trovare l'uscita del labirinto prima di essere raggiunto da Teseo.
Il gioco finisce quando Teseo raggiunge il minotauro (e allora ha vinto Teseo) oppure quando il minotauro trova l'uscita (e allora ha vinto il minotauro).

Il labirinto e' strutturato come una griglia bidimensionale di NxN caselle.
Ogni parete di confine fra due caselle puo' essere:

Le pareti di contorno della griglia sono tutte muri tranne una che e' libera. La casella che confina con questa parete e' l'uscita del labirinto.
Le pareti del labirinto sono configurate in modo tale che da qualsiasi casella della griglia sia possibile raggiungere l'uscita.

Sono possibili tre modalita' di gioco:

  1. L'utente manovra Teseo, il minotauto e' manovrato dal sistema
  2. L'utente manovra il minotauro, Teseo e' manovrato dal sistema
  3. Entrambi i personaggi sono manovrati dal sistema
Inizialmente Teseo e' collocato all'uscita e il minotauro e' collocato al centro del labirinto. Il primo a muovere e' Teseo.

Nel seguito uso la parola "personaggio" per indicare intercambiabilmente Teseo o il minotauro.

In ogni momento un personaggio ha una posizione e una direzione di marcia. Alla prossima mossa puo' decidere di:

Se nella direzione del tentato avanzamento c'e' un muro, oppure se si esce dal labirinto, allora la mossa non e' valida. Quando il personaggio e' manovrato dal sistema, non vengono mai generate mosse non valide. Se il personaggio e' manovrato dall'utente, allora il sistema informa l'utente che la mossa non e' valida con un segnale opportuno: l'utente ha consumato una mossa inutilmente.

Se nella direzione del tentato avanzamento c'e' libero, allora il personaggio avanza effettivamente, spostandosi nella casella accanto.

Se nella direzione del tentato avanzamento c'e' un muretto, allora sara' necessaria un'altra mossa nella stessa direzione per poter avanzare. Il personaggio potra' dunque terminare la scavalcata del muretto al prossimo turno.

Se nella direzione del tentato avanzamento c'e' un muro forato, allora saranno necessarie altre due mosse nella stessa direzione per poter avanzare. Il personaggio potra' dunque completare il passaggio attraverso il foro nei prossimi due turni.

Se entrambi i personaggi sono manovrati dal sistema, allora eseguono alternativamente una mossa per uno.

Se uno dei personaggi e' manovrato dall'utente, allora sono possibili vari livelli di difficolta':

Funzionalita' dell'interfaccia

Prima di iniziare il gioco, l'utente puo' impostare: In ogni caso il sistema fornisce dei valori di default sensati.

Il gioco puo' avere inizio solo per esplicita richiesta dell'utente.
In ogni momento deve essere possibile uscire dall'applicazione (interrompendo il gioco se e' il caso).
In ogni momento deve essere possibile sospendere il gioco e poi riprenderlo dal punto in cui si era rimasti.

La visualizzazione dello stato attuale del gioco avviene nel modo seguente:

Entrambe le visioni 2D e 3D sono aggiornate in modo da riflettere istante per istante lo stato del gioco.
E' compito degli sviluppatori dell'interfaccia stabilire l'aspetto grafico da dare ai vari tipi di pareti e ai due personaggi.

Il sistema deve fornire segnali all'utente (in una qualche forma opportuna) almeno in corrispondenza delle seguenti situazioni:

Nota: Puo' essere che le due condizioni di terminazione del gioco si verifichino contemporaneamente (Teseo si trova nella casella di uscita e il minotauro muove sulla casella di uscita). In questo caso la partita e' pari.

Materiale fornito

Viene fornita una classe Java Labirinto che implementa le strutture dati e le funzioni dell'applicazione relative alla creazione del labirinto e alla gestione dei movimenti di Teseo e del minotauro.

La classe e' contenuto nel file Java (gia' compilato) Labirinto.class.

La classe Labirinto e' cosi' strutturata.

Variabili

Metodi

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 generare un segnale di avvertimento all'utente.

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 il vincitore si ottiene chiamando haVintoXXX.

Nota: 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.



Avvertenze

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.

Se invece riscontrate anomalie di comportamento o malfunzionamenti, per favore segnalatemeli.

Raccomandazioni

Questo e' un progetto di interfacce grafiche. Pertanto, sara' tenuto conto non solo del fatto che tutte le funzioni richieste siano presenti nell'interfaccia sviluppata, ma anche e di quanto facile e gradevole risulta l'uso dell'interfaccia stessa per l'utente.

Materiale da consegnare

Il materiale puo' essere consegnato su dischetto o spedito per EMAIL all'indirizzo magillo@disi.unige.it.
Indicare chiaramente i nomi dei componenti del gruppo e l'elenco dei file.