Progetto Battaglia Navale n-dimensionale
Descrizione sintetica:
Realizzare un’applicazione client/server che implementi la “battaglia navale n-dimensionale”. La
battaglia navale e’ classicamente giocata da 2 giocatori ed e’ implementata su due dimensioni. Il
progetto consiste nella sua estensione a n dimensioni.
L'applicazione deve essere scritta utilizzando il linguaggio C. I processi comunicano attraverso
socket TCP. L'elaborato deve essere corredato da una opportuna documentazione.
Descrizione dettagliata:
Processo server:
Il processo server riceve su linea di comando il numero massimo di partite che deve gestire
contemporaneamente e la durata massima di una partita. Ogni partita e’ giocata da due giocatori ed
e’ identificata da una stringa “combat-field” che viene inviata al server dal primo client che si
connette. Il server fornisce i seguenti servizi:
• Stats: Il server invia al client
o Numero massimo di partite che puo’ gestire;
o Durata massima della partita;
o Numero di partite attualmente in svolgimento
o Numero di partite per cui un giocatore e’ in attesa di un avversario
o Numero totale di partite concluse dall’ultimo avvio del server
• List: Elenca tutte le partite “attive” sul server. Per ogni partita il server invia al client:
o La stringa che identifica la partita (“combat-field”)
o L’identificativo del/i giocatore/i (“combat-name”). Un partita in “svolgimento” ha
sempre due giocatori; Una partita “in attesa” ha sempre un unico giocatore.
o Il tempo rimasto per la partita
o I parametri del gioco (numero di dimensioni e dimensioni del campo di battaglia,
numero di unita’ navali costituenti la flotta.)
• New: Riceve come parametro una stringa, un intero N, un intero M seguiti da N interi. La
stringa identifica la partita (il “combat-field”), l’intero N identifica la dimensione del campo
di battaglia, l’intero M identifica il numero di unita’ navali costituenti la flotta e gli N interi
identificano il numero di elementi su ogni singola dimensione.
o Es. “New mediterraneo 3 7 4 5 6”. Crea un nuovo campo di battaglia 3-dimensionale
denominato “mediterraneo”. La flotta di ogni giocatore consiste di 7 unita’ navali. La
prima dimensione ha 4 componenti, la seconda dimensione ha 5 componenti e la terza
dimensione ha 6 dimensioni.
• Join: Riceve come parametro una stringa “combat-field”.
o Se la NON esiste nessuna partita identificata da “combat-field” ritorna errore;
o Se “combat-field” identifica una partita in svolgimento (i.e., con due giocatori) ritorna
errore;
o Se “combat-field” identifica una partita in “attesa” (i.e., con un solo giocatore), riceve
i parametri del campo di battaglia dal server ed il nuovo client diventa il secondo
giocatore.
Quando un nuovo giocatore si collega, (i.e., quando il primo giocatore esegue l’operazione “New” e
quando il secondo giocatore effettua la “Join”), il client invia al server il posizionamento della flotta.
Si assuma che:
• ogni unita’ navale identificata da una sola N-pla;
• due unita’ di giocatori diversi possono essere poste nella stessa posizione nello spazio
• due unita’ dello STESSO giocatore NON possono condividere la stessa posizione nello
spazio.
Processo client:
Il processo client riceve sulla linea di comando l’indirizzo IP ed il numero di porta del server. Il
client legge da standard input i comandi che invia al server e visualizza i messaggi da esso ricevuti.
I comandi che il client accetta sono:
• Stats, List. Non ricevono parametri e corrispondono ai relativi comandi del server.
• New: prende come parametri l’identificativo ed i parametri del campo di battaglia ed il nome
di un file. Il file contiene, per ogni riga la posizione nello spazio di una unita’ navale. Il server
verifica che le informazioni contenute nel file siano consistenti con i parametri del gioco
(numero di unita’ navali corretto, coordinate di ogni unita’ navale interne al campo di
battaglia) e le invia al server.
• Join: prende come parametri l’identificativo del campo di battaglia ed il nome del file
contentente il deployment della flotta. Verifica che le informazioni contenute nel file siano
consistenti con i parametri del gioco e le invia al server.
Dopo l’esecuzione di New o Join, i giocatori, a turno, inviano coordinate al server che risponde
opportunamente (“Acqua” o “Colpito” seguito dal numero di unita’ nemiche ancora attive).
Il client puo’ anche ricevere:
• Remaining: Visualizza il numero di unita’ navali dell’avversario non ancora coplite.
• Surrender: Messaggio di resa.
Una partita termina quando un giocatore colpisce tutte le unita’ nemiche, nel qual caso, i client dei
due giocatori terminano, o quando uno dei due si arrende.
Regole generali.
Il server ed il client vanno realizzati in linguaggio C su piattaforma UNIX/Linux. Le comunicazioni
tra client e server si svolgono tramite socket TCP. Oltre alle system call UNIX, i programmi
possono utilizzare solo la libreria standard del C. Sarà valutato negativamente l'uso di primitive non
coperte dal corso (ad es., code di messaggi) al posto di quelle studiate.