PDA

View Full Version : [c++] Briscola, consigli per migliorare il programma.


jokers85
31-08-2013, 13:29
Ho realizzato questo gioco della briscola in c++, e vorrei migliorarlo un po', qualche consiglio?
Tenete presente che ancora non ho studiato ne le classi ne i puntatori.
P.s.:Se non capite bene il codice ditelo che aggiungo qualche commento.
P.p.s: Il programma non da errori di compilazione.

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <time.h>

using namespace std;
// mano: quella parte di gioco in cui i 2 giocatori tirano una carta ciascuno
// partita: quella fase di gioco in cui si usa tutto il mazzo
// gioco
struct carte
{ int val;
char seme;
} briscola;

carte mazzo [46];
carte terra [2];
carte in_manoC[3];
carte in_manoU[3];
carte preseC[40];
carte preseU[40];
int puntC =0;
int puntU =0;
bool mazziereC;
bool primaU;
int cima_mazzo = 6;
int mani;

void stampamazzo() //funzione stampa mazzo a video
{cout << '\n';
for (int i=0; i<40; i++)
cout << mazzo[i].val << mazzo[i].seme << '\t' ;
cout << '\n';
}

void creamazzo () //funzione creazione mazzo
{ int aus;
for (int i=0; i<40; i++)
{mazzo[i].val = i%10 +1 ;
aus = i/10;
switch (aus)
{ case 0: mazzo[i].seme = 'd' ; break;
case 1: mazzo[i].seme = 'c' ; break;
case 2: mazzo[i].seme = 'b' ; break;
case 3: mazzo[i].seme = 's' ; break;
}
}
for (int i=40; i<46; i++)
{mazzo[i].val = 0 ;
mazzo[i].seme = ' ';
}
}

void mescolamazzo () //funzione mescolamento carte mazzo
{ int scambi, pos1, pos2, ausV;
char ausS;
cout << "quanti scambi facciamo?\n scambi = ";
cin >> scambi;
for (int i=0; i<scambi; i++)
{pos1 = rand()% 40;
pos2 = rand()% 40;
ausV = mazzo[pos1].val;
ausS = mazzo[pos1].seme;
mazzo[pos1].val = mazzo[pos2].val;
mazzo[pos1].seme = mazzo[pos2].seme;
mazzo[pos2].val = ausV;
mazzo[pos2].seme = ausS;
}
}

void stampamano() //funzione stampa carte in mano al giocatore e al pc + briscola
{cout << "\n-----------------------------mano " << mani+1 << "--------------------\n\ncarteUmano : ";
for (int i=0; i<3; i++)
cout << in_manoU[i].val << in_manoU[i].seme << " | ";
cout << "# BRISCOLA: " << briscola.val << briscola.seme << " # carteC : ";
for (int i=0; i<3; i++)
cout << in_manoC[i].val << in_manoC[i].seme << " | ";
cout << "\n\n";
}

int punteggio (int vn) //funzione calcolo punteggio
{int p;
switch (vn)
{ case 1: p=11 ; break;
case 3: p=10 ; break;
case 10: p=4 ; break;
case 9: p=3 ; break;
case 8: p=2 ; break;
default: p=0 ;
}
return (p);
}

bool supera1 (int vn1, int vn2) //funzione determina carta valore maggiore
{ int p1, p2;
bool m1;
p1 = punteggio(vn1);
p2 = punteggio(vn2);
if ((p1 != 0) || (p2 != 0)) m1 = (p1 > p2);
else m1 = (vn1 > vn2);
return (m1);
}

bool prendeI() //funzione determina chi prende
{ bool magg1, br2, eg ;
magg1 = supera1(terra[0].val,terra[1].val);
br2 = (briscola.seme==terra[1].seme);
eg = (terra[0].seme==terra[1].seme);
return ((eg && magg1)||(!eg && !br2));
}

bool tiraprima () //funzione determina primo a giocare
{ bool primo;
primo = rand() % 2;
if (primo) cout << "\n gioca per primo l'umano\n " ;
else cout << "\n gioca per primo il computer \n " ;// inverti Umsano /Comp
return primo;
}

