Avevo implementato tempo fa il blackjack, l'ho modificato per seguire la tua struttura in modo che puoi vedere le cose che ti mancano: il calcolo del valore degli assi (se 1 o 11), che le carte siano uniche (non posso avere l'asso di cuori se c'è l'ha il banco...), le regole per raddoppiare (split) e altro.
C++:
int carte_usate[52] = {0};
int carta()
{
int carta;
do
{
carta = rand() % 52;
} while (carte_usate[carta] != 0);
carte_usate[carta] = 1;
return carta;
}
string seme(int carta)
{
const char* semi[] = { "Cuori", "Quadri", "Fiori", "Picche" };
int seme = (carta / 13);
return string(semi[seme]);
}
string nome_carta(int carta)
{
const char* map[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
int v = (carta % 13);
return string(map[carta % 13]) + " di " + seme(carta);
}
bool can_split(const vector<int>& mano)
{
int carta1 = mano.at(0);
int carta2 = mano.at(1);
carta1 = min(carta1 % 13, 10);
carta2 = min(carta2 % 13, 10);
return (carta1 == carta2);
}
int punteggio(const vector<int> &mano)
{
int totale = 0, assi = 0;
for (int c : mano)
{
int i = min((c % 13) + 1, 10);
if (i == 1)
assi++;
else
totale += i;
}
if (assi > 0)
{
if (assi > 1)
totale += assi - 1;
totale += (totale + 11 > 21) ? 1 : 11;
}
return totale;
}
bool busted(const vector<int>& mano)
{
int score = punteggio(mano);
bool busted = (score > 21);
if (busted)
cout << "Hai sballato! " << score << endl;
return busted;
}
void win(int amount)
{
cout << "Hai vinto " << amount << endl;
}
void lose(int amount)
{
cout << "Hai perso " << amount << endl;
}
void visualizza(const vector<int> &mano)
{
for (int c : mano)
cout << nome_carta(c) << endl;
cout << "Totale: " << punteggio(mano) << endl;
}
void blackjack()
{
vector<int> mano, mano_split, banco;
bool play = true, mano1 = true, mano2 = false;
int scelta, scommessa, score_mano1, score_mano2, score_banco;
cout << "Benvuto/a in blackjack" << endl;
cout << "Quanto vuoi puntare? ";
cin >> scommessa;
srand(time(0));
mano.push_back(carta());
mano.push_back(carta());
banco.push_back(carta());
banco.push_back(carta());
cout << "La tua mano e':" << endl;
visualizza(mano);
cout << "Carta visibile del banco: " << nome_carta(banco.at(0)) << endl;
do
{
cout << endl << "1. prendi una carta. 2. stai. 3. raddoppia: ";
cin >> scelta;
switch (scelta)
{
case 1:
mano.push_back(carta());
cout << "La tua mano e':" << endl;
visualizza(mano);
if (!mano_split.empty())
{
mano_split.push_back(carta());
cout << "Seconda giocata: " << endl;
visualizza(mano_split);
}
if (punteggio(mano) >= 21 && (mano_split.empty() || punteggio(mano_split) >= 21))
play = false;
break;
case 2:
play = false;
break;
case 3:
if (mano.size() != 2)
{
cout << "Non puoi raddoppiare dopo aver preso una carta" << endl;
break;
}
if (!can_split(mano))
{
cout << "Per raddoppiare le carte devono avere lo stesso valore" << endl;
break;
}
// Sposta la seconda carta nella seconda giocata
mano_split.push_back(mano.at(1));
mano.erase(mano.end() - 1);
// Richiedi due carte per le due giocate
mano.push_back(carta());
mano_split.push_back(carta());
cout << "La tua mano e':" << endl;
visualizza(mano);
cout << "Seconda giocata: " << endl;
visualizza(mano_split);
scommessa *= 2;
mano2 = true;
break;
default:
cout << "Scelta non valida" << endl;
break;
}
} while (play);
score_mano1 = punteggio(mano);
score_mano2 = punteggio(mano_split);
if (mano2 && !(mano2 = !busted(mano_split)))
lose(scommessa / 2);
if (!(mano1 = !busted(mano)))
lose(score_mano2 == 0 ? scommessa : scommessa / 2);
if (!mano1 && !mano2)
return;
// Essendo 1v1 il banco prende carta finché non batte almeno una giocata o sballa
score_banco = punteggio(banco);
while (score_banco < score_mano1 && (score_mano2 == 0 || score_banco < score_mano2))
{
banco.push_back(carta());
score_banco = punteggio(banco);
}
cout << "Il banco ha: " << endl;
visualizza(banco);
if (score_banco > 21)
{
cout << "Il banco ha sballato! " << score_banco << endl;
win(scommessa);
return;
}
if (score_mano2 != 0 && score_mano2 > score_banco)
win(scommessa / 2);
else if (score_mano2 != 0)
lose(scommessa / 2);
if (score_mano1 > score_banco)
win(score_mano2 != 0 ? scommessa / 2 : scommessa);
else
lose(score_mano2 != 0 ? scommessa / 2 : scommessa);
}