PDA

Visualizza la versione completa : [C++] Gioco Della Tombola


Miki18
19-03-2010, 18:11
Ciao a tutti!

Ho un problema, sto facendo il gioco della tombola, ma mi sono bloccato...Ora vi spiego:

Ho costruito il tabellone con una matrice contendente i 90 numeri, ho generato a random i numeri da estrarre e li ho salvati in un vettore. Il problema è che non riesco a evidenziare i numeri che ho caricato nel vettore e contemporaneamente lasciare bianchi i numeri non ancora estratti...

Sapete come darmi una mano??

Grazie mille per eventuali rispote! :D

oregon
19-03-2010, 18:48
Originariamente inviato da Miki18
... Il problema è che non riesco a evidenziare i numeri che ho caricato nel vettore e contemporaneamente lasciare bianchi i numeri non ancora estratti...

Cioè ?


Sapete come darmi una mano??

Dovresti postare e spiegarci il codice già scritto e spiegare meglio quello che non sai scrivere ...

Miki18
19-03-2010, 19:37
Originariamente inviato da oregon
Cioè ?



Dovresti postare e spiegarci il codice già scritto e spiegare meglio quello che non sai scrivere ...

Si hai ragione ho spiegato male :incupito:
Allora, dovrei stampare il tabellone colorando (uno alla volta) i numeri che ho caricato nel vettore(che sono 90). Oppure sostituire i numeri dellla matrice con quelli colorati del vettore.

In poche parole il risultato dovrebbe essere questo, solo che a scuola non ho mai usato molte di queste istruzioni:
http://forum.html.it/forum/showthread.php?threadid=1312806&highlight=Tombola

Io per il momento ho fatto questo (stavo provando a modificare delle cose ma sono bloccato):


#include <iostream.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
//serve per i colori (anche la libreria di windows)
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

int mat[9][10], i, j, k, aux=1, aux1=11, aux2=2, auxk, aux3;
int vett[89];
bool flag=false;
cout<<" +------------------+ "<<endl;
cout<<" | La Tombola |"<<endl;
cout<<" +------------------+ "<<endl;
cout<<"\n---------------------------------------------\n";
cout<<endl;

srand(time(NULL));
//stampo il tabellone
for(i=0; i<9; i++)
{
for(j=0; j<10; j++)
{
mat[i][j]=aux;
aux++;
}
}
aux=16;
for(i=0; i<9; i++)
{
for(j=0; j<10; j++)
{
if (mat[i][j]>0&&mat[i][j]<10 && mat[i][j]!=6)
cout<<" ";
if (mat[i][j]==6)
cout<<" | ";
if (mat[i][j]==aux)
{
cout<<" | ";
aux=aux+10;
}
if (mat[i][j]==aux1)
{

aux1=aux1+10;
cout<<endl;
}
cout<<mat[i][j]<<" ";

}
if (i==aux2)
{
cout<<endl;
cout<<"\n---------------------------------------------\n";
aux2=aux2+3;
}
}

//genero numeri random, per l'estratione e li metto in un vettore
for(i=0;i<90;i++)
{
flag=false;
aux=(rand()%90+1);
for(j=0;j<i&&i!=0;j++)
{
if (vett[j]==aux)
flag=true;
}
if(flag==false)
vett[i]=aux;
else
i--;
}
//stampo vettore contenente i numeri random *****Provvisorio*****
cout<<"Il vettore e:"<<endl;
for(i=0;i<90;i++)
cout<<" " <<vett[i];
//faccio scomparire dal tabellone i numerì estratti
system ("PAUSE");

