|
|
|
|
Strumenti |
31-01-2011, 08:24 | #1 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
[C++] Briscola!
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. Codice:
#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; } |
03-03-2022, 17:12 | #2 |
Junior Member
Iscritto dal: Mar 2022
Messaggi: 1
|
Ciao, ho appena iniziato a programmare e trovo molto interessante il tuo programma. Riusciresti a spiegarmi come funziona?
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:46.