Il gioco
E' una gara alla quale partecipano due "atleti".
Prima di iniziare i due giocatori concordano il salto massimo ammesso durante la corsa: un numero compreso tra 3 e 99 (estremi compresi).
Per fissare le idee supponiamo di gareggiare fissando il salto massimo a 10.
In questo caso l'obiettivo è raggiungere il numero 110 (salto massimo * 11).
I due giocatori, alternandosi, dovranno scegliere un numero compreso tra 1 e 10 e sommarlo al totale fino a quel momento raggiunto (inizialmente il totale vale 0).
Vince chi raggiunge l'obiettivo.
Esempio:
5 (5) 6 (11) 9 (20) 8 (28) 10 (38) 1 (39) 9 (48) 10 (58) 10 (68) 5 (73) 9 (82) 10 (92) 7 (99) 2 (101) 9 (110)
In nero le mosse del primo giocatore (giocatore nero), in rosso quelle del secondo (giocatore rosso). In parentesi il montante (cioè il totale fino a quel momento raggiunto). In questo esempio il giocatore nero vince perché raggiunge il valore obiettivo (110).
Consegna
Implementare un programma in grado di giocare alla corsa con i numeri.
Il programma deve richiedere al concorrente umano con quale salto massimo giocare e chi deve iniziare il gioco, quindi deve alternarsi con lui nelle mosse.
Strategia
Per fissare le idee supponiamo di aver scelto come salto massimo il valore 10. In questo caso la strategia vincente è quella di procedere cercando di ottenere un montante che sia multiplo di 11.
Questo è sempre possibile se la prima chiamata è dell'avversario in caso contrario occorre sfruttare l'errore dell'avversario.
La sequenza vincente, in termini di montante, è 11, 22, 33, 44, 55, 66, 77, 99 ,110.
In qualsiasi punto della sequenza ci si inserisce è possibile assicurarsi la vittoria.
In generale, per un generico salto massimo con valore m, si dovrà cercare di ottenere un montante multiplo di m+1.
Esempio di esecuzione
Il programma quando è avviato mostra i seguenti messaggi:
Con quale salto massimo desideri giocare? 10
Comincio io a giocare? (S/N) S
Computer : 5
Montante : 5
Umano : 10
Montante : 15
Computer : 8
Montante : 23
Umano : 2
Montante : 25
...
Progettazione
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COMPUTER 1
#define UOMO 0
// Riceve in input il montante e il salto massimo
// Stampa a video una scritta del tipo
// Computer: 5 (25)
// Restituisce il nuovo montante
// Il valore da sommare al montante deve essere minore o
// uguale di salto ed e' scelto in modo
// che il nuovo montante sia multiplo di (salto+1).
// Se non e' possibile ottenere il multiplo si incrementa
// il montante di un numero casuale maggiore di 0 e <= salto
int TurnoComputer(int montante, int salto)
{
}
// Riceve in input il montante e il salto massimo
// Stampa a video una scritta del tipo
// Uomo:
// e attende che il giocatore inserisca un numero minore
// o uguale salto
// Stampa a video e restituisce il nuovo montante.
int TurnoUomo(int montante, int salto)
{
}
int main() {
int s, TurnoCorrente, montante=0, obiettivo;
char c;
srand(time(NULL));
printf("Con quale salto massimo vuoi giocare? ");
do {
scanf("%d", &s);
if (s<3 || s>99)
printf("Valore non ammesso: il salto massimo deve essere compreso tra 3 e 99: ");
} while (s<3 || s>99);
printf("Comincio io a giocare S/N ");
do {
c = getchar();
} while (c!='S' && c!='s' && c!= 'N' && c!= 'n');
obiettivo = s*11;
printf("Vince chi raggiunge %d\n\n", obiettivo);
if (c=='S' || c=='s')
TurnoCorrente=COMPUTER;
else
TurnoCorrente=UOMO;
do {
if (TurnoCorrente == COMPUTER){
montante = TurnoComputer(montante, s);
TurnoCorrente = UOMO;
}
else {
montante = TurnoUomo(montante, s);
TurnoCorrente = COMPUTER;
}
printf("\n");
} while (montante<obiettivo);
printf("\n");
if (TurnoCorrente==UOMO)
printf("HO VINTO!!!!\n");
else
printf("COMPLIMENTI HAI VINTO!!!!\n");
return 0;
}
Test
Modulo TurnoComputer
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COMPUTER 1
#define UOMO 0
// Riceve in input il montante e il salto massimo
// Stampa a video una scritta del tipo
// Computer: 5
// Montante: 5
// Restituisce il nuovo montante
// Il valore da sommare al montante deve essere minore o
// uguale di salto ed e' scelto in modo
// che il nuovo montante sia multiplo di (salto+1).
// Se non e' possibile ottenere il multiplo si incrementa
// il montante di un numero casuale maggiore di 0 e <= salto
int TurnoComputer(int montante, int salto)
{
}
int main()
{
int montante;
montante = TurnoComputer(0, 10);
printf("Montante atteso compreso tra 1 e 10. Montante = %d\n\n", montante);
montante = TurnoComputer(0, 5);
printf("Montante atteso compreso tra 1 e 5. Montante = %d\n\n", montante);
montante = TurnoComputer(0, 3);
printf("Montante atteso compreso tra 1 e 3. Montante = %d\n\n", montante);
montante = TurnoComputer(15, 10);
printf("Montante atteso 22. Montante = %d\n\n", montante);
montante = TurnoComputer(15, 6);
printf("Montante atteso 21. Montante = %d\n\n", montante);
montante = TurnoComputer(21, 6);
printf("Montante atteso compreso tra 22 e 27. Montante = %d\n\n", montante);
return 0;
}
Modulo TurnoUomo
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COMPUTER 1
#define UOMO 0
// Riceve in input il montante e il salto massimo
// Stampa a video una scritta del tipo
// Computer: 5
// Montante: 5
// Restituisce il nuovo montante
// Il valore da sommare al montante deve essere minore o
// uguale di salto ed e' scelto in modo
// che il nuovo montante sia multiplo di (salto+1).
// Se non e' possibile ottenere il multiplo si incrementa
// il montante di un numero casuale maggiore di 0 e <= salto
int TurnoUomo(int montante, int salto)
{
}
int main()
{
int montante;
montante = TurnoUomo(0, 10);
printf("Montante atteso compreso tra 1 e 10. Montante = %d\n\n", montante);
montante = TurnoUomo(0, 5);
printf("Montante atteso compreso tra 1 e 5. Montante = %d\n\n", montante);
montante = TurnoUomo(0, 3);
printf("Montante atteso compreso tra 1 e 3. Montante = %d\n\n", montante);
montante = TurnoUomo(15, 10);
printf("Montante atteso 22. Montante = %d\n\n", montante);
montante = TurnoUomo(15, 6);
printf("Montante atteso 21. Montante = %d\n\n", montante);
montante = TurnoUomo(21, 6);
printf("Montante atteso compreso tra 22 e 27. Montante = %d\n\n", montante);
return 0;
}
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 98. Esercizi
Paragrafo: 12. Progettazione guidata
Approfondimento: 01. Corsa con i numeri
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. Introduttivi - 02. Quesiti strutturati - 03. Interpretazione del codice - 04. Diagrammi di flusso - 05. Array - 06. Tipi numerici - 07. Programmazione strutturata - 08. Caratteri e stringhe - 09. File - 10. Numeri casuali - 11. Riepilogativi - 12. Progettazione guidata
Indice degli approfondimenti: 01. Corsa con i numeri - 02. Strike and balls - 03. Raggi cosmici