Concetti Chiave
- Il programma simula il gioco del Mastermind tra client e server, con il server che genera una sequenza casuale di quattro cifre senza ripetizioni.
- Il client tenta di indovinare la sequenza e il server risponde con indicatori 'O' per cifre giuste ma nel posto sbagliato e 'X' per cifre giuste nel posto giusto.
- Il gioco termina se il giocatore indovina la sequenza o dopo dieci tentativi, con il server che comunica il tempo impiegato o la soluzione.
- Il server utilizza un socket per gestire le connessioni e verifica la validità dei tentativi del client, inviando feedback appropriato.
- Il client si connette al server, invia tentativi e riceve risposte finché non indovina la sequenza o esaurisce i tentativi.
Client-Server(Mastermind)
Testo:
Scrivere un programma che simuli il gioco del Mastermind tra un client ed un server.
Il server genera una sequenza casuale di quattro cifre (tra uno e nove)senza ripetizioni.
Il client,controllato da un utente, dovrà cercare di indovinare la sequenza.
Ad ogni tentativo del client il server risponderà comunicando quante sono le cifre presenti ma nel posto sbagliato con delle 'O',e quante sono le cifre presenti ma nel posto giusto con delle 'X'.Le O precederanno le X.
La partita termina se il giocatore indovina la sequenza oppure se sono stati effettuati dieci tentativi.
In caso di vittoria il server comunicherà il tempo impiegato e in caso di sconfitta la soluzione.
Analisi del testo e descrizione della soluzione adottata:
Il programma verrà scomposto in due: un programma che agirà da server, e un programma client per l'interazione con l'utente.
1)Server:
Il server inizializzerà il socket è si metterà in attesa di una connessione.
Inizierà quindi la gestione dei vari tentativi del client.
Alla ricezione di un tentativo verrà verificata la validità dello stesso e in tal caso verrà generata e inviata la sequenza di O e di X adeguata.
Nel caso in cui il tentativo non fosse valido questo non verrebbe conteggiato.
Se si giunge al decimo tentativo senza indovinare la sequenza verrà inviato un messaggio di fallimento e il programma terminerà, se invece viene indovinata la sequenza corretta verrà inviato un messaggio di vittoria e il programma terminerà.
2)Client :
Il programma client riceverà tra i parametri di input l'indirizzo del server a cui connettersi.
All'avvio quindi verrà tentata la connessione con il server è in caso di successo sarà atteso un messaggio di benvenuto.
Inizierà quindi la gestione dei vari tentativi.
Prima di permettere all'utente di effettuare un tentativo verrà atteso dal server un messaggio che comunichi la possibilità di inviare un tentativo: il gioco potrebbe essere terminato e in tal caso il messaggio ricevuto sarà quello di vittoria o sconfitta e quindi il programma terminerà.
Dopo che l'utente avrà inserito il tentativo si dovrà attendere l'esito di quest'ultimo e ricominciare la gestione dall'inizio.
Server:
Il programma inizia richiamando la procedura di inizializzazione del socket fornita dal programma di base.
Viene quindi creato un socket e viene messo in attesa di una connessione.
Quando un client contatta il server la connessione viene accettata e viene stampata un messaggio a video.
Viene quindi generata la sequenza di quattro cifre comprese tra uno e nove,nel seguente modo:
Per prima cosa si inizializza il seed (che è il valore passato alla srand )della funzione rand utilizzando la data di sistema (time (NULL)).
In un ciclo più esterno viene generato un numero casuale per l'i-esimo valore della sequenza e in un ciclo più interno viene controllata l'unicità del valore rispetto a quelli precedentemente generati e, in caso negativo, l'i-esimo valore viene generato nuovamente.
È stato deciso di utilizzare un vettore di tipo carattere (char) piuttosto di uno di tipo intero(int),per semplificare le operazioni di verifica dei tentativi inviati dal client(infatti la comunicazione via socket avviene sempre tramite stringhe)
Dopo l'ultimo valore della sequenza è stato inserito il valore null ('\0' )per rendere la sequenza una stringa a tutti gli effetti.
Giunti a questo punto viene inviato il messaggio di benvenuto è inizializzato il timer per cronometrare il tempo di gioco.
Inizia quindi un ciclo “infinito” (si esce solo in caso di vittoria o sconfitta o errore).
Nel corso del programma spesso sono state generate delle stringhe composte dalla concatenazione di più variabili. Per far ciò sono state convertite in stringa le variabili di tipo numerico con la funzione itoa e le stringhe cosi ottenute sono state concatenate con la funzione strcat.
Il ciclo inizia con la generazione del messaggio comunicante il numero di tentativo,viene poi effettuata una sleep lunga un secondo che ci permette di evitare problemi di sincronizzazione con il client.
Viene quindi inviato il messaggio e si attende la ricezione della risposta (che sarà un tentativo da parte del client).
Viene quindi controllata la validità del tentativo: Il tentativo deve essere di quattro caratteri, deve contenere solo numeri compresi tra uno e nove e non deve contenere ripetizioni. Se il controllo fallisce viene inviato un messaggio di non validità, il numero di tentativo non viene incrementato e il ciclo riparte dall'inizio.
Con due cicli annidati vengono contati il numero di cifre al posto giusto e il numero di cifre presenti ma nel posto sbagliato.
Viene quindi generato e inviato un messaggio contenente tante O e X in base ai valori calcolati prima.
Se l'utente ha vinto il timer viene fermato e, dopo una sleep, viene inviato il messaggio contenente il tempo impiegato.
Medesima cosa verrà effettuata se l'utente ha perso (per il motivo citato prima) a differenza che verrà inviata la soluzione corretta invece del tempo impiegato.
All'uscita dal ciclo vengono effettuate le operazioni di chiusura del socket e di clean-up già presenti nel file di base.
Client:
Il programma inizia richiamando la procedura di inizializzazione della winsocket fornita dal programma di base.
Il programma inizia con un ciclo while che ci in mette nel programma vero e proprio dove noi riceveremo dal server il numero del tentativo,dopo di che vediamo se il messaggio che arriva dal server e un messaggio di vittoria o di sconfitta se è una dei due, si esce altrimenti riceviamo il numero del tentativo e attraverso una send inviamo la combinazione al server.
Dopo di che attendiamo la risposta del server che ci dirà quanti dei quattro numeri sono giusti e in posizione corretta o se sono giusti ma non nella posizione corretta dopo di che esce e aspettiamo il nuovo tentativo questo fino a quando non esauriremo i tentativi o non indoviniamo la sequenza esatta nella posizioni giuste!
Domande da interrogazione
- Qual è l'obiettivo principale del programma descritto nel testo?
- Come funziona la comunicazione tra il client e il server nel gioco?
- Quali sono le condizioni di vittoria e sconfitta nel gioco?
- Come viene gestita la generazione della sequenza di cifre da parte del server?
- Quali sono i passaggi principali che il client deve seguire durante il gioco?
L'obiettivo principale del programma è simulare il gioco del Mastermind tra un client e un server, dove il server genera una sequenza casuale di quattro cifre e il client cerca di indovinarla.
Il server genera una sequenza di cifre e il client tenta di indovinarla. Il server risponde indicando quante cifre sono corrette ma nel posto sbagliato ('O') e quante sono corrette e nel posto giusto ('X').
La partita termina con una vittoria se il giocatore indovina la sequenza entro dieci tentativi, altrimenti termina con una sconfitta. In caso di vittoria, il server comunica il tempo impiegato; in caso di sconfitta, rivela la soluzione.
Il server genera una sequenza di quattro cifre casuali tra uno e nove senza ripetizioni, utilizzando un seed basato sulla data di sistema per la funzione rand, e verifica l'unicità di ogni cifra generata.
Il client si connette al server, riceve un messaggio di benvenuto, invia tentativi di indovinare la sequenza, riceve feedback dal server, e continua fino a indovinare la sequenza o esaurire i tentativi.