for(k=0; k<90;k++)
{
aux1=11;
aux2=2;
aux=16;

for(i=0; i<9; i++)
{
for(j=0; j<10; j++)
{
if (mat[i][j]>0&&mat[i][j]<10 && mat[i][j]!=6)
cout<<" ";
if (mat[i][j]==6)
cout<<" | ";
if (mat[i][j]==aux)
{
cout<<" | ";
aux=aux+10;
}
if (mat[i][j]==aux1)
{

aux1=aux1+10;
cout<<endl;
}

if(mat[i][j]==vett[k])
{
mat[i][j]=0;
cout<<mat[i][j]<<" ";
}
else
cout<<mat[i][j]<<" ";

}
if (i==aux2)
{
cout<<endl;
cout<<"\n---------------------------------------------\n";
aux2=aux2+3;
}
}
system("PAUSE");
}

system ("PAUSE");
return 0;
}

antotan
19-03-2010, 20:12
Una piccola curiosità. Leggendo il codice ho notato questo:



for(i=0;i<90;i++)
{
flag=false;
aux=(rand()%90+1);
for(j=0;j<i&&i!=0;j++)
{
if (vett[j]==aux)
flag=true;
}
if(flag==false)
vett[i]=aux;
else
i--;
}


Se non ho capito male, tu generi un valore random e se questo non è già presente nel vettore, lo aggiungi, giusto?
Se si, sprechi molto tempo. Teoricamente, il tuo programma potrebbe andare in loop all'infinito. Ti basta caricare il vettore con i numeri da 1 a 90 e poi mischiarlo:



#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
int numbers[90];
const int swaps = 200;

// CARICO
for(int i = 1; i <= 90; i++)
numbers[i-1] = i;

// MISCHIO
srand((unsigned int)time(NULL));
for(int i = 0; i < swaps; i++)
{
int i = (rand() % 90);
int j = (rand() % 90);
swap(numbers[i], numbers[j]);
}

// STAMPA
for(int i = 0; i < 90; i++)
cout << numbers[i] << " | ";
cout << endl;
}


:ciauz:

Miki18
19-03-2010, 20:31
Originariamente inviato da antotan
Una piccola curiosità. Leggendo il codice ho notato questo:

Se non ho capito male, tu generi un valore random e se questo non è già presente nel vettore, lo aggiungi, giusto?
Se si, sprechi molto tempo. Teoricamente, il tuo programma potrebbe andare in loop all'infinito. Ti basta caricare il vettore con i numeri da 1 a 90 e poi mischiarlo:

:ciauz:

Grazie, ho imparato una cosa nuova!

theboss280489
19-03-2010, 21:16
Antonan 6 un mito :-)

Miki18
19-03-2010, 21:53
COmunque il mio problema iniziale non è ancora stato risolto :bhò:

antotan
19-03-2010, 22:20
Originariamente inviato da theboss280489
Antonan 6 un mito :-)

eheh magari :D



Allora, dovrei stampare il tabellone colorando (uno alla volta) i numeri che ho caricato nel vettore(che sono 90). Oppure sostituire i numeri dellla matrice con quelli colorati del vettore.


Non so se ho capito bene ma in pratica tu vuoi fare questo



- crea matrice 9X10 che rappresenta il tabellone
- crea vettore dei numeri da estrarre

do
estrai prossimo numero dal vettore
stampa il tabellone colorando tutti i numeri estratti
while(estratti < 90)


Ad esempio, stampi il tabellone, poi estrai il 9 (che è il primo elemento di quelli casuali generati) e stampi il tabellone, colorando il 9 in rosso (ad esempio).
Giusto?

Miki18
19-03-2010, 22:37
Originariamente inviato da antotan
eheh magari :D



Non so se ho capito bene ma in pratica tu vuoi fare questo



- crea matrice 9X10 che rappresenta il tabellone
- crea vettore dei numeri da estrarre

do
estrai prossimo numero dal vettore
stampa il tabellone colorando tutti i numeri estratti
while(estratti < 90)


Ad esempio, stampi il tabellone, poi estrai il 9 (che è il primo elemento di quelli casuali generati) e stampi il tabellone, colorando il 9 in rosso (ad esempio).
Giusto?

Proprio così! :mem:
È possibile farlo?? :sbav:

