Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
147 lines (114 sloc) 6.15 KB

Battaglia navale, Giocatore

Descrizione

Questo è il quinto esercizio di una serie il cui obiettivo è sviluppare un insieme di classi che rappresentino lo svolgimento di una partita a battaglia navale. Prima di iniziare, recuperate i sorgenti delle classi Posizione, Nave, Griglia e Giocatore degli esercizi precedenti e copiateli in questa directory.

Scopo di questo esercizio è implementare la classe Arbitro che rappresenti l'intermediario tra i due giocatori, il cui ruolo è stato accennato nell'esercizio precedente. Più formalmente, la classe deve implementare il costruttore con segnatura

public Arbitro(final Giocatore primo, final Giocatore secondo)

tramite il quale l'arbitro è posto a conoscenza dei due giocatori; scopo del costruttore è, tra l'altro, predisporre le griglie di gioco e popolarle con le navi indicate dai giocatori.

La classe deve quindi avere due metodi

public boolean haProssimoPasso()
public void prossimoPasso()

che indicano rispettivamente se è possibile effettuare un nuovo passo di gioco e, in caso affermativo, lo svolgono.

Ad ogni passo, uno dei due giocatori ricoprirà il ruolo dell'attaccante, mentre l'altro quello dell'opponente; all'inizio l'attaccante è il primo giocatore, mentre l'opponente è il secondo giocatore. Un passo di gioco può essere descritto come segue:

  • l'arbitro valuta se l'attaccante ha perso (ossia se tutte le navi sulla sua griglia risultano affondate), in questo caso il gioco termina; viceversa

  • l'arbitro chiede all'attaccante la sua prossima mossa, se egli non ha alcuna mossa, il gioco termina; viceversa

  • l'arbitro valuta la mossa usando la griglia dell'opponente e comunica all'attaccante l'esito della mossa,

  • il gioco prosegue scambiando tra i giocatori i ruoli di attaccante e opponente.

Infine, la classe deve sovrascrivere il metodo toString in modo tale che la stringa che rappresenta lo stato della classe sia data dalla stringa corrispondente alla griglia del primo giocatore, affiancata dalla stringa corrispondente al primo giocatore, affiancata dalla stringa corrispondente alla griglia del secondo giocatore, affiancata dalla stringa corrispondente al secondo giocatore. Si veda un esempio di esecuzione per avere maggiori dettagli.

La classe di test

La classe TestRunner (fornita assieme a questo testo e che non deve essere modificata), costruisce i giocatori a partire da un elenco di navi e mosse specificato nel flusso di ingresso e quindi procede a giocare una partita fino al suo termine, stampando l'arbitro ad ogni passo.

Vincoli

Si assuma che l'input fornito alla classe di test (e i valori passati come parametri ai vari metodi) non violino mai il contratto specificato dalla descrizione della classe; altrimenti detto, non è necessario implementare alcuna gestione degli errori.

Esempio

Eseguendo soluzione e avendo

A1:2:O,C3:3:V
A1,B3
B2:3:V,D5:2:O
B2,C1

nel flusso di ingresso, il programma emette

##........ | ..........  -  .......... | ..........
.......... | ..........  -  .#........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  ...##..... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........

##........ | M.........  -  .......... | ..........
.......... | ..........  -  .#........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  ...##..... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........

##........ | M.........  -  .......... | ..........
.......... | ..........  -  .#........ | .M........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  ...##..... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........

##........ | M.........  -  .......... | ..........
.......... | ..........  -  .#........ | .M........
..#....... | .C........  -  .*........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  ...##..... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........

##........ | M.........  -  .......... | ..M.......
.......... | ..........  -  .#........ | .M........
..#....... | .C........  -  .*........ | ..........
..#....... | ..........  -  .#........ | ..........
..#....... | ..........  -  ...##..... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........
.......... | ..........  -  .......... | ..........

la prima e terza riga del flusso di ingresso sono l'elenco di navi del primo e secondo giocatore, la seconda e quarta riga del flusso di ingresso sono l'elenco di mosse del primo e secondo giocatore. L'output è prodotto dal metodo toString della classe Arbitro senza ulteriori modifiche, esso è dato (come specificato sopra) dall'accostamento dei valori restituiti dai metodi toString delle classi Griglia e Giocatore.