Battaglia Navale

Progetto di Programmazione II del 9 Febbraio 2015

Modalità di consegna

Per consegnare:

Vi ricordo che la documentazione delle classi standard è disponibile puntando il browser su

file:///usr/share/javadoc/java/index.html

Introduzione

È necessario realizzare un sistema di gioco per Battaglia Navale. Questo sarà costituito da:

Il progetto verrà valutato prima di tutto in base al suo corretto funzionamento rispetto ai requisiti qui descritti; quindi, in base alla pulizia del codice ed alla sua documentazione (si consiglia di commentare il codice, in particolare anche scrivendo i commenti javadoc).

Tra coloro che consegneranno un progetto leggibile e ben funzionante, l'aver fornito un'implementazione più o meno intelligente del GiocatoreArtificiale costituirà un bonus – e un vanto personale per voi, visto che li faremo competere tra loro!

Classi e interfacce

Descriviamo ora nei dettagli come realizzare le classi necessarie al progetto. Se lo ritenete, potete apportare cambiamenti alle segnature dei metodi proposti ed anche – se lo ritenete – alla struttura delle Classi, restando ovviamente all'interno dei requisiti esposti nel paragrafo introduttivo. È però importante che non cambiate in alcun modo l'interfaccia Giocatore, né la semantica del risultato del metodo effettuaSparo.

N.B.: Oltre ai metodi qui indicati, ricordatevi di aggiungere ad ogni classe un valido metodo toString() e, dove lo ritenete, anche un metodo equals e un metodo hashCode (con le segnature appropriate e che soddisfino i contratti previsti).

Classe Sparo

Una classe che racchiude una coppia di coordinate valide per una tabella. Viene costruita tramite due int, che può poi restituire attraverso i metodi int getX() e int getY(). Potete assumere che x e y siano coordinate valide.

Classe astratta Nave

Una classe che rappresenta una nave posizionata nel campo. Deve avere:

Come si è detto, potete aggiungere altri metodi secondo necessità.

Le sottoclassi concrete di Nave sono

Classe Tabella

Questa classe deve rappresentare un campo di gioco di battaglia navale di un giocatore.

Si raccomanda di implementare un metodo toString() che stampi opportunamente la tabella; questa rappresentazione deve indicare dove è stato effettuato uno sparo, e dove è presente una nave.

Interfaccia Giocatore

Questa interfaccia deve porre i requisiti di base perché una classe rappresenti un giocatore completo di battaglia navale. Un giocatore deve essere in grado di riempire la propria tabella (cosa che avverrà una sola volta all'inizio del gioco), e inoltre di giocare sulla tabella dell'avversario, decidendo dove sparare e ricevendo gli esiti degli spari.

Supponiamo che un giocatore venga creato ex novo ad ogni partita. Quindi, la sequenza di mosse di un giocatore viene rappresentata da una sequenza di chiamate a prossimoSparo(); dopo ogni chiamata, al giocatore viene comunicato l'esito dello sparo mediante un'invocazione del metodo risultatoUltimoSparo(r) che influirà, presumibilmente, sui comportamenti successivi del giocatore.

Classe GiocatoreInterattivo

Questa classe è un implementazione concreta dell'interfaccia Giocatore, creata per permettere ad un utente di giocare da riga di comando. Avrà un costruttore vuoto e implementerà i metodi come segue:

Classe GiocatoreArtificiale

Questa classe è un implementazione concreta dell'interfaccia Giocatore, e decide in autonomia che colpi sparare. Avrà un costruttore vuoto e deve implementare tutti i metodi dell'interfaccia, nel modo che preferite.

Classe Partita

Questa classe deve contenere tutto il necessario per rappresentare una partita. Il suo costruttore deve accettare due oggetti Giocatore, a cui deve chiedere per prima cosa di costruire i rispettivi oggetti Tabella. La dimensione della Tabella è fissata da questa classe a 10. Avute le tabelle, controlla che il loro metodo isInizioLegale() dia true e quindi invoca terminaInserimento().

Una Partita deve fornire un metodo gioca() che agirà così:

  1. Chiede al giocatore A uno Sparo
  2. Effettua lo Sparo sulla tabella del giocatore B, ottenendo il risultato dello sparo.
  3. Comunica il risultato dello sparo al giocatore A.
  4. Se la tabella del giocatore B è vuota, la partita si conclude con la vittoria di A. Altrimenti, procedere con il turno successivo (a giocatori invertiti).

Ognuna di queste fasi deve stampare a video le mosse effettuate dai due giocatori, e i rispettivi risultati.

Dotate infine questa classe di un metodo main che costruisca un oggetto Partita con un GiocatoreInterattivo e un GiocatoreArtificiale e chiami il metodo gioca().