Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 1
Giochiamo a Mastermind
Mastermind o Master Mind è un gioco da tavolo di abilità mentale (di crittoanalisi) per due giocatori: un giocatore, il "decodificatore", deve
indovinare il codice segreto composto dal suo avversario, detto "codificatore".
Giochiamo a Mastermind
La versione più diffusa del gioco usa dei piolini di 6 colori differenti per la formazione del codice da indovinare.
Dopo che il codificatore ha composto il codice, il decodificatore fa il suo primo tentativo, cercando di indovinare il codice.
Il codificatore, appena il suo avversario ha completato il tentativo, fornisce degli aiuti indicando :
• con piolini neri, il numero di piolini colorati giusti al posto giusto.
• con pioli bianchi, il numero di piolini colorati giusti ma messi al posto sbagliato.
Non viene indicato quali piolini sono giusti o sbagliati ma solo quanti. Se il decodificatore riesce ad indovinare il codice entro il numero di tentativi predeterminati (solitamente 10) allora quest'ultimo vince la partita, altrimenti vince il codificatore.
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 3
Giochiamo a Mastermind
Tentativi del decodificatore
Codice da indovinare Indicazioni del
codificatore
Esempio Mastermind
Analisi e Specifica
Definizione del problema: Sviluppare un programma per giocare con una versione semplificata di Mastermind.
Il codificatore è il computer che formula un codice formato da quattro numeri interi, ciascuno compreso tra 0 e 9.
Il decodificatore deve indovinare i quattro numeri immessi dal codificatore con la stessa sequenza di immissione. Il decodificatore ha a disposizione cinque tentativi.
Il risultato deve indicare quali numeri sono stati indovinati nella giusta posizione:
• se il numero indovinato è giusto e nella stessa posizione del codice ciò è indicato con il segno +
• se il numero indovinato appartiene al codice ma non è nella stessa posizione indicare ciò con il segno =
• se il numero non è nessuno dei tre da indovinare indicare ciò con il segno – Se il codice è indovinato deve essere visualizzato il messaggio: COMPLIMENTI HAI
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 5
CODIFICATORE
3 7 9
9 7 2
DECODIFICATORE
= + -
Risultato
CODICE NON TROVATO – RIPROVA CON UN ALTRO TENTATIVO
Esempio Mastermind
9
3
=
CODIFICATORE
3 7 9
3 7 9
DECODIFICATORE
+ + +
Risultato
COMPLIMENTI HAI VINTO Esempio Mastermind
9
9
+
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 7
Analisi e Specifica
Definizione dei dati del problema:
I: i numeri da indovinare generati a caso dal computer, i numeri indovinati immessi dal decodificatore
Pi: i numeri da indovinare devono essere compresi tra 0 e 9 U: indicazione se ciascun numero indovinato, immesso dal decodificatore, è uguale a quello da indovinare in quella stessa posizione, messaggio “COMPLIMENTI HAI VINTO” o “MI DISPIACE NON HAI VINTO”
Pu: i caratteri per indicare se il numero del decodificatore è giusto o meno sono solo ‘+’, ‘=‘, ‘-’
Tabella delle variabili di ingresso
Esempio Mastermind
Nome variabile Desrizione Tipo
indovina Array monodimensionale con i numeri da indovinare immessi dal codificatore
INT indovinato Array monodimensionale con i numeri
indovinati imessi dal decodificatore
INT
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 9
Tabella delle variabili di uscita
Esempio Mastermind
Nome variabile Desrizione Tipo
pos Array monodimensionale con il risultato confronto coppia numeri del codificatore e decodificatore in ciascuna posizione
CHAR
trovato il decodificatore ha trovato il codice BOOL Tabella delle variabili di algoritmo
Nome variabile Desrizione Tipo
Nrotent Numero tentativi effettuati dal decodificatore INT
i, j indici INT
Progettazione
Descrizione del metodo di elaborazione:
1. Sono generati casualmente dal computer i quattro numeri, ciascuno compreso tra 0 e 9, formanti il codice da indovinare memorizzandoli nello array indovina
2. si inizializza ad uno il numero di tentativi ed a FALSO il valore di trovato
3. mentre il numero di tentativi è minore o uguale a cinque e trovato è FALSO ripetere:
4. si leggono da tastiera i quattro numeri immessi dal decodificatore, memorizzandoli nello array indovinato, verificando che ciascuno di essi è compreso tra 0 e 9 ripetendo l’immissione se il valore non rispetta tale condizione
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 11
5. si confronta ciascun numero del decodificatore con quelli immessi dal codificatore:
a. se un numero del decodificatore in posizione i è uguale a quello nella stessa posizione immesso dal codificatore si pone posi = ‘+’
b. se un numero del decodificatore in posizione i è uguale a quello del codificatore ma non nella stessa posizione si pone posi = ‘=’
c. se un numero del decodificatore in posizione i non è uguale a nessuno di quelli del codificatore si pone posi = ‘-’
6. si stampano i valori di posi
7. se tutti i valori di posi sono uguali a ‘+’ allora si pone la variabile trovato uguale a VERO altrimenti
1. si visualizza il messaggio “CODICE NON TROVATO!
RIPROVA CON UN ALTRO TENTATIVO”;
2. si incrementa di uno il numero di tentativi e si ripetono le istruzioni dal punto 3) in poi
Esempio Mastermind
8. All’uscita dal ciclo, se la variabile trovato è uguale a VERO si stampa il messaggio “COMPLIMENTI HAI VINTO !”, altrimenti il messaggio
“MI DISPISACE NON HAI VINTO !”
9. Si stampano i valori del codice generato dal computer e dell’ultimo codice immesso dal decodificatore
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 13
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int generacasuale (int modulo); // genera codice da indovinare int leggi_indovinato(int i); // legge valori decodificatore // confronta valori codice e decodificatore
void verifica (int indovinato[], int indovina[], char pos[], int CARDI);
// stampa valori codice (codificatore e decodificatore) void stampa (int Codice[], int CARD)
Esempio Mastermind
main ()
{ // MasterMind
int CARD = 4; // è la lunghezza del codice int indovina[CARD];
int indovinato[CARD];
char pos[CARD];
int i,j;
int nroTentativi, trovato;
srand(time(NULL));
for (i=0;i<CARD;i++)
indovina[i] = generacasuale(10);
printf (" Il Codificatore ha inserito il codice da indovinare\n");
printf ("\n DECODIFICATORE \n");
trovato=0;
nroTentativi=1;
while ((nroTentativi <= 5) && (trovato==0)) { printf("\n\nTentativo n.ro %d :\n", nroTentativi);
printf ("Immettere %d numeri compresi tra 0 e 9 \n“, CARD);
for (i=0;i<CARD;i++)
indovinato[i] = leggi_indovinato(i);
verifica(indovinato, indovina, pos, CARD);
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 15
printf ("Le Indicazioni del Codificatore sono:\n");
for (i=0;i<CARD;i++) printf("%c, ", pos[i]);
printf (“\n”);
trovato=1;
for (i=0;i<CARD;i++)
trovato = trovato && (pos[i]=='+‘); //assegna a trovato il risultato della // espressione logica
if (trovato == 0)
{ printf ("CODICE NON TROVATO! \n");
if (nroTentativi<5)
printf ("\n RIPROVA CON UN ALTRO TENTATIVO\n");
nroTentativi++;
}
} // fine while
if(trovato==1)
printf("COMPLIMENTI HAI VINTO !!! \n");
else
printf ("MI DISPIACE NON HAI VINTO !\n");
printf("\nCODICE da Indovinare:");
stampa(indovina, CARD);
printf("\nCodice immesso dal CODIFICATORE\n");
stampa(indovinato, CARD);
system("Pause");
}
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 17
Esempio Mastermind
- il programma in C con sottoprogrammi e array -
#include <stdio.h>
int generacasuale (int modulo) {int indovina;
indovina = rand() % modulo;
return indovina;
}
int leggi_indovinato(int i) { int indovinato;
do
{ printf ("Immetti il numero in posizione %d\n", i);
scanf ("%d", &indovinato);
}
while((indovinato<0)||(indovinato>9));
return indovinato;
}
void verifica (int indovinato[], int indovina[], char pos[], int CARDI) {int i, j;
for(i=0;i<CARDI;i++) pos[i]=' -'; //’azzera’ lo array pos for(i=0;i<CARDI;i++)
{ if (indovinato[i]==indovina[i]) pos[i]='+';
else
for(j=0;j<CARDI;j++) { if (j!=i)
if ((indovinato[i]==indovina[j])) pos[i]= '=';
} } }
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 19
void stampa(int Codice[], int CARD) {int i;
printf("\n");
for(i=0;i<CARD;i++)
printf("Indovinato%d = %d - ",i+1, Codice[i]);
printf("\n");
}