• Non ci sono risultati.

Giochiamo a Mastermind Mastermind

N/A
N/A
Protected

Academic year: 2021

Condividi "Giochiamo a Mastermind Mastermind"

Copied!
18
0
0

Testo completo

(1)

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.

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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= '-‘;

(10)

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);

}

(11)

Prof. G. A. Di Lucca - Univ. del Sannio

Elementi di Informatica 21

Esempio Mastermind –

nuova versione 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 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

(12)

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

(13)

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

(14)

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

(15)

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);

(16)

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");

(17)

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 …

(18)

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 -

Riferimenti

Documenti correlati

È' stato quindi approvato un progetto pilota denominato MasterMind per l'impiego di uno strumento di auto aiuto computerizzato e la video conferenza che si sono

Struttura con Sistema di Gestione Certificato da CERMET secondo la norma Uni EN ISO 9001:2008 Dirigente Responsabile Dott.. 011 4017058 urp.collegno@aslto3.piemonte.it

– nella prima fase del clock si legge dalla memoria (fetch) – nella seconda fase si esegue l’istruzione (execute).. • Comporta la presenza di un registro intermedio (IR) su

In ambiente scientifico i dati sono spesso in formato UK: con il punto come separatore dei decimali, il nostro sistema operativo usa la.. notazione ITA

Definizione del problema: Scrivere un programma che ricevuti in input tre numeri interi trova quello con valore massimo Definizione dei dati del problema:. I: i tre numeri di

Si assegna alla variabile vincitore il valore 1 se segnoMio batte segnoPC (in base alle regole della Morra Cinese), altrimenti si assegna alla variabile vincitore il valore 0. In

Allora la soluzione ottima duale non cambia e, per la dualit` a forte, neanche la soluzione ottima del primale, cio` e l’aggiunta di due nuove alternative non inficia l’ottimalit`

Se ora consideriamo il sistema Hamiltoniano corrispondente a quello Lagrangiano considerato fin’ora, possiamo studiare la stabilit`a dei suoi equilibri attraverso la teoria KAM e,