void dai_carte () //funzione assegnamento carte
{ if (mazziereC)
for (int i=0; i<3; i++)
{in_manoU[i].val = mazzo[i*2].val;
in_manoU[i].seme = mazzo[i*2].seme;
in_manoC[i].val = mazzo[i*2+1].val;
in_manoC[i].seme = mazzo[i*2+1].seme;
}
else
for (int i=0; i<3; i++)
{in_manoU[i].val = mazzo[i*2+1].val;
in_manoU[i].seme = mazzo[i*2+1].seme;
in_manoC[i].val = mazzo[i*2].val;
in_manoC[i].seme = mazzo[i*2].seme;
}
}

int richiestaU () //funzione richiesta carte al giocatore
{int pos;
cout << " Quale carta giochi? 1 o 2 o 3 ? Pos carta = ";
cin >> pos;
if (primaU)
{terra[0].val = in_manoU[pos-1].val;
terra[0].seme = in_manoU[pos-1].seme;
}
else
{terra[1].val = in_manoU[pos-1].val;
terra[1].seme = in_manoU[pos-1].seme;
}
cout << "L'Umano ha tirato " << in_manoU[pos-1].val << in_manoU[pos-1].seme;
cout << '\n';
return(pos-1);
}

int CgiocaII() //funzione giocata pc
{ terra[1].val = in_manoC[mani%3].val;
terra[1].seme = in_manoC[mani%3].seme;
cout << "Il computer ha tirato " << in_manoC[mani%3].val << in_manoC[mani%3].seme;
cout << '\n';
return (mani%3);
}

int CgiocaI() //funzione giocata pc 1
{ terra[0].val = in_manoC[mani%3].val;
terra[0].seme = in_manoC[mani%3].seme;
cout << "Il computer ha tirato " << in_manoC[mani%3].val << in_manoC[mani%3].seme;
cout << '\n';
return (mani%3);
}

void chiprende(int ncU,int ncC) //funzione determina presa
{if (prendeI()==primaU)
{puntU=puntU+punteggio(terra[0].val)+punteggio(terra[1].val);
in_manoU[ncU].seme=mazzo[cima_mazzo].seme;
in_manoU[ncU].val =mazzo[cima_mazzo].val ;
cima_mazzo++;
in_manoC[ncC].seme=mazzo[cima_mazzo].seme;
in_manoC[ncC].val =mazzo[cima_mazzo].val ;
cima_mazzo++;
cout << " prende U ----------- puntiU =" << puntU << " puntiC = " << puntC << '\n';
primaU=true;
}
else
{puntC=puntC+punteggio(terra[0].val)+punteggio(terra[1].val);
in_manoC[ncC].seme=mazzo[cima_mazzo].seme;
in_manoC[ncC].val =mazzo[cima_mazzo].val ;
cima_mazzo++;
in_manoU[ncU].seme=mazzo[cima_mazzo].seme;
in_manoU[ncU].val =mazzo[cima_mazzo].val ;
cima_mazzo++;
cout << "prende C ------------ puntiU=" << puntU << " puntiC= " << puntC << '\n';
primaU=false;
}
//stampamano();
}

void mano () //funzione mano
{ int numU, numC;
if (primaU){
numU=richiestaU();
numC=CgiocaII();
}
else
{numC=CgiocaI();
numU=richiestaU();
}
chiprende(numU,numC);
//cout << "\n--------------------------------------------------------\n";
}

void partita () //funzione partita
{ cima_mazzo=6;
dai_carte();
primaU=mazziereC;
for (int i=0; i<20; i++)
{mani=i;
stampamano();
mano();
}
cout << "\n <<<<<<<<<<<fine partita>>>>>>>>>>>>\n\n";
}

void mostrabriscola () //determina briscola
{ briscola.val = mazzo[39].val;
briscola.seme = mazzo[39].seme;
cout << "\n briscola = " << briscola.val << briscola.seme << '\n';
}

main(int argc, char *argv[])
{ creamazzo();
stampamazzo();
srand (time (0));
mazziereC=tiraprima();
//stampamano();
while (!((puntC!=puntU)&& ((puntC>119) || (puntU>119))))
{
mescolamazzo();
stampamazzo();
mostrabriscola();
partita();
mazziereC = ! mazziereC;
}
if (puntU>puntC) cout << "ha vinto l'Umano\n\n";
else cout << "ha vinto il Computer\n\n";
system("PAUSE");
return EXIT_SUCCESS;
}