PDA

View Full Version : Aiuto programma in C++


GiuspeCar
10-05-2013, 14:09
Salve a tutti, sono un novizio della programmazione e vi scrivo per chiedervi aiuto riguardo un programma che ho scritto e che non ne vuole sapere di funzionare!
Il codice è questo:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using namespace std;

void casuale ( int [][13]);
void qcasuale ( int [][13]);
void ecasuale ( int [][13]);
void mano ( int [][13], const char *[],const char *[]);
void mano2 ( int [][13], const char *[],const char *[]);
void terra (int [][13], const char *[],const char *[]);
int i=0;

int main()
{
const char *seme[4]= { "Cuori", "Quadri", "Picche", "Fiori" };
const char *faccia[13] = { "Asso", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove","Dieci","Jack","Regina","Re"};
int mazzo[4][13]={0};
srand ( time(0));

casuale(mazzo);
cout << " La mia mano è:";
mano(mazzo, faccia, seme);
qcasuale(mazzo);
cout << " La tua mano è:";
mano2(mazzo, faccia, seme);
ecasuale(mazzo);
cout << "Le carte a terra sono:";
terra (mazzo, faccia, seme);
return 0;
}

void casuale ( int wmazzo[][13])
{
int riga, colonna;
for(int carta=1; carta <=2; carta++)
{
do{
riga= rand() % 4;
colonna= rand() % 13;
} while ( wmazzo[riga][colonna]!=0);
wmazzo[riga][colonna]=carta;
}}

void qcasuale ( int qmazzo[][13])
{
int qriga, qcolonna;
for(int qcarta=1; qcarta <=3; qcarta++)
{
do{
qriga= rand() % 4;
qcolonna= rand() % 13;

} while ( qcarta!=2);
qmazzo[qriga][qcolonna]=qcarta;
}}

void ecasuale ( int emazzo[][13])
{
int eriga, ecolonna;
for(int ecarta=1; ecarta <=5; ecarta++)
{
do{
eriga= rand() % 4;
ecolonna= rand() % 13;
} while (ecarta!=5);
emazzo[eriga][ecolonna]=ecarta;
}}




void mano (int wmazzo[][13], const char *wfaccia[], const char *wseme[])
{
for ( int carta=1; carta <=2; ++carta)
for(int riga=0; riga <=3; riga++)
for( int colonna=0; colonna <=13; colonna++)
if (wmazzo[riga][colonna]==carta)
cout << wfaccia[colonna] << " di " << wseme[riga] << endl;
}

void mano2 (int qmazzo[][13], const char *qfaccia[], const char *qseme[])
{
for ( int qcarta=1; qcarta <=2; ++qcarta)
for(int qriga=0; qriga <=3; qriga++)
for( int qcolonna=0; qcolonna <=13; qcolonna++)
if (qmazzo[qriga][qcolonna]==qcarta)
cout << qfaccia[qcolonna] << " di " << qseme[qriga] << endl;
}

void terra (int emazzo[][13], const char *efaccia[], const char *eseme[])
{
for ( int ecarta=1; ecarta <=5; ++ecarta)
for(int eriga=0; eriga <=3; eriga++)
for( int ecolonna=0; ecolonna <=13; ecolonna++)
if (emazzo[eriga][ecolonna]==ecarta)
cout << efaccia[ecolonna] << " di " << eseme[eriga] << endl;}


In pratica sarebbe una versione " grezza" del classico gioco di poker Texas Hold'em.
Quando lo compilo non mi da alcun errore, digito ./a.out per farlo partire, si avvia ma mi risponde soltanto dicendomi le due carte della prima mano, quando bisogna passare a " mano2" resta lì, fermo, con il puntatore che lampeggia come se non avesse ancora finito il ciclo.
Sapete aiutarmi? Grazie :D .
[ Non credo possa essere rilevante, ma uso Linux versione 13.04).

vendettaaaaa
10-05-2013, 14:41
do{
qriga= rand() % 4;
qcolonna= rand() % 13;

} while ( qcarta!=2);

Loop infinito.

GiuspeCar
10-05-2013, 14:49
do{
qriga= rand() % 4;
qcolonna= rand() % 13;

} while ( qcarta!=2);

Loop infinito.

Questo l'avevo intuito, solo che non ho idea di che condizione mettere nel while per far terminare il ciclo. L'unica cosa che mi viene in mente è di " legarla" a qriga o qcolonna, solo che così facendo falserei il risultato, credo.

vendettaaaaa
10-05-2013, 16:31
Ah boh, ho solo trovato un bug, non mi sono messo di certo a studiare il codice, mi spiace.

[Kendall]
10-05-2013, 16:35
Questo l'avevo intuito, solo che non ho idea di che condizione mettere nel while per far terminare il ciclo. L'unica cosa che mi viene in mente è di " legarla" a qriga o qcolonna, solo che così facendo falserei il risultato, credo.

Il punto è: cosa vuoi realizzare in quel ciclo do-while? Cioè, perchè vuoi ripetere quelle due assegnazioni, e per quante volte vuoi farlo?

GiuspeCar
10-05-2013, 16:52
;39445393']Il punto è: cosa vuoi realizzare in quel ciclo do-while? Cioè, perchè vuoi ripetere quelle due assegnazioni, e per quante volte vuoi farlo?

Nel ciclo do-while ci sta la funzione rand() che prende dei valori casuali delle righe e delle colonne affinché mi esca sempre una carta diversa.
Il ciclo devo farlo minimo due volte nella funzione qcasuale e minimo cinque in quella ecasuale.

[Kendall]
10-05-2013, 16:54
Nel ciclo do-while ci sta la funzione rand() che prende dei valori casuali delle righe e delle colonne affinché mi esca sempre una carta diversa.
Il ciclo devo farlo minimo due volte nella funzione qcasuale e minimo cinque in quella ecasuale.

Ok, ma minimo in base a cosa?
Cioè, quel ciclo si ferma se viene ripetuto 2/5 volte oppure in quale altra condizione?

GiuspeCar
10-05-2013, 17:32
;39445494']Ok, ma minimo in base a cosa?
Cioè, quel ciclo si ferma se viene ripetuto 2/5 volte oppure in quale altra condizione?

Il ciclo in qcasuale è legato alla mano2, che sarebbe quella dell'altro giocatore che deve avere due carte, quindi c'è bisogno che mi dia almeno due carte in maniera casuale, perciò il ciclo deve ripetersi minio due volte.
Quello in ecasuale è legato alle carte sul " tavolo", che sono cinque e per lo stesso discorso di prima deve ripetersi almeno cinque volte.

Il problema è che non so quale e in che modo mettere una condizione all'interno di questi, e non posso farlo con for ( diktat del prof.).