Ho scritto questo programma di briscola con annessa strategia.
void strategia ()
{
if (manoU[N-1].s == br.s)
{
if (manoU[N-1].p == 0) //se ha punteggio 0 cerca di rispondere con la carta di minor valore
{
if (manoC[0].p == 0 && manoC[0].s != br.s)
n = 0;
else if (manoC[1].p == 0 && manoC[0].s != br.s)
n = 1;
else if (manoC[2].p == 0 && manoC[0].s != br.s)
n = 2;
else if (manoC[0].p == 2 && manoC[0].s != br.s)
n = 0;
else if (manoC[1].p == 2 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 2 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].s != 'n')
n = 0;
else if (manoC[1].s != 'n')
n = 1;
else n = 2;
}
else if (manoU[N-1].p == 10)
{
if (manoU[N-1].s == manoC[0].s && manoC[0].p == 11)
n = 0;
else if (manoU[N-1].s == manoC[1].s && manoC[1].p == 11)
n = 1;
else if (manoU[N-1].s == manoC[2].s && manoC[2].p == 11)
n = 2;
else if (manoC[0].p == 0 && manoC[0].s != br.s)
n = 0;
else if (manoC[1].p == 0 && manoC[0].s != br.s)
n = 1;
else if (manoC[2].p == 0 && manoC[0].s != br.s)
n = 2;
else if (manoC[0].p == 2 && manoC[0].s != br.s)
n = 0;
else if (manoC[1].p == 2 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 2 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].s != 'n')
n = 0;
else if (manoC[1].s != 'n')
n = 1;
else n = 2;
}
else {
if (manoC[0].p == 0 && manoC[0].s != br.s) //void
n = 0;
else if (manoC[1].p == 0 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 0 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].p == 2 && manoC[0].s != br.s)
n = 0;
else if (manoC[1].p == 2 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 2 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].s != 'n')
n = 0;
else if (manoC[1].s != 'n')
n = 1;
else n = 2;
}
}
else if (manoU[N-1].p == 10 || manoU[N-1].p == 11) // se ha un 10 o un tre cerca di tirare la briscola o vai liscio
{ //si sa già che non possono essere di briscola perché sarebbero rientrati nel caso precedente
if (manoC[0].p > manoU[N-1].p && manoC[0].s == manoU[N-1].s)
n = 0;
else if (manoC[1].p > manoU[N-1].p && manoC[1].s == manoU[N-1].s)
n = 1;
else if (manoC[2].p > manoU[N-1].p && manoC[2].s == manoU[N-1].s)
n = 2;
else if (manoC[0].s == br.s)
n = 0;
else if (manoC[1].s == br.s)
n = 1;
else if (manoC[2].s == br.s)
n = 2;
else if (manoC[0].p == 0 && manoC[0].s != br.s) //se ho una carta liscia che non sia briscola
n = 0;
else if (manoC[1].p == 0 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 0 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].s != 'n')
n = 0;
else if (manoC[1].s != 'n')
n = 1;
else n = 2;
}
else if (manoU[N-1].p == 2) //se tira una donna
{
asso (); //cerca di prendela prima con asso, tre, re o cavallo ed eventualmente entra nelle void lorenzo per tirare la carta di minor valore;
tre ();
re ();
cavallo ();
lorenzo ();
}
else if (manoU[N-1].p == 3) //se tira un cavallo
{
asso ();
tre ();
re ();
lorenzo ();
}
else if (manoU[N-1].p == 4) //se tira un re
{
asso ();
tre ();
lorenzo ();
}
else
{
asso ();
tre ();
re ();
cavallo ();
donna ();
if (manoC[0].p == 0 && manoC[0].s != br.s) //senò cerca una carta che non sia briscola liscia
n = 0;
else if (manoC[1].p == 0 && manoC[1].s != br.s)
n = 1;
else if (manoC[2].p == 0 && manoC[2].s != br.s)
n = 2;
else if (manoC[0].s != 'n' && manoC[0].s != br.s && manoC[0].p < 10) //punteggio più basso che non si briscola
n = 0;
else if (manoC[1].s != 'n' && manoC[1].s != br.s && manoC[1].p < 10)
n = 1;
else if (manoC[2].s != 'n' && manoC[2].s != br.s && manoC[2].p < 10)
n = 2;
else if (manoC[0].s != 'n')
n = 0;
else if (manoC[1].s != 'n')
n = 1;
else n = 2;
}
}
Le funzioni asso, tre, cavallo, donna e re, sono scritte tutte in questa forma
void asso ()
{
if (manoC[0].v == 1 && manoC[0].s == manoU[N-1].s) //vedi poi se puoi farlo con un dieci
n = 0;
else if (manoC[1].v == 1 && manoC[1].s == manoU[N-1].s)
n = 1;
else if (manoC[2].v == 1 && manoC[2].s == manoU[N-1].s)
n = 2;
}
e servono a far sì che, se il computer può prendere, lo faccia con la carta più alta possibile diversa da briscola. Sono scritte nello stesso modo di tutto il resto del codice solo che non funzionano. Non riconosce le condizioni.
Es. Se U: 8spade - 2mazze - 3mazze ___ Br. 8danari ___ C: 9coppe - 4coppe - 1spade
SE le mani sono queste, se U (umano, da input) tira 8s, C dovrebbe rispondere 1s, perché ho detto che se hai seme uguale e valore == 1, devi tirare quella carta. Ma surclassa completamente sia la void asso e sia le successive, per entrare nella void lorenzo e tirare di solito una carta liscia o comunque facendo quello che questa prevede.
C'è una spiegazione ragionevole a questo? Io non riesco a trovarla. Spero di essere stata chiara e che il codice sia comprensibile (e che questa sia ora la sezione giusta). Grazie in anticipo.