Più o meno ho capito come si articola il gioco.
- innanzitutto ti consiglio di scrivere il codice in modo più ordinato, in questo modo risulterà anche per me più facile da leggere. Intendo qualcosa del genere:
#include<iostream>
#include<windows.h>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
struct carte
{
int valore;
int punti;
char seme;
};
carte briscola;
carte mazzo[40];
carte terra[2];
carte manoPC[3];
carte manoGiocatore[3];
carte presaPC[40];
carte presaG[40];
int puntiPc;
int puntiGiocatore;
bool mazzierePc;
bool primoGiocatore;
bool primaUmano;
bool prendeGiocatore;
bool prendePc;
int x = 6;
void carteMazzo()
{
for(int i = 0; i < 40; i++)
{
mazzo[i].valore = i % 10 + 1;
int seme = i / 10 + 1;
switch(seme)
{
case 0: mazzo[i].seme = 'D';
break;
case 1: mazzo[i].seme = 'B';
break;
case 2: mazzo[i].seme = 'C';
break;
case 3: mazzo[i].seme = 'S';
break;
}
}
}
void mescolaMazzo()
{
int i, j;
srand(time(0));
for(i = 0; i < 40; i++)
{
mazzo[i];
}
for(i = 0; i < 40; i++)
{
j = rand() % 40 + 1;
carte seme = mazzo[i];
mazzo[i] = mazzo[j];
mazzo[j] = seme;
}
}
void mostraBriscola()
{
briscola.valore = mazzo[39].valore;
briscola.seme = mazzo[39].seme;
cout << endl << "La briscola e' : " << briscola.valore << " di " << briscola.seme << endl;
}
int punteggio()
{
carteMazzo();
int p;
int valore;
for(int i = 0; i < 40; i++)
{
valore = mazzo[i].valore;
switch(valore)
{
case 1 : mazzo[i].punti = 11;
break;
case 2 : mazzo[i].punti = 0;
break;
case 3 : mazzo[i].punti = 10;
break;
case 10 : mazzo[i].punti = 4;
break;
case 9 : mazzo[i].punti = 3;
break;
case 8 : mazzo[i].punti = 2;
break;
case 7 : mazzo[i].punti = 0;
break;
case 6 : mazzo[i].punti = 0;
break;
case 5 : mazzo[i].punti = 0;
break;
case 4 : mazzo[i].punti = 0;
break;
default : mazzo[i].punti = 0;
}
}
return(p);
}
bool inizioPartita()
{
bool primoGiocatore;
srand(time(NULL));
primoGiocatore = rand() % 2;
cout << endl << endl << primoGiocatore << endl << endl;
if(primoGiocatore == true)
{
cout << "Inizia la partita l'umano'\n";
}
else
{
cout << "Inizia la partita il calcolatore\n";
}
return primoGiocatore;
}
void distribuireCarte()
{
if(mazzierePc)
{
for(int i = 0; i < 3; i++)
{
manoGiocatore[i] = mazzo[i * 2];
manoPC[i] = mazzo[i * 2 + 1];
}
}
else
{
for(int i = 0; i < 3; i++)
{
manoGiocatore[i] = mazzo[i * 2 + 1];
manoPC[i] = mazzo[i * 2];
}
}
}
int scegliCarta()
{
int scelta;
for(int j = 0; j < 3; j++)
{
cout << j + 1 << setw(5) << manoGiocatore[j].valore << " di " << manoGiocatore[j].seme << endl;
}
cout << "Quale carta desideri giocare? \n";
cin >> scelta;
if(primoGiocatore)
{
terra[0].valore = manoGiocatore[scelta - 1].valore;
terra[0].seme = manoGiocatore[scelta - 1].seme;
terra[0].punti = manoGiocatore[scelta - 1].punti;
}
else
{
terra[1].valore = manoGiocatore[scelta - 1].valore;
terra[1].seme = manoGiocatore[scelta - 1].seme;
terra[1].punti = manoGiocatore[scelta - 1].punti;
}
cout << "Hai tirato" << manoGiocatore[scelta - 1].valore << manoGiocatore[scelta - 1].seme;
return(scelta - 1);
}
bool primaMaggiore()
{
char seme1, seme2, br;
br = briscola.seme;
int punti1, punti2, valore1, valore2 ;
bool semeUguale, briscolaSeme1, briscolaSeme2;
bool carta1Maggiore, carta2Maggiore;
valore1 = terra[0].valore;
valore2 = terra[1].valore;
seme1 = terra[0].seme;
seme2 = terra[1].seme;
punti1 = terra[0].punti;
punti2 = terra[1].punti;
semeUguale = (seme1 == seme2);
carta1Maggiore = ((punti1 > punti2) || (punti1==punti2 && valore1 > valore2));
carta2Maggiore = ((punti1 < punti2) || (punti1==punti2 && valore1 < valore2));
briscolaSeme1 = (seme1 == br);
briscolaSeme2 = (seme2 == br);
if((semeUguale && carta1Maggiore) || (!semeUguale && !briscolaSeme2))
{
return(carta1Maggiore);
}
}
void presa(int U, int C)
{
bool carta1Maggiore;
if(primoGiocatore == true)
{
if(primaMaggiore)
{
puntiGiocatore = puntiGiocatore + (terra[0].punti) + (terra[1].punti);
manoGiocatore[U].seme = mazzo[x].seme;
manoGiocatore[U].punti = mazzo[x].punti;
manoGiocatore[U].valore = mazzo[x].valore;
x++;
cout << endl << "Prende l'umano. " << "I suoi punti sono: " << puntiGiocatore << endl;
cout << "-------------------------------------------" << endl;
}
else
{
puntiPc = puntiPc + terra[0].punti + terra[1].punti;
manoPC[C].seme = mazzo[x].seme;
manoPC[C].punti = mazzo[x].punti;
manoPC[C].valore = mazzo[x].valore;
x++;
cout << endl << "Prende il calcolatore " << "I suoi punti sono: " << puntiPc << endl;
cout << "-------------------------------------------" << endl;
}
}
if(primoGiocatore == false)
{
if(primaMaggiore)
{
puntiPc = puntiPc + terra[0].punti + terra[1].punti;
manoPC [C].seme = mazzo[x].seme;
manoPC [C].punti = mazzo[x].punti;
manoPC [C].valore = mazzo[x].valore;
x++;
cout << endl << "Prende il calcolatore " << "I suoi punti sono: " << puntiPc << endl;
cout << "-------------------------------------------" << endl;
}
else
{
puntiGiocatore = puntiGiocatore + terra[0].punti + terra[1].punti;
manoGiocatore[U].seme = mazzo[x].seme;
manoGiocatore[U].punti = mazzo[x].punti;
manoGiocatore[U].valore = mazzo[x].valore;
x++;
cout << endl << "Prende l'umano. " << "I suoi punti sono: " << puntiGiocatore << endl;
cout << "-------------------------------------------" << endl;
}
}
}
int main()
{
}
- le librerie cmath, windows.h e cstdlib non servono;
- analizziamo una funzione alla volta. Partiamo da carteMazzo() (a cui darei un nome più significativo, tipo prepara_mazzo()). Se poni seme=i/10+1, poichè i varia tra 0 e 39, la variabile seme varierà tra 1 e 4, mentre i casi dello switch comprendono 0, 1, 2 e 3;
- nello switch presente nella funzione punteggio() non sfrutti bene il caso default. Se ci ragioni ti renderai conto che escluso il default bastano solo 5 casi;
- perchè creare una funzione punteggio() se non la usi? Perchè tale funzione dovrebbe ritornare un intero, se si limita a riempire il campo valore? Inoltre il valore di ritorno assume un valore pseudocasuale dal momento che alla variabile p non viene assegnato nessun valore. In ogni caso il mio consiglio è quello di accorpare la funzione punteggio() nella funzione carteMazzo();
- la funzione srand() va chiamata una sola volta, quindi fallo all'inizio del main;
- veniamo alla funzione mescolaMazzo()... a cosa serve il seguente frammento di codice?
for(i = 0; i < 40; i++)
{
mazzo[i];
}
j assumerà valori che vanno da 1 a 40, ma gli indici delle carte nel mazzo vanno da 0 a 39.
*** L'algoritmo da te utilizzato per mescolare il mazzo non è il massimo dal punto di vista probabilistico, in quanto non tutte le possibili configurazioni del mazzo avranno la stessa probabilità di realizzarsi. Un modo per ottenere una configurazione del mazzo davvero casuale potrebbe essere il seguente:
- selezioniamo una carta a caso dal mazzo di 40 carte (che chiameremo mazzo_1) e la mettiamo da parte come per formare un nuovo mazzo (che chiameremo mazzo_2);
- selezioniamo una carta a caso tra le 39 carte restanti nel mazzo_1 e la mettiamo in cima al mazzo_2;
- selezioniamo una carta a caso tra le 38 carte restanti nel mazzo_1 e la mettiamo in cima al mazzo_2;
- proseguiremo in questo modo finché nel mazzo_1 resterà una sola carta.
Prova ad implementare un algoritmo che segua il suddetto esempio "pratico".
Inizia ad apportare i suddetti aggiustamenti, poi ci dedicheremo alle altre funzioni e al modo in cui strutturare la partita.
EDIT:
***