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 tre numeri interi, ciascuno compreso tra 0 e 9.
Il decodificatore deve indovinare i tre numeri immessi dal codificatore con la stessa sequenza di immissione. Il decodificatore ha a disposizione un solo tentativo.
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
MI DISPIACE NON HAI VINTO Esempio Mastermind
CODIFICATORE
3 7 9
3 7 9
DECODIFICATORE
+ + +
Risultato
COMPLIMENTI HAI VINTO
Esempio Mastermind
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 ‘+’, ‘=‘, ‘-’
Esempio Mastermind
Nome variabile Descrizione Tipo
indovina1 Primo numero da indovinare INT indovina2 Secondo numero da indovinare INT indovina3 Terzo numero da indovinare INT indovinato1 Primo numero indovinato INT indovinato2 Secondo numero indovinato INT
indovinato3 Terzo numero indovinato INT
Tabella delle variabili di ingresso
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 9
Nome variabile Descrizione Tipo
pos1 Risultato confronto coppia numeri in prima posizione CHAR pos2 Risultato confronto coppia numeri in seconda posizione CHAR pos3 Risultato confronto coppia numeri in terza posizione CHAR
Tabella delle variabili di uscita
Esempio Mastermind
Progettazione
Descrizione del metodo di elaborazione:
• sono generati casualmente dal computer i tre numeri formanti il codice da indovinare
• se ciascuno di essi è compreso tra 0 e 9 si continua altrimenti si visualizza messaggio di errore e si termina l’esecuzione del programma
• si leggono i tre numeri immessi dal secondo giocatore
• si confronta ciascun numero del secondo giocatore con quelli immessi dal primo giocatore:
• se un numero del secondo giocatore è uguale a quello nella stessa posizione immesso dal primo giocatore si pone posi = ‘+’
• se un numero del decodificatore è uguale a quello del codificatore ma non nella stessa posizione si pone posi = ‘=’
• se un numero del secondo giocatore non è uguale a nessuno di quelli del secondo giocatore ma non nella stessa posizione si pone posi = ‘-’
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 11
• si visualizzano i valori di posi e li si analizza
• se tutti i valori di posi sono uguali a ‘+’ allora si visualizza il messaggio
“COMPLIMENTI HAI VINTO !!! “ altrimenti si visualizza il messaggio
"MI DISPIACE NON HAI VINTO !”
• Si visualizza il codice generato dal computer e quello inserito dal decodificatore
Esempio Mastermind
… si usa la funzione rand() della libreria <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
main () {int a;
printf ("Generazione random di un numero intero \n");
a = rand() %70; //la funzione rand() genera in modo random un numero // intero; l’applicazione di %70 fa in modo che il numero // generato sia modulo 70, ossia compreso tra 0 e 69.
printf ("Numero = %d \n", a);
}
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 13
/* Programma per simulare il risultato del lancio di un dado */
#include <stdio.h>
#include <stdlib.h>
main ()
{ int faccia_dado;
faccia_dado = rand() % 6; //genera un numero casuale fra 0 e 5 faccia_dado++; // per ottenere un valore tra 1 e 6 printf(“Faccia_dado = %d\n",faccia_dado);
system("Pause");
}
Generazione casuale (random) di un numero intero in C
… Se
eseguiamo il programma più volte si ottiene sempre lo stesso risultato!!!… ciò è dovuto al fatto che rand() genera numeri pseudo-casuali, cioè numeri che "sembrano" casuali …
Affinchè ogni esecuzione del programma generi un diverso valore deve essere effettuata la ‘randomizzazione’ della funzione, ovvero inizializzare il generatore di numeri pseudo-casuali usando un valore che viene detto ‘seme’
La randomizzazione può essere fatta usando la funzione srand(), che richiede un parametro di input di tipo unsigned (intero senza segno), che funge da seme.
La funzione time() della libreria time.h è solitamente usata, con parametro NULL (o zero) , per generare il seme; essa fornisce un valore unsigned calcolato in base all'ora corrente del giorno, espressa in secondi.
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 15
// Programma per simulare il risultato del lancio di un dado - randomizzato
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ int lancio1, lancio2;
srand(time(NULL)); //inizializza il generatore di numeri random // lancia il dado 2 volte e mostra il risultato
lancio1= rand() % 6; //genera un numero casuale fra 0 e 5 lancio1++; // per ottenere un valore tra 1 e 6 lancio2= rand() % 6;
lancio2++;
printf(“Primo Lancio = %d \n Secondo Lancio= %d\n", lancio1, lancio2);
system("Pause");
}
Generazione casuale (random) di un numero intero in C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main () {
// MasterMind
int indovina1, indovina2, indovina3;
int indovinato1, indovinato2, indovinato3;
char pos1, pos2, pos3;
printf (“CODIFICATORE\n");
srand(time(NULL));
indovina1 = rand() % 10; // genera un numero casuale compreso tra 0 e 9 indovina2 = rand() % 10;
indovina3 = rand() % 10;
printf (“ Il Codificatore ha inserito il codice da indovinare\n");
Esempio Mastermind
- il programma in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 17
printf (“\n DECODIFICATORE \n");
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
printf (“Immettere il PRIMO numero:\n");
scanf ("%d", &indovinato1);
printf (" Immettere il SECONDO numero:\n");
scanf ("%d", &indovinato2);
printf (" Immettere il TERZO numero:\n");
scanf ("%d", &indovinato3);
if (indovinato1== indovina1) pos1= '+';
else
if ((indovinato1==indovina2) || (indovinato1==indovina3)) pos1= '=';
else pos1= '-';
if (indovinato2==indovina2) pos2= '+';
else
if ((indovinato2==indovina1) || (indovinato2==indovina3)) pos2= '=';
else pos2= '-';
if (indovinato3==indovina3) pos3= '+';
else
if ((indovinato3==indovina1) || (indovinato3==indovina2)) pos3= '=';
else pos3= '-‘;
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 19
printf (“Le Indicazioni del Codificatore sono:\n”);
printf ("%c, %c, %c \n", pos1, pos2, pos3);
if ((pos1=='+') && (pos2=='+') && (pos3=='+')) printf("COMPLIMENTI HAI VINTO !!! \n");
else
printf ("MI DISPIACE NON HAI VINTO !\n");
printf("\nCODICE da Indovinare:");
printf("\nIndovina1 = %d - Indovina2 = %d - Indovina3 = %d\n", indovina1, indovina2, indovina3);
printf("\nCodice immesso dal CODIFICATORE\n");
printf("\nIndovinato1 = %d - Indovinato2 = %d - Indovinato3 = %d\n", indovinato1, indovinato2, indovinato3);
}
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 21
Esempio Mastermind –
nuova versione Analisi e SpecificaDefinizione del problema: Sviluppare un programma per giocare con una versione semplificata di Mastermind.
Il codificatore è il computer che formula un codice formato da tre numeri interi, ciascuno compreso tra 0 e 9.
Il decodificatore deve indovinare i tre numeri immessi dal codificatore con la stessa sequenza di immissione. Il decodificatore ha a disposizione cinque tentativi.
Il risultato deve indicare, per ogni tentativo, 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 VINTO, altrimenti è visualizzato il messaggio: MI DISPIACE NON HAI VINTO
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 ‘+’, ‘=‘, ‘-’
Esempio Mastermind
nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 23
Nome variabile Descrizione Tipo
indovina1 Primo numero da indovinare INT indovina2 Secondo numero da indovinare INT indovina3 Terzo numero da indovinare INT indovinato1 Primo numero indovinato INT indovinato2 Secondo numero indovinato INT
indovinato3 Terzo numero indovinato INT
Tabella delle variabili di ingresso
Esempio Mastermind
nuova versione
Nome variabile Descrizione Tipo
pos1 Risultato confronto coppia numeri in prima posizione CHAR pos2 Risultato confronto coppia numeri in seconda posizione CHAR pos3 Risultato confronto coppia numeri in terza posizione CHAR
Tabella delle variabili di uscita
Esempio Mastermind
nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 25
Nome variabile Descrizione Tipo
Trovato il decodificatore ha trovato il codice BOOL Nrotent Numero tentativi effettuati INT
Tabella delle variabili di algoritmo
Esempio Mastermind
nuova versione
Progettazione
Descrizione del metodo di elaborazione:
1. sono generati casualmente dal computer i tre numeri formanti il codice da indovinare
2. se ciascuno di essi è compreso tra 0 e 9 si continua altrimenti si
visualizza messaggio di errore e si termina l’esecuzione del programma 3. si inizializza ad uno il numero di tentativi ed a FALSO il valore di
trovato
4. mentre il numero di tentativi è minore o uguale a cinque e trovato è FALSO ripetere:
5. si leggono i tre numeri immessi dal secondo giocatore
Esempio Mastermind
nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 27
5. si confronta ciascun numero del secondo giocatore con quelli immessi dal primo giocatore:
a) se un numero del secondo giocatore è uguale a quello nella stessa posizione immesso dal primo giocatore si pone posi = ‘+’
b) se un numero del secondo giocatore è uguale a quello del secondo giocatore ma non nella stessa posizione si pone posi = ‘=’
c) se un numero del secondo giocatore non è uguale a nessuno di quelli del secondo giocatore ma non nella stessa posizione 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
• si visualizza il messaggio “CODICE NON TROVATO! RIPROVA CON UN ALTRO TENTATIVO”;
• si incrementa di uno il numero di tentativi e si ripetono le istruzioni dal punto 4) in poi
Esempio Mastermind
nuova versione
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
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 29
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ // MasterMind
int indovina1, indovina2, indovina3;
int indovinato1, indovinato2, indovinato3;
int pos1, pos2, pos3, risultato;
int nroTentativi, trovato;
printf ("CODIFICATORE\n");
srand(time(NULL));
indovina1 = rand() % 10;
indovina2 = rand() % 10;
indovina3 = rand() % 10;
printf (" Il Codificatore ha inserito il codice da indovinare\n");
Esempio Mastermind - il programma in C
printf ("\n DECODIFICATORE \n");
trovato=0;
nroTentativi=1;
while ((nroTentativi <= 5) && (trovato==0)) {
printf("\n\nTentativo n.ro %d :\n", nroTentativi);
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
printf ("Immetti il PRIMO numero\n");
scanf ("%d", &indovinato1);
printf ("Immetti il SECONDO numero\n");
scanf ("%d", &indovinato2);
printf ("Immetti il TERZO numero\n");
scanf ("%d", &indovinato3);
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 31
if (indovinato1==indovina1) pos1='+';
else
if ((indovinato1==indovina2) || (indovinato1==indovina3)) pos1='=';
else pos1='-';
if (indovinato2==indovina2) pos2='+';
else
if ((indovinato2==indovina1) || (indovinato2==indovina3)) pos2='=';
else pos2='-';
if (indovinato3==indovina3) pos3='+';
else
if ((indovinato3==indovina1) || (indovinato3==indovina2)) pos3='=';
else pos3='-';
printf ("Le Indicazioni del Codificatore sono:\n");
printf("%c, %c, %c \n", pos1, pos2, pos3);
if ((pos1=='+') && (pos2=='+') && (pos3=='+')) trovato=1;
else
{ printf ("CODICE NON TROVATO! \n");
if (nroTentativi < 5)
printf ("\n RIPROVA CON UN ALTRO TENTATIVO\n");
nroTentativi++;
}
} // fine ciclo while if(trovato==1)
printf("COMPLIMENTI HAI VINTO !!! \n");
else
printf ("MI DISPIACE NON HAI VINTO !\n");
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 33
printf("\nCODICE da Indovinare:");
printf("\nIndovina1 = %d - Indovina2 = %d - Indovina3 = %d\n", indovina1, indovina2, indovina3);
printf("\nCodice immesso dal CODIFICATORE\n");
printf("\nIndovinato1 = %d - Indovinato2 = %d - Indovinato3 = %d\n\n", indovinato1, indovinato2, indovinato3);
system("Pause");
}
Lo studente modifichi il programma del gioco Master Mind con massimo 5, o più, tentativi usando un ciclo a condizione finale invece di quello a condizione iniziale …
… e verificando che siano rispettate le precondizioni sui valori di input del decodifcatore, facendo ripetere l’input se esse non sono soddisfatte …
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 35
…
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
do {
printf ("Immetti il PRIMO numero\n");
scanf ("%d", &indovinato1);
}
while ((indovinato1<0) || (indovinato1>9)
…
Modificare il programma del gioco Master Mind:
• permettendo al decodificatore di effettuare al massimo 5 tentativi (usando un ciclo a condizione iniziale …)
• verificando che siano rispettate le precondizioni sui valori di input del decodifcatore, facendo ripetere l’input se esse non sono soddisfatte
• Usando opportuni array per memorizzare:
• I valori del codice
• I valori del decodificatore
• I ‘suggerimenti’ del codificatore (risultati della verifica dei valori del decodificatore rispetto ai valori del codice
• Strutturando il programma con sottoprogrammi associati a:
• Generazione casuale del codice da parte del codificatore
• lettura dei valori del decodificatore
• Verifica dei valori del decodificatore rispetto al codice
Esempio Mastermind
- il programma in C con sottoprogrammi e array -