Progetto di Programmazione Internet A.A. 2003/04

Versione 1.1 del 25 Maggio 2004 (vedere Cambiamenti in fondo per dettagli)

Descrizione del progetto

Il progetto consiste nell'implementazione di un programma per gestire una partita di battaglia navale fra l'utente e un giocatore automatico.

Il programma distingue il gioco in due fasi: la fase di posizionamento e la fase di gioco.

Nella fase di posizionamento i giocatori posizionano tutte le navi a loro disposizione nel campo di gioco in modo che non esista contiguità fra due navi. Prima l'utente posiziona tutte le sue navi poi il giocatore automatico fa lo stesso con le proprie.

Prima di ogni posizionamento il programma mostra all'utente il proprio campo di gioco. Il campo di gioco deve essere composto da una griglia di caratteri dove il carattere . rappresenta una locazione libera e il carattere X rappresenta una locazione occupata da una nave. Il campo di gioco deve essere circondato da coordinate, numeriche di due cifre per la riga e alfabetiche (a partire da a) per la colonna come nell'esempio seguente:

  abcdefghij
01..........
02..........
03....X.....
04....X.....
05....X.....
06....X.....
07..........
08.XXX......
09.........X
10.........X

Subito sotto il campo di gioco viene presentata la lista delle navi disponibili (in ordine di dimensione) come nell'esempio che segue:

Navi rimanenti:
1 da 2
1 da 3
1 da 4

La fase di posizionamento del giocatore automatico non produce alcun output.

