Ci avventuriamo in un gioco ben noto a tutti: la tombola! Solo che vogliamo realizzarne una, senza troppe pretese, in C++. Ottimo esercizio per imparare a suddividere il problema in sottofunzioni ed utilizzare i vettori in modo ampio.
Indice dei contenuti
Come vogliamo realizzare la tombola
Vogliamo fare una partita ristretta a due giocatori con due sole cartelle. L’idea è di creare le cartelle con dei numero interi casuali, ovviamente da 1 a 90. A questo punto inizia un ciclo che estrae 90 palline sempre in modo casuale, tiene memoria dei numeri usciti in modo da non estrarre/dichiarare un numero già precedentemente uscito. Ogni numero viene controllato sulle due schede giocatore ed eventualmente contrassegnato/eliminato dalla scheda. Vince, ovviamente, il primo che contrassegna/elimina tutti i numeri dalla sua scheda. Aggiungiamo qualche elemento, messaggio, temporizzazione per simulare l’estrazione in tempo reale!
Creare le cartelle
Il codice per creare le cartelle è intuitivo ma magari non proprio banale da realizzare per un programmatore in erba. L’idea è quella di riempire un vettore grande un certo numero di elementi, che qui definiamo con delle costanti ad inizio programma, NCARTELLA. Quindi proviamo con un ciclo infinito ad estrarre un numero a caso da 1 a 90, scorriamo il vettore della cartella per verificare che non sia già stato inserito/pescato, lo scriviamo e usciamo dal ciclo con uno stratagemma. Ci creiamo una variabile booleana o intera, da valorizzare a 1, se il numero estratto non soddisfa i requisiti, il ciclo continua finché si trova un numero valido e si pone la variabile ok a 0 o altro valore per uscire dal ciclo. Se il numero è ok, lo scrivo nella cartella e passo al successivo posto da riempire allo stesso modo: estrazione infinita finché trovo un numero buono.
void creaCartella(int _cartella[])
{
int ok;
int numero =0 ;
for (int i=0; i< NCARTELLA; i++)
{
ok = 1;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int j= 0; j < NCARTELLA; j++)
{
if (_cartella[j] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_cartella[i] = numero;
}
}
Estrai numero tabellone principale
Ricalca alcune dinamiche della creazione della singola cartella di gioco. L’idea è che abbiamo un vettore di 90 elementi che deve contenere i numeri da 1 a 90 estratti a caso ma ripetuti una sola volta. Quindi ogni volta che devo pescare un numero, uso la funzione rand() ma controllo che il numero estratto non sia già stato inserito nel vettore tabellone così da estrarne eventualmente un altro valido. Il numero valido viene così posizionato nella prima casella disponibile di cui tiene traccia l’indice nestrazioni.
int estraiNumero(int _tabellone[])
{
int ok = 1;
int numero;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int i= 0; i < NTABELLONE; i++)
{
if (_tabellone[i] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_tabellone[nestrazioni]= numero;
nestrazioni++;
return numero;
}
Il codice completo
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
void creaCartella(int []);
void stampaCartella(int []);
int controllaCartella(int [], int);
int controllaVincente(int []);
int estraiNumero(int []);
int const NTABELLONE= 90;
int const NCARTELLA= 15;
int const TEMPOESTRAZIONE = 1; //1 sec
int nestrazioni=0;
int main()
{
srand(time(NULL));
int cartella1 [NCARTELLA];
int cartella2 [NCARTELLA];
int tabellone [NTABELLONE];
int i=0;
int estratto;
creaCartella(cartella1);
creaCartella(cartella2);
cout << "Scegli un giocatore tra 1 e 2" <<endl;
cout << "Giocatore 1: ";
stampaCartella(cartella1);
cout << "Giocatore 2: ";
stampaCartella(cartella2);
cout << "Premi un tasto per cominciare le estrazioni "<<endl;
getchar();
//estraggo 90 numeri
while(i < 90)
{
sleep(TEMPOESTRAZIONE); //per rendere il gioco realistico
estratto = estraiNumero(tabellone);
printf("Estratto: %d\n",estratto);
i++;
if (controllaCartella(cartella1, estratto))
{
printf("Cartella1 preso %d!\n", estratto);
}
if (controllaCartella(cartella2, estratto))
{
printf("Cartella2 preso! %d \n", estratto);
}
if (controllaVincente(cartella1))
{
cout << "Giocatore 1 TOMBOLA!";
break;
}
if (controllaVincente(cartella2))
{
cout << "Giocatore 2 TOMBOLA!";
break;
}
}
return 0;
}
void creaCartella(int _cartella[])
{
int ok;
int numero =0 ;
for (int i=0; i< NCARTELLA; i++)
{
ok = 1;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int j= 0; j < NCARTELLA; j++)
{
if (_cartella[j] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_cartella[i] = numero;
}
}
void stampaCartella(int _cartella[])
{
for (int j= 0; j < NCARTELLA; j++)
{
printf("%d ",_cartella[j]);
}
printf("\n");
}
/* Controllo se nella cartella è presente il numero estratto
* se presente, per semplicità al suo posto scrivo 0
*/
int controllaCartella(int _cartella[], int _estratto)
{
int trovato = 0;
for (int i= 0; i < NCARTELLA; i++)
{
if (_cartella[i] == _estratto )
{
_cartella[i] = 0;
trovato = 1;
}
}
return trovato;
}
/* Se nella cartella ci sono tutti 0, abbiamo un vincitore
*
*/
int controllaVincente(int _cartella[])
{
int vincente = 1;
for (int i= 0; i < NCARTELLA; i++)
{
if (_cartella[i] != 0 )
{
vincente = 0;
}
}
return vincente;
}
int estraiNumero(int _tabellone[])
{
int ok = 1;
int numero;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int i= 0; i < NTABELLONE; i++)
{
if (_tabellone[i] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_tabellone[nestrazioni]= numero;
nestrazioni++;
return numero;
}
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
void creaCartella(int []);
void stampaCartella(int []);
int controllaCartella(int [], int);
int controllaVincente(int []);
int estraiNumero(int []);
int const NTABELLONE= 90;
int const NCARTELLA= 15;
int const TEMPOESTRAZIONE = 1; //1 sec
int nestrazioni=0;
int main()
{
srand(time(NULL));
int cartella1 [NCARTELLA];
int cartella2 [NCARTELLA];
int tabellone [NTABELLONE];
int i=0;
int estratto;
creaCartella(cartella1);
creaCartella(cartella2);
cout << "Scegli un giocatore tra 1 e 2" <<endl;
cout << "Giocatore 1: ";
stampaCartella(cartella1);
cout << "Giocatore 2: ";
stampaCartella(cartella2);
cout << "Premi un tasto per cominciare le estrazioni "<<endl;
getchar();
//estraggo 90 numeri
while(i < 90)
{
sleep(TEMPOESTRAZIONE); //per rendere il gioco realistico
estratto = estraiNumero(tabellone);
printf("Estratto: %d\n",estratto);
i++;
if (controllaCartella(cartella1, estratto))
{
printf("Cartella1 preso %d!\n", estratto);
}
if (controllaCartella(cartella2, estratto))
{
printf("Cartella2 preso! %d \n", estratto);
}
if (controllaVincente(cartella1))
{
cout << "Giocatore 1 TOMBOLA!";
break;
}
if (controllaVincente(cartella2))
{
cout << "Giocatore 2 TOMBOLA!";
break;
}
}
return 0;
}
void creaCartella(int _cartella[])
{
int ok;
int numero =0 ;
for (int i=0; i< NCARTELLA; i++)
{
ok = 1;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int j= 0; j < NCARTELLA; j++)
{
if (_cartella[j] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_cartella[i] = numero;
}
}
void stampaCartella(int _cartella[])
{
for (int j= 0; j < NCARTELLA; j++)
{
printf("%d ",_cartella[j]);
}
printf("\n");
}
/* Controllo se nella cartella è presente il numero estratto
* se presente, per semplicità al suo posto scrivo 0
*/
int controllaCartella(int _cartella[], int _estratto)
{
int trovato = 0;
for (int i= 0; i < NCARTELLA; i++)
{
if (_cartella[i] == _estratto )
{
_cartella[i] = 0;
trovato = 1;
}
}
return trovato;
}
/* Se nella cartella ci sono tutti 0, abbiamo un vincitore
*
*/
int controllaVincente(int _cartella[])
{
int vincente = 1;
for (int i= 0; i < NCARTELLA; i++)
{
if (_cartella[i] != 0 )
{
vincente = 0;
}
}
return vincente;
}
int estraiNumero(int _tabellone[])
{
int ok = 1;
int numero;
while (ok == 1)
{
numero = rand() % 90 +1;
ok = 0;
for (int i= 0; i < NTABELLONE; i++)
{
if (_tabellone[i] == numero)
ok = 1; //ne ho trovato almeno uno uguale
}
}
_tabellone[nestrazioni]= numero;
nestrazioni++;
return numero;
}
Ultima modifica 16 Gennaio 2022