• Non ci sono risultati.

Giochiamo a Mastermind Mastermind

N/A
N/A
Protected

Academic year: 2021

Condividi "Giochiamo a Mastermind Mastermind"

Copied!
14
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 VINTO, altrimenti è visualizzato il messaggio: MI DISPIACE NON HAI VINTO

(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 posisono 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

… generato più volte sempre lo stesso valore !!! ???

Prima esecuzione

Seconda esecuzione

… altra esecuzione

Terza esecuzione

(8)

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

Elementi di Informatica 15

… 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

// 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

(9)

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

Elementi di Informatica 17

Prima esecuzione

seconda esecuzione

terza esecuzione

altra esecuzione Ora ogni volta sono generati valori differenti

Progettazione

Descrizione del metodo di elaborazione:

• Si usa la funzione srand(time(NULL)) per inizializzare il generatore di numeri random e la funzione rand()%10 per generare un numero compreso tra 0 e 9 da assegnare alle variabili: indovina1, indovina2, indovina3

• si leggono i tre numeri immessi dal secondo giocatore, ovvero i valori di indovinato1, indovinato2, indovinato3

• si confronta il valore di indovinatoicon quello di ciascun indovinai :

• Se indovinatoiè uguale a indovinainella stessa posizione (il valore di i è uguale per i due numeri) si pone posi= ‘+’

• se indovinatoiè uguale a indovinaima non nella stessa posizione (il valore di i NON è uguale per i due numeri) si pone posi= ‘=’

• se indovinatoinon è uguale a nessun indovinaisi pone posi= ‘-’

Esempio Mastermind

(10)

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

Elementi di Informatica 19

• si visualizzano i valori di posi e li si analizza

• se tutti i valori di posisono uguali a ‘+’ allora si visualizza il messaggio

“COMPLIMENTI HAI VINTO !!! “ altrimenti si visualizza il messaggio

"MI DISPIACE NON HAI VINTO !”

• Si visualizzano i valori delle variabili indovina1, indovina2, indovina3 e quelli delle variabili indovinato1, indovinato2, indovinato3

Esempio Mastermind

#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

(11)

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

Elementi di Informatica 21

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

elsepos1 = '-';

if(indovinato2 == indovina2) pos2 = '+';

else

if((indovinato2 == indovina1) || (indovinato2 == indovina3)) pos2 = '=';

elsepos2 = '-';

if(indovinato3 == indovina3) pos3 = '+';

else

if((indovinato3 == indovina1) || (indovinato3 == indovina2)) pos3 = '=';

elsepos3 = '-‘;

(12)

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

Elementi di Informatica 23

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

}

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

(13)

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

Elementi di Informatica 25

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

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

(14)

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

Elementi di Informatica 27

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 Trovato il decodificatore ha trovato il codice BOOL

Tabella delle variabili di uscita

Esempio Mastermind

nuova versione

Nome variabile Descrizione Tipo

Nrotent Numero tentativi effettuati INT

Tabella delle variabili di algoritmo

Esempio Mastermind

nuova versione

LO STUDENTE PROSEGUA LO SVILUPPO DEL PROGRAMMA

Riferimenti

Documenti correlati

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

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

27/2020 del Presidente di questa Sezione di controllo, con il quale, nel rispetto delle indicazioni di carattere generale emanate dal Presidente della Corte dei conti con

3.In caso di attivazione di nuovi servizi o di processi di riorganizzazione finalizzati all'accrescimento dei livelli qualitativi e quantitativi dei servizi esistenti, ai quali

Stipendio tabellare Posizione parte fissa Posizione parte variabile Retribuzione di risultato Altro* TOTALE ANNUO LORDO. € 55.397,39 € 36.299,70 € 72.599,40 € 21.779,82

Tavola 8.2 - Coppie di partner da 18 a 49 anni per numero di figli desiderato dalla donna, numero di figli desiderato dalla coppia, numero di figli avuti dalla donna,

Esercizio 1 Eseguire le seguenti operazioni con i numeri complessi e rappresentare il risultato nel piano di

[r]