Nella fase di gioco i giocatori si alternano (iniziando sempre dall'utente) cercando di colpirsi a vicenda.

Prima di ogni turno della fase di gioco il programma mostra all'utente le precedenti giocate attraverso una versione del campo di gioco dell'avversario che riporta la segnalazione delle locazioni alle quali sono state indirizzate i colpi precedenti contraddistinte attraverso il carattere o nel caso di colpo andato a vuoto, il carattere + nel caso di colpo andato a segno, il carattere * nel caso di colpo andato a segno in una nave affondata; a seguire viene visualizzata a lista delle navi non ancora affondate come nell'esempio che segue.

  abcdefghij
01.o........
02.......o..
03..........
04.+........
05..........
06..*...+...
07..*....o..
08..*.......
09..*.....+.
10.o........ Navi non affondate: 1 da 4 3 da 3 3 da 2

Nella fase di gioco l'utente specifica le coordinate del colpo che vuole scagliare e il programma verifica se il colpo va a vuoto (acqua), o va a bersaglio (colpito) e, nel caso, se viene affondata una nave avversaria (affondato). Subito dopo la giocata il programma ne riporta l'esito al giocatore (visualizzando rispettivamente la stringa ACQUA, COLPITO o AFFONDATO su di un'unica linea). A questo punto il turno passa al giocatore automatico; il programma visualizza la sua giocata nella forma:

Il computer ha giocato 2,a con esito: ACQUA

dove <riga> e <colonna> rappresentano le coordinate del colpo e esito può essere ACQUA, COLPITO o AFFONDATO.

Subito a seguire viene visualizzato l'aggiornamento del campo di gioco dell'utente utilizzando il carattere . per una locazione libera non colpita, o per una locazione libera colpita, + per una locazione colpita occupata da una nave, * per una locazione colpita occupata da una nave affondata e X per una locazione non colpita occupata da una nave come nell'esempio che segue:

  abcdefghij
01.o.XX.....
02.......o..
03.+XX.....X
04.........X
05.........X
06..*..X+...
07..*....o..
08..*.X...X.
09..*.X...+.
10.o..X...X.

Se il colpo scagliato da uno dei giocatori provoca l'affondamento dell'ultima nave dell'avversario il gioco termina designando come vincitore il giocatore di turno (visualizzando la stringa HA VINTO IL COMPUTER o HAI VINTO su di un'unica linea).

Dettaglio sui comandi utente

Fase di posizionamento.

La fase di posizionamento è contraddistinta dal prompt posiziona> (la parola posiziona seguita dal carattere > seguito da uno spazio) che viene usato per l'acquisizione dei comandi.

Dove <lunghezza> è un valore intero che specifica la dimensione della nave che si vuole posizionare; <riga> e <colonna> definiscono la posizione del punto in alto a sinistra della nave e <direzione>, che può assumere valore H o V, specifica se la nave deve essere in posizione, rispettivamente, orizzontale o verticale.

Se, ad esempio, si vuole posizionare una nave di lunghezza 5 in orizzontale a partire dalla posizione 7,c si digiterà:

5:7,c,H

Il comando quit serve a terminare la partita.

Fase di gioco.

La fase di gioco è contraddistinta dal prompt gioca> (la parola gioca seguita dal carattere > seguito da uno spazio) che viene usato per l'acquisizione dei comandi.

Dove <riga> e <colonna> definiscono la posizione del colpo che si vuole scagliare.

<nomefile> definisce il nome del file che deve essere utilizzato per salvare la partita in modo che si possa poi ricaricare attraverso il parametro -l da linea di comando (vedi sotto).

Il comando spia serve a visualizzare il campo da gioco dell'avversario con lo stesso formato con cui è visualizzato quello dell'utente a seguito di un colpo scagliato dal giocatore automatico.

Il comando quit serve a terminare la partita.

Parametri su riga di comando

Se viene utilizzato il parametro -l gli altri parametri vengono ignorati.

I parametri possono essere specificati in qualsiasi ordine.

La dimensione massima consentita del campo da gioco è di 20 per 20.

Dettagli sul giocatore automatico

Il giocatore automatico deve essere in grado di posizionare tutte le sue navi in modo casuale rispettando la regola per cui non sono ammesse navi in posizioni contigue.

Durante la fase di gioco il giocatore automatico deve essere in grado di utilizzare una strategia ragionevole (non ripetere colpi in locazioni già colpite, non indirizzare i colpi in maniera sequenziale).

Note sull'implementazione

Il programma non dovrà fare uso di classi che non siano parte del programma stesso o che non siano parte della libreria di classi standard di Java 2, Standard Edition versione 1.4.

In questo progetto, essendo previsto l'uso di un correttore automatico, è importante attenersi strettamente alle specifiche sia per quello che riguarda l'alternarsi dei turni di gioco sia per quello che riguarda il formato dell'output.

In ogni possibile occasione il programma deve aver cura di controllare che l'input dell'utente sia nel formato previsto e, nel caso ciò non avvenga, visualizzi un breve messaggio d'errore e ripassi alla fase di input. In nessun caso il programma deve terminare il maniera anomala a fronte di un errore di immissione da parte dell'utente.

Esempio di interazione

>java -jar affondalaflotta.jar -r 5 -c 5 -n 4:1,3:1,2:1

  abcde
01.....
02.....
03.....
04.....
05.....
Navi rimanenti:
1 da 2
1 da 3
1 da 4
posiziona> 4:1,a,h
  abcde
01XXXX.
02.....
03.....
04.....
05.....
Navi rimanenti:
1 da 2
1 da 3
posiziona> 3:1,e,v
Attenzione: Posizione non consentita
  abcde
01XXXX.
02.....
03.....
04.....
05.....
Navi rimanenti:
1 da 2
1 da 3
posiziona> 3:e,2,v
Attenzione: formato coordinate non corretto
  abcde
01XXXX.
02.....
03.....
04.....
05.....
Navi rimanenti:
1 da 2
1 da 3
posiziona> 3:2,e,v
  abcde
01XXXX.
02....X
03....X
04....X
05.....
Navi rimanenti:
1 da 2
posiziona> 2:3,b,h
  abcde
01.....
02.....
03.....
04.....
05.....
Navi non affondate:
1 da 2
1 da 3
1 da 4
gioca> spia
  abcde
01X...X
02X...X
03X...X
04X.XX.
05.....
gioca> 1,a
COLPITO
Il computer ha giocato 2,a con esito: ACQUA
  abcde
01XXXX.
02o...X
03.XX.X
04....X
05.....
  abcde
01+....
02.....
03.....
04.....
05.....
Navi non affondate:
1 da 2
1 da 3
1 da 4
gioca> a,2
Attenzione: formato numerico non corretto
gioca> 2,a
COLPITO
Il computer ha giocato 2,c con esito: ACQUA
  abcde
01XXXX.
02o.o.X
03.XX.X
04....X
05.....
  abcde
01+....
02+....
03.....
04.....
05.....
Navi non affondate:
1 da 2
1 da 3
1 da 4
gioca> 3,a
COLPITO
Il computer ha giocato 4,c con esito: ACQUA
  abcde
01XXXX.
02o.o.X
03.XX.X
04..o.X
05.....
  abcde
01+....
02+....
03+....
04.....
05.....
Navi non affondate:
1 da 2
1 da 3
1 da 4
gioca> 4,a
AFFONDATO
Il computer ha giocato 1,b con esito: COLPITO
  abcde
01X+XX.
02o.o.X
03.XX.X
04..o.X
05.....
  abcde
01*....
02*....
03*....
04*....
05.....
Navi non affondate:
1 da 2
1 da 3
gioca> 1,e
COLPITO
Il computer ha giocato 5,a con esito: ACQUA
  abcde
01X+XX.
02o.o.X
03.XX.X
04..o.X
05o....
  abcde
01*...+
02*....
03*....
04*....
05.....
Navi non affondate:
1 da 2
1 da 3
gioca> 2,e
COLPITO
Il computer ha giocato 4,e con esito: COLPITO
  abcde
01X+XX.
02o.o.X
03.XX.X
04..o.+
05o....
  abcde
01*...+
02*...+
03*....
04*....
05.....
Navi non affondate:
1 da 2
1 da 3
gioca> 3,e
AFFONDATO
Il computer ha giocato 5,e con esito: ACQUA
  abcde
01X+XX.
02o.o.X
03.XX.X
04..o.+
05o...o
  abcde
01*...*
02*...*
03*...*
04*....
05.....
Navi non affondate:
1 da 2
gioca> spia
  abcde
01*...*
02*...*
03*...*
04*.XX.
05.....
gioca> salva partita
gioca> quit

>java -jar affondalaflotta.jar -l partita

  abcde
01*...*
02*...*
03*...*
04*....
05.....
Navi non affondate:
1 da 2
gioca> spia
  abcde
01*...*
02*...*
03*...*
04*.XX.
05.....
gioca> 4,c
COLPITO
Il computer ha giocato 2,e con esito: COLPITO
  abcde
01X+XX.
02o.o.+
03.XX.X
04..o.+
05o...o
  abcde
01*...*
02*...*
03*...*
04*.+..
05.....
Navi non affondate:
1 da 2
gioca> 4,d
AFFONDATO
HAI VINTO

Sviluppo del progetto

Il progetto può essere sviluppato in gruppi da 2, 3 o 4 persone. In casi eccezionali si può chiedere una deroga alla presente regola giustificando la ragione della richiesta (che va inviata a turrini@cs.unibo.it).

Per eventuali chiarimenti si suggerisce di utilizzare il newsgroup del corso. Si suggerisce anche di visitare con frequenza il newsgroup stesso e il sito del corso per verificare eventuali precisazione e/o modifiche.

Tempi di consegna

Chi intende sostenere lo scritto a Giugno dovrà consegnare il presente progetto entro le ore 10 del giorno 16 Giugno 2004; chi intende sostenere lo scritto a Luglio dovrà consegnare il presente progetto entro le ore 9 del giorno 9 Luglio 2004; chi invece intende sostenere lo scritto in date successive, dovrà consegnare il presente progetto entro le ore 10 del giorno 31 Luglio 2004.

Modalità di consegna

Occorre consegnare in formato digitale (mail a turrini@cs.unibo.it) un file in formato jar (per info sul formato jar fare riferimento a:
http://java.sun.com/docs/books/tutorial/jar/) contenente le seguenti directory:

La mail deve avere subjet "consegna progetto <nomeGruppo>" e in attachment il file <nomeGruppo.jar>.
Il nome gruppo deve essere di al massimo 8 digit (lettere o numeri) (può essere formato con le sillabe iniziali dei cognomi) e deve contenere solo lettere e numeri; all'interno del messaggio vanno specificati i nomi degli appartenenti al gruppo.

La documentazione deve essere consegnata anche in formato cartaceo lasciandola nella casella di posta degli assegnisti (che si trova al primo piano del dipartimento di informatica) indirizzata alla dott. Turrini.

Vanno consegnati in forma cartacea il file project.html e tutti i file sorgenti stampati in orizzontale (sotto linux si puo' usare enscript -r nomefile). Ogni stampa deve essere graffettata nell'angolo in alto a sinistra.

I tempi per la consegna della documentazione cartacea sono gli stessi della consegna del progetto.

Cambiamenti

Da 1.0 a 1.1

Nella sezione "Parametri su riga di comando" aggiunto "I parametri possono essere specificati in qualsiasi ordine."

Nella sezione "Esempio di interazione" cambiata l'invocazione da ">java -jar affondalaflotta.jar -r 5 -c 5 -n:4:1,3:1,2:1" a ">java -jar affondalaflotta.jar -r 5 -c 5 -n 4:1,3:1,2:1"