• Non ci sono risultati.

Giochiamo a Mastermind Mastermind

N/A
N/A
Protected

Academic year: 2021

Condividi "Giochiamo a Mastermind Mastermind"

Copied!
10
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 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

(3)

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

+

(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 ‘+’, ‘=‘, ‘-’

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

(5)

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

(6)

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

(7)

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

(8)

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

}

(9)

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

} } }

(10)

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

}

Riferimenti

Documenti correlati

– 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

• letto da tastiera il valore della variabile voto (in caso di Lode si immette il valore 31) e si verifica che il valore sia compreso tra 18 e 31, altrimenti si ripete

Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare la media di una sequenza di N numeri interi immessi dall’utente. Definizione dei

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`

È' 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

• Con il dividendo decimale: procedi come nella divisione con i numeri interi; metti la virgola al quoziente quando abbassi la prima cifra decimale. • Con il