1 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Esempio
Analisi e Specifica
Definizione del problema: Si vuole giocare a Morra Cinese contro il PC.
I tipici simboli del gioco sono simulati con numeri interi:
1 = carta - 2 = forbici - 3 = sasso.
Il giocatore immette il numero corrispondente al simbolo che vuole giocare da tastiera,
il numero (ovvero il simbolo) che gioca il PC viene generato in maniera casuale usando la funzione rand() del linguaggio C.
Si confrontano i due simboli giocati e si dichiara il vincitore, in base alle tipiche regole del gioco:
• carta vs forbici => vince forbici
• carta vs sasso => vince carta
• forbici vs sasso => vince sasso
• se i due simboli sono uguali non vince nessuno
Esempio
Definizione dei dati del problema:
I: Simbolo del giocatore, simbolo del PC
Pi: il simbolo deve essere uno dei tre ammissibili: carta, forbici, sasso – ovvero un numero intero compreso tra 1 e 3 (estremi inclusi) U: Vincitore;
Pu: il vincitore non può essere diverso dal giocatore o dal PC
3 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
Esempio
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome Variabile Descrizione Tipo
segnoMio numero intero indicante uno dei tre simboli della Morra Cinese scelto dal giocatore
INT
segnoPC numero intero indicante uno dei tre simboli della Morra Cinese scelto dal PC
INT
Nome Variabile Descrizione Tipo
vincitore numero intero indicante il vincitore della sfida: il valore 1 (uno) indica il giocatore, il valore 0 (zero) indica il PC
INT
Tabella delle variabili di algoritmo
Nome Variabile Descrizione Tipo
x Indica se il giocatore vuole giocare: 1 = SI , < > 1 =NO INT
Si vuole visualizzare un messaggio di benvenuto al gioco
************************************
* Morra Cinese *
* Vuoi giocare? (1 - SI, <>1 NO) *
************************************
che segno scegli (1=Carta – 2=Forbici – 3=Sasso) ?
5 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
... Associare sottoprogrammi alle parti in rosso
Progettazione
Descrizione del metodo di elaborazione:
Si visualizza un messaggio di benvenuto al gioco e si chiede al giocatore se vuole giocare, Se il giocatore immette il valore 1 si gioca altrimenti il programma termina.
Viene chiesto al giocatore di immettere il numero corrispondente al simbolo che vuole giocare, viene letto il valore immesso ed assegnato a segnoMio.
Se il numero immesso non è uno dei tre validi, viene richiesta la re-immissione del valore fin quando questo non è valido,
altrimenti si va avanti nel gioco ed in tal caso è generato in modo casuale il numero corrispondente al simbolo giocato dal PC ed assegnato a segnoPC.
Si confrontano i valori di segnoMio e segnoPC :
Se sono uguali si visualizza un messaggio indicante la parità del gioco ed il programma termina,
Altrimenti
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 base al valore di vincitore si visualizza chi ha vinto e i valori delle due variabili segnoMio e segnoPC
Si visualizza un messaggio di arrivederci.
/* Morra Cinese */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// visualizza benvenuto int welcome();
// verifica quale giocatore vince
void verifica_vincitore(int segno1, int segno2, int *vince);
// visualizza segni giocati void stampa_segno(int segno);
Morra Cinese - il programma in C con sottoprogrammi
7 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
int main() // Morra Cinese {
int x, segnoMio, segnoPC, vincitore;
x = welcome();
if (x==1)
// il giocatore sceglie il suo segno {do
{printf("che segno scegli? 1=Carta – 2=Forbici – 3=Sasso\n");
scanf("%d", &segnoMio);
if ((segnoMio!=1)&&(segnoMio!=2)&&(segnoMio!=3)) printf("ERRORE: IMMESSO VALORE NON VALIDO!\n");
}
while((segnoMio!=1)&&(segnoMio!=2)&&(segnoMio!=3));
//si genera in modo casuale il segno giocato dal PC
srand(time(0));
segnoPC= 1 + rand()%3;
// è chiamata la procedure che verifica chi ha vinto
verifica_vincitore(segnoMio, segnoPC, &vincitore);
if (vincitore == 1)
printf("Vince SegnoMio:\n ");
else
if (vincitore == -1)
printf("Vince PC: \n ");
else (printf("PARI\n");
9 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
// si visualizzano i segni giocati printf(" SegnoMio = ");
stampa_segno(segnoMio);
printf(" SegnoPC = ");
stampa_segno(segnoPC);
} // fine if (x==1)
printf("\n\n Arrivederci - Ti aspettiamo ancora per giocare alla Morra Cinese\n\n\n");
system("Pause");
} // fine programma principale
int welcome() {int x;
printf("\t***********************************\n");
printf("\t* Morra Cinese *\n");
printf("\t* Vuoi giocare? (1 - SI, <>1 NO)*\n");
printf("\t***********************************\n");
scanf("%d", &x);
return x;
}
11 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
void verifica_vincitore(int segno1,int segno2,
int *vince) { if (segno1 == segno2)
vince = 0; // PARI else
{if (((segno1 == 1) && (segno2 == 3)) ||
// vince carta vs sasso
((segno1 == 2) && (segno2 == 1)) ||
// vince forbici vs carta ((segno1 == 3) && (segno2 == 2))
// vince sasso vs forbici )
*vince = 1; // vince segnoMIO else
*vince = -1; // vince segnoPC }
}
void stampa_segno(int segno) { switch(segno)
{case 1: {printf("Carta\n"); break;}
case 2: {printf("Forbici\n"); break;}
case 3: {printf("Sasso\n"); break;}
} }