antotan
19-03-2010, 22:59
Certo, devi solo rivedere la logica del tuo programma.
Se sai usare le struct, puoi creare una struct Num così:



struct Num
{
int n;
bool flag;
};


Il flag indica se un numero è stato estratto o meno.
Al posto di



int table[9][10]


avrai



Num table[9][10]


Quando carichi il tabellone farai:



int counter = 1;
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
table[j].n = counter++;
table[i][j].flag = false;
}
}


settando i numeri e dicendo che ancora non sono estratti (ovvio, lo stati caricando).
Poi farai un ciclo per estrarre i 90 numeri dal vettore numbers (quello mischiato casualmente).



counter = 0;
do {
system("cls");

int number = numbers[counter++];
cout << "Estraggo il numero... " << number << endl << endl;

for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
if(table[i][j].n == number)
{
table[i][j].flag = true;
break;
}
}
}

printTable(table, hConsole);

cin.get();
} while(counter < 90);


Settando il flag a true, indicherai che il numero è stato estratto.
La funzione printTable ha la seguente forma:



void printTable(Num table[9][10], HANDLE& hConsole)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
if(table[i][j].n < 10)
cout << " ";

if(table[i][j].flag)
SetConsoleTextAttribute(hConsole, 2);

cout << table[i][j].n << " ";
SetConsoleTextAttribute(hConsole, 15);

if( (table[i][j].n % 5 == 0) && (table[i][j].n % 10 != 0) )
cout << " | ";
else if(table[i][j].n % 10 == 0)
cout << endl;

if(table[i][j].n % 30 == 0)
{
cout << endl;
for(int k = 0; k < 45; k++, cout << "-");
cout << endl;
}
}
}
}


SetConsoleTextAttribute(hConsole, 2); vuol dire colorare di verde,
SetConsoleTextAttribute(hConsole, 15); vuol dire colorare di bianco.
Nota che colori di verde solo se il flag è settato a true.
Mi sono permesso di modificare la stampa della tabella. Infatti non hai bisogno di variabili ausiliarie (le tue aux).
Se il numero è divisibile per 30 (30, 60, 90) stampi la linea di trattini.
Se il numero è divisibile per 5 ma non per 10 (5, 15....) stampi gli spazi, la barra e altri spazi.
Se il numero è divisibile per 10, stampi la newline.

Tutto assieme:



#include <iostream>
#include <windows.h>

using namespace std;

struct Num
{
int n;
bool flag;
};

void printTable(Num table[9][10], HANDLE& hConsole)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
if(table[i][j].n < 10)
cout << " ";

if(table[i][j].flag)
SetConsoleTextAttribute(hConsole, 2);

cout << table[i][j].n << " ";
SetConsoleTextAttribute(hConsole, 15);

if( (table[i][j].n % 5 == 0) && (table[i][j].n % 10 != 0) )
cout << " | ";
else if(table[i][j].n % 10 == 0)
cout << endl;

if(table[i][j].n % 30 == 0)
{
cout << endl;
for(int k = 0; k < 45; k++, cout << "-");
cout << endl;
}
}
}
}

int main()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

Num table[9][10];
int numbers[90];
const int swaps = 200;
int counter;

// CARICO
for(int i = 1; i <= 90; i++)
numbers[i-1] = i;

// MISCHIO
srand((unsigned int)time(NULL));
for(int i = 0; i < swaps; i++)
{
int i = (rand() % 90);
int j = (rand() % 90);
swap(numbers[i], numbers[j]);
}

// CREO IL TABELLONE
counter = 1;
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
table[i][j].n = counter++;
table[i][j].flag = false;
}
}

system("cls");
printTable(table, hConsole);

counter = 0;
do {
system("cls");

int number = numbers[counter++];
cout << "Estraggo il numero... " << number << endl << endl;

for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
if(table[i][j].n == number)
{
table[i][j].flag = true;
break;
}
}
}

printTable(table, hConsole);

cin.get();
} while(counter < 90);
}

Loading