Noixe
31-01-2011, 09:24
Salve,
ho scritto questo programmino che consente di giocare a briscola.
Il gioco è a riga di comando perché mi interessava solo l'aspetto algoritmico e implementare una piccola intelligenza artificiale contro cui giocare :-)
Il programma fa uso della funzione system per invocare cls (tipica istruzione dos per pulire lo schermo). Per farlo funzionare su Linux se non ricordo male dovete sostituire system("cls") con system("clear") inoltre dovete togliere #include <windows.h> e le chiamate alle funzioni Sleep e Beep.
Ogni partita completa si compone di due partite (dato che bisogna arrivare almeno a 120).
Nella prima inizia il giocatore, nella seconda il computer.
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
struct Carta {
string seme;
int valore, punti, forza;
Carta (string s, int v, int p, int f) {
seme = s;
valore = v;
punti = p;
forza = f;
}
};
vector<Carta> Mescola (vector<Carta> v) {
vector<Carta> temp;
while (v.size() > 0) {
srand(time(NULL));
int pos = rand() % v.size();
temp.push_back(v[pos]);
v[pos] = v.back();
v.pop_back();
};
return temp;
}
int SceltaCartaPCAttacco (vector<Carta> v, string b) {
int minpunti = 12, minforza = 31, min = 0;
for (int i = 0; i < v.size(); i++) {
if (v[i].seme == b)
v[i].forza += 20;
if (v[i].punti < minpunti) {
minpunti = v[i].punti;
minforza = v[i].forza;
min = i;
}
else
if (v[i].punti == minpunti && v[i].forza < minforza) {
minpunti = v[i].punti;
minforza = v[i].forza;
min = i;
};
};
return min;
}
int SceltaCartaPCDifesa (vector<Carta> v, Carta c, string b) {
int maxpunti = -1, minpunti = 23, minforza = 31, scelta = 0, incforza = 0;
bool presa = false;
if (c.seme == b)
c.forza += 20;
for (int i = 0; i < v.size(); i++) {
if (v[i].seme == b)
v[i].forza += 20;
if (v[i].seme != c.seme && c.seme != b)
incforza = 10;
else
incforza = 0;
if (v[i].forza > c.forza + incforza) {
presa = true;
if (v[i].punti + c.punti > maxpunti) {
maxpunti = v[i].punti + c.punti;
minforza = v[i].forza;
scelta = i;
}
else
if (v[i].punti + c.punti == maxpunti && v[i].forza < minforza) {
minforza = v[i].forza;
scelta = i;
};
}
else
if (!presa) {
if (v[i].punti + c.punti < minpunti) {
minpunti = v[i].punti + c.punti;
minforza = v[i].forza;
scelta = i;
}
else
if (v[i].punti + c.punti == minpunti && v[i].forza < minforza) {
minforza = v[i].forza;
scelta = i;
};
};
};
return scelta;
}
string Semi[] = {"Denari", "Coppe", "Spade", "Mazze"};
vector<Carta> Carte, ManoG, ManoPC;
string SemeBriscola;
int ValoreBriscola, PuntiG, PuntiPC, SceltaG, SceltaPC;
bool TurnoG = true;
int main() {
for (int i = 0; i < 4; i++) {
Carte.push_back(Carta(Semi[i], 1, 11, 10));
Carte.push_back(Carta(Semi[i], 2, 0, 1));
Carte.push_back(Carta(Semi[i], 3, 10, 9));
Carte.push_back(Carta(Semi[i], 4, 0, 2));
Carte.push_back(Carta(Semi[i], 5, 0, 3));
Carte.push_back(Carta(Semi[i], 6, 0, 4));
Carte.push_back(Carta(Semi[i], 7, 0, 5));
Carte.push_back(Carta(Semi[i], 8, 2, 6));
Carte.push_back(Carta(Semi[i], 9, 3, 7));
Carte.push_back(Carta(Semi[i], 10, 4, 8));
};
for (int t = 0; t < 2; t++) {
vector<Carta> Mazzo = Mescola(Carte);
SemeBriscola = Mazzo.back().seme;
ValoreBriscola = Mazzo.back().valore;
for (int i = 0; i < 6; i += 2) {
ManoG.push_back(Mazzo[i]);
ManoPC.push_back(Mazzo[i + 1]);
};
Mazzo.erase(Mazzo.begin(), Mazzo.begin() + 6);
cout << "Partita n^ " << t + 1 << "\n" << endl;
do {
if (TurnoG) {
cout << "Turno tuo\n" << endl;
cout << "Carte rimaste nel mazzo: " << Mazzo.size() << endl;
cout << "Briscola: " << ValoreBriscola << " di " << SemeBriscola << endl;
cout << endl;
cout << "Scegli la carta che vuoi giocare:\n" << endl;
for (int i = 0; i < ManoG.size(); i++)
cout << i + 1 << ") " << ManoG[i].valore << " di " << ManoG[i].seme << endl;
do {
cin >> SceltaG;
}
while (SceltaG < 1 || SceltaG > ManoG.size());
cout << endl;
SceltaPC = SceltaCartaPCDifesa(ManoPC, ManoG[SceltaG - 1], SemeBriscola);
cout << "Hai giocato: " << ManoG[SceltaG - 1].valore << " di " << ManoG[SceltaG - 1].seme << endl;
cout << "Computer gioca: *** " << ManoPC[SceltaPC].valore << " di " << ManoPC[SceltaPC].seme << " ***" << endl;
if (ManoG[SceltaG - 1].seme == SemeBriscola)
ManoG[SceltaG - 1].forza += 20;
else
if (ManoG[SceltaG - 1].seme != ManoPC[SceltaPC].seme)
ManoG[SceltaG - 1].forza += 10;
if (ManoPC[SceltaPC].seme == SemeBriscola)
ManoPC[SceltaPC].forza += 20;
}
else {
SceltaPC = SceltaCartaPCAttacco(ManoPC, SemeBriscola);
cout << "Turno del Computer\n" << endl;
cout << "Computer gioca: *** " << ManoPC[SceltaPC].valore << " di " << ManoPC[SceltaPC].seme << " ***" << endl;
cout << endl;
cout << "Carte rimaste nel mazzo: " << Mazzo.size() << endl;
cout << "Briscola: " << ValoreBriscola << " di " << SemeBriscola << endl;
cout << endl;
cout << "Scegli la carta che vuoi giocare:\n" << endl;
for (int i = 0; i < ManoG.size(); i++)
cout << i + 1 << ") " << ManoG[i].valore << " di " << ManoG[i].seme << endl;
do {
cin >> SceltaG;
}
while (SceltaG < 1 || SceltaG > ManoG.size());
cout << "Hai giocato: " << ManoG[SceltaG - 1].valore << " di " << ManoG[SceltaG - 1].seme << endl;
if (ManoPC[SceltaPC].seme == SemeBriscola)
ManoPC[SceltaPC].forza += 20;
else
if (ManoPC[SceltaPC].seme != ManoG[SceltaG - 1].seme)
ManoPC[SceltaPC].forza += 10;
if (ManoG[SceltaG - 1].seme == SemeBriscola)
ManoG[SceltaG - 1].forza += 20;
};
cout << endl;
if (ManoG[SceltaG - 1].forza > ManoPC[SceltaPC].forza) {
cout << "Prendi " << ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti << " punti" << endl;
PuntiG += ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti;
ManoG.erase(ManoG.begin() + (SceltaG - 1));
ManoPC.erase(ManoPC.begin() + SceltaPC);
if (Mazzo.size() >= 2) {
ManoG.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
ManoPC.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
};
TurnoG = true;
}
else
if (ManoG[SceltaG - 1].forza < ManoPC[SceltaPC].forza) {
cout << "Computer prende " << ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti << " punti" << endl;
PuntiPC += ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti;
ManoPC.erase(ManoPC.begin() + SceltaPC);
ManoG.erase(ManoG.begin() + (SceltaG - 1));
if (Mazzo.size() >= 2) {
ManoPC.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
ManoG.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
};
TurnoG = false;
};
cout << endl;
cout << "Punteggio parziale: Tu " << PuntiG << " - Computer " << PuntiPC << endl;
Sleep(3000);
system("cls");
}
while (ManoG.size() > 0 && ManoPC.size() > 0);
Beep(1000, 2000);
TurnoG = false;
};
cout << "Punteggio finale: Tu " << PuntiG << " - Computer " << PuntiPC << endl;
while (cin.get() != '\n');
while (cin.get() != '\n');
return 0;
}
ho scritto questo programmino che consente di giocare a briscola.
Il gioco è a riga di comando perché mi interessava solo l'aspetto algoritmico e implementare una piccola intelligenza artificiale contro cui giocare :-)
Il programma fa uso della funzione system per invocare cls (tipica istruzione dos per pulire lo schermo). Per farlo funzionare su Linux se non ricordo male dovete sostituire system("cls") con system("clear") inoltre dovete togliere #include <windows.h> e le chiamate alle funzioni Sleep e Beep.
Ogni partita completa si compone di due partite (dato che bisogna arrivare almeno a 120).
Nella prima inizia il giocatore, nella seconda il computer.
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
struct Carta {
string seme;
int valore, punti, forza;
Carta (string s, int v, int p, int f) {
seme = s;
valore = v;
punti = p;
forza = f;
}
};
vector<Carta> Mescola (vector<Carta> v) {
vector<Carta> temp;
while (v.size() > 0) {
srand(time(NULL));
int pos = rand() % v.size();
temp.push_back(v[pos]);
v[pos] = v.back();
v.pop_back();
};
return temp;
}
int SceltaCartaPCAttacco (vector<Carta> v, string b) {
int minpunti = 12, minforza = 31, min = 0;
for (int i = 0; i < v.size(); i++) {
if (v[i].seme == b)
v[i].forza += 20;
if (v[i].punti < minpunti) {
minpunti = v[i].punti;
minforza = v[i].forza;
min = i;
}
else
if (v[i].punti == minpunti && v[i].forza < minforza) {
minpunti = v[i].punti;
minforza = v[i].forza;
min = i;
};
};
return min;
}
int SceltaCartaPCDifesa (vector<Carta> v, Carta c, string b) {
int maxpunti = -1, minpunti = 23, minforza = 31, scelta = 0, incforza = 0;
bool presa = false;
if (c.seme == b)
c.forza += 20;
for (int i = 0; i < v.size(); i++) {
if (v[i].seme == b)
v[i].forza += 20;
if (v[i].seme != c.seme && c.seme != b)
incforza = 10;
else
incforza = 0;
if (v[i].forza > c.forza + incforza) {
presa = true;
if (v[i].punti + c.punti > maxpunti) {
maxpunti = v[i].punti + c.punti;
minforza = v[i].forza;
scelta = i;
}
else
if (v[i].punti + c.punti == maxpunti && v[i].forza < minforza) {
minforza = v[i].forza;
scelta = i;
};
}
else
if (!presa) {
if (v[i].punti + c.punti < minpunti) {
minpunti = v[i].punti + c.punti;
minforza = v[i].forza;
scelta = i;
}
else
if (v[i].punti + c.punti == minpunti && v[i].forza < minforza) {
minforza = v[i].forza;
scelta = i;
};
};
};
return scelta;
}
string Semi[] = {"Denari", "Coppe", "Spade", "Mazze"};
vector<Carta> Carte, ManoG, ManoPC;
string SemeBriscola;
int ValoreBriscola, PuntiG, PuntiPC, SceltaG, SceltaPC;
bool TurnoG = true;
int main() {
for (int i = 0; i < 4; i++) {
Carte.push_back(Carta(Semi[i], 1, 11, 10));
Carte.push_back(Carta(Semi[i], 2, 0, 1));
Carte.push_back(Carta(Semi[i], 3, 10, 9));
Carte.push_back(Carta(Semi[i], 4, 0, 2));
Carte.push_back(Carta(Semi[i], 5, 0, 3));
Carte.push_back(Carta(Semi[i], 6, 0, 4));
Carte.push_back(Carta(Semi[i], 7, 0, 5));
Carte.push_back(Carta(Semi[i], 8, 2, 6));
Carte.push_back(Carta(Semi[i], 9, 3, 7));
Carte.push_back(Carta(Semi[i], 10, 4, 8));
};
for (int t = 0; t < 2; t++) {
vector<Carta> Mazzo = Mescola(Carte);
SemeBriscola = Mazzo.back().seme;
ValoreBriscola = Mazzo.back().valore;
for (int i = 0; i < 6; i += 2) {
ManoG.push_back(Mazzo[i]);
ManoPC.push_back(Mazzo[i + 1]);
};
Mazzo.erase(Mazzo.begin(), Mazzo.begin() + 6);
cout << "Partita n^ " << t + 1 << "\n" << endl;
do {
if (TurnoG) {
cout << "Turno tuo\n" << endl;
cout << "Carte rimaste nel mazzo: " << Mazzo.size() << endl;
cout << "Briscola: " << ValoreBriscola << " di " << SemeBriscola << endl;
cout << endl;
cout << "Scegli la carta che vuoi giocare:\n" << endl;
for (int i = 0; i < ManoG.size(); i++)
cout << i + 1 << ") " << ManoG[i].valore << " di " << ManoG[i].seme << endl;
do {
cin >> SceltaG;
}
while (SceltaG < 1 || SceltaG > ManoG.size());
cout << endl;
SceltaPC = SceltaCartaPCDifesa(ManoPC, ManoG[SceltaG - 1], SemeBriscola);
cout << "Hai giocato: " << ManoG[SceltaG - 1].valore << " di " << ManoG[SceltaG - 1].seme << endl;
cout << "Computer gioca: *** " << ManoPC[SceltaPC].valore << " di " << ManoPC[SceltaPC].seme << " ***" << endl;
if (ManoG[SceltaG - 1].seme == SemeBriscola)
ManoG[SceltaG - 1].forza += 20;
else
if (ManoG[SceltaG - 1].seme != ManoPC[SceltaPC].seme)
ManoG[SceltaG - 1].forza += 10;
if (ManoPC[SceltaPC].seme == SemeBriscola)
ManoPC[SceltaPC].forza += 20;
}
else {
SceltaPC = SceltaCartaPCAttacco(ManoPC, SemeBriscola);
cout << "Turno del Computer\n" << endl;
cout << "Computer gioca: *** " << ManoPC[SceltaPC].valore << " di " << ManoPC[SceltaPC].seme << " ***" << endl;
cout << endl;
cout << "Carte rimaste nel mazzo: " << Mazzo.size() << endl;
cout << "Briscola: " << ValoreBriscola << " di " << SemeBriscola << endl;
cout << endl;
cout << "Scegli la carta che vuoi giocare:\n" << endl;
for (int i = 0; i < ManoG.size(); i++)
cout << i + 1 << ") " << ManoG[i].valore << " di " << ManoG[i].seme << endl;
do {
cin >> SceltaG;
}
while (SceltaG < 1 || SceltaG > ManoG.size());
cout << "Hai giocato: " << ManoG[SceltaG - 1].valore << " di " << ManoG[SceltaG - 1].seme << endl;
if (ManoPC[SceltaPC].seme == SemeBriscola)
ManoPC[SceltaPC].forza += 20;
else
if (ManoPC[SceltaPC].seme != ManoG[SceltaG - 1].seme)
ManoPC[SceltaPC].forza += 10;
if (ManoG[SceltaG - 1].seme == SemeBriscola)
ManoG[SceltaG - 1].forza += 20;
};
cout << endl;
if (ManoG[SceltaG - 1].forza > ManoPC[SceltaPC].forza) {
cout << "Prendi " << ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti << " punti" << endl;
PuntiG += ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti;
ManoG.erase(ManoG.begin() + (SceltaG - 1));
ManoPC.erase(ManoPC.begin() + SceltaPC);
if (Mazzo.size() >= 2) {
ManoG.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
ManoPC.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
};
TurnoG = true;
}
else
if (ManoG[SceltaG - 1].forza < ManoPC[SceltaPC].forza) {
cout << "Computer prende " << ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti << " punti" << endl;
PuntiPC += ManoG[SceltaG - 1].punti + ManoPC[SceltaPC].punti;
ManoPC.erase(ManoPC.begin() + SceltaPC);
ManoG.erase(ManoG.begin() + (SceltaG - 1));
if (Mazzo.size() >= 2) {
ManoPC.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
ManoG.push_back(Mazzo.front());
Mazzo.erase(Mazzo.begin());
};
TurnoG = false;
};
cout << endl;
cout << "Punteggio parziale: Tu " << PuntiG << " - Computer " << PuntiPC << endl;
Sleep(3000);
system("cls");
}
while (ManoG.size() > 0 && ManoPC.size() > 0);
Beep(1000, 2000);
TurnoG = false;
};
cout << "Punteggio finale: Tu " << PuntiG << " - Computer " << PuntiPC << endl;
while (cin.get() != '\n');
while (cin.get() != '\n');
return 0;
}