Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.32 KB | None | 0 0
  1. // REGULI
  2. // 1. Carte magica (5C) - oricine detine aceasta carte castiga runda sau razboiul
  3. // 2. Daca dupa un razboi toti jucatorii raman fara carti, atunci se considera egalitate
  4. // 3. Daca dupa un razboi unul sau mai multi jucatori raman fara carti, atunci acestia pierd,
  5. // iar cartile lor sunt date castigatorului
  6. // 4. Dupa un razboi cartile sunt luate de cel cu cea mai mare carte, chiar daca acesta nu a
  7. // in razboi participat
  8.  
  9. // ALTE CHESTII ADAUGATE
  10. // 1. Un cod foarte flexibil si modular
  11. // 2. Scor pentru fiecare jucator
  12. // 2. Top players
  13.  
  14.  
  15. #include <string.h>
  16. #include <iostream>
  17. #include <cstring>
  18. #include <stdlib.h>
  19. #include <time.h>
  20. #include <windows.h>
  21. #include <fstream>
  22. #include <graphics.h>
  23. #include <winbgim.h>
  24.  
  25. using namespace std;
  26.  
  27. const unsigned int WIDTH = 1000;
  28. const unsigned int HEIGTH = 600;
  29.  
  30. // numarul de carti de joc
  31. const unsigned short NR_CARTI = 52;
  32. unsigned short nr_carti_actuale = 52;
  33.  
  34. // spatiul din fata intentionat lasat liber, pt. a incepe cu 1
  35. const char *NUMERE = " 234567890JQKA";
  36.  
  37. // trefla, romb (caro), cupa, pica
  38. const char *SIMBOLURI = " TRCP";
  39.  
  40. // numarul maxim de jucatori
  41. const unsigned short NR_JUCATORI_MAX = 4;
  42. int nrJucatori = 0;
  43.  
  44. struct numarCarte
  45. {
  46.     int indice;
  47.     int valRazboi;
  48.     char display;
  49.  
  50.     //pentru K; indice = 11, display = 'K'
  51. };
  52.  
  53. struct carteJoc {
  54.     numarCarte numar;
  55.     char simbol;
  56. } carte[NR_CARTI];
  57.  
  58. struct node
  59. {
  60.     carteJoc info;
  61.     node* urm;
  62. };
  63.  
  64. struct jucator
  65. {
  66.     int numar;
  67.     char nume[51];
  68.     int nrCarti = 0;
  69.     bool inRazboi;
  70.     int scor = 0;
  71.     node* prim;
  72.     node* ultim;
  73. }jucatori[NR_JUCATORI_MAX + 1];
  74.  
  75. struct castigatorRunda
  76. {
  77.     int indiceCarte;
  78.     int nrJucator;
  79.     int valCarte;
  80. }castigator;
  81.  
  82. void AmestecaPachet(carteJoc carte[])
  83. {
  84.     unsigned short int i1, i2;
  85.     carteJoc aux;
  86.  
  87.     srand(time(NULL));
  88.     for (int i = 1; i <= 100; i++)
  89.     {
  90.         i1 = 1 + rand() % nr_carti_actuale;
  91.         i2 = 1 + rand() % nr_carti_actuale;
  92.  
  93.         aux = carte[i1];
  94.         carte[i1] = carte[i2];
  95.         carte[i2] = aux;
  96.     }
  97. }
  98.  
  99. void AfisarePachet(carteJoc carte[])
  100. {
  101.     for (int i = 1; i <= nr_carti_actuale; i++)
  102.         cout << "{" << carte[i].numar.display << "," << carte[i].simbol << "}\t";
  103.  
  104.     cout << "\n";
  105. }
  106.  
  107. void GenerarePachet(carteJoc carte[])
  108. {
  109.     int nrCarte = 1;
  110.     for (int i = 1; i <= 13; i++)
  111.     {
  112.         for (int j = 1; j <= 4; j++)
  113.         {
  114.             numarCarte numarC;
  115.             numarC.display = NUMERE[i];
  116.             numarC.indice = i + 1;
  117.             numarC.valRazboi = i + 1;
  118.  
  119.             if (i >= 10)
  120.             {
  121.                 if (NUMERE[i] == 'A')
  122.                 {
  123.                     numarC.valRazboi = 11;
  124.                 }
  125.                 else
  126.                 {
  127.                     // pentru J Q K
  128.                     numarC.valRazboi = 10;
  129.                 }
  130.             }
  131.  
  132.             carte[nrCarte].numar = numarC;
  133.             carte[nrCarte].simbol = SIMBOLURI[j];
  134.  
  135.             nrCarte++;
  136.         }
  137.     }
  138. }
  139.  
  140. void EliminareCarti(carteJoc carte[], int cartiElim)
  141. {
  142.     for (int i = cartiElim; i <= NR_CARTI; i++)
  143.     {
  144.         carte[i - cartiElim] = carte[i];
  145.     }
  146.     nr_carti_actuale = NR_CARTI - cartiElim;
  147. }
  148.  
  149. void InsereazaCarte(jucator &juc, carteJoc carte)
  150. {
  151.     node *elem = new node;
  152.     elem->info = carte;
  153.     elem->urm = NULL;
  154.  
  155.     if (juc.prim == NULL)
  156.     {
  157.         juc.prim = elem;
  158.     }
  159.     else
  160.     {
  161.         node *nod = juc.prim;
  162.         while (nod->urm != NULL)
  163.             nod = nod->urm;
  164.  
  165.         nod->urm = elem;
  166.     }
  167.  
  168.     juc.nrCarti++;
  169. }
  170.  
  171. void AfisarePachetJucator(jucator juc)
  172. {
  173.     node *c = juc.prim;
  174.     for (int i = 1; i <= juc.nrCarti; i++)
  175.     {
  176.         cout << "{" << c->info.numar.display << "," << c->info.simbol << "}\t";
  177.         c = c->urm;
  178.     }
  179.     cout << "\n";
  180. }
  181.  
  182. void CartiJucator(int nrJucatori, int nrCartiJucator)
  183. {
  184.     //Cream cate o lista de carti pentru fiecare jucator
  185.  
  186.     int carte_ST = 1; //prima carte pt primul jucator
  187.     int carte_F = nrCartiJucator; //ultima carte pt primul jucator
  188.  
  189.     for (int i = 1; i <= nrJucatori; i++)
  190.     {
  191.         jucatori[i].numar = i;
  192.         for (int j = carte_ST; j <= carte_F; j++)
  193.             InsereazaCarte(jucatori[i], carte[j]);
  194.         carte_ST = carte_F + 1;
  195.         carte_F += nrCartiJucator;
  196.     }
  197. }
  198.  
  199. void StergeCarte(jucator &juc, carteJoc carte)
  200. {
  201.     if (juc.prim == NULL)
  202.         return;
  203.  
  204.     juc.nrCarti--;
  205.     node *c = juc.prim;
  206.  
  207.     // daca primul nod trebuie eliminat
  208.     if (c->info.numar.indice == carte.numar.indice && c->info.simbol == carte.simbol)
  209.     {
  210.         juc.prim = juc.prim->urm;
  211.         delete c;
  212.  
  213.         return;
  214.     }
  215.  
  216.     // in caz ca e in interiorul listei sau ultimul nod
  217.     for (int i = 1; i <= juc.nrCarti; i++)
  218.     {
  219.         if (c->urm->info.numar.indice == carte.numar.indice && c->urm->info.simbol == carte.simbol)
  220.         {
  221.             node *q = c->urm;
  222.             c->urm = q->urm;
  223.             delete q;
  224.  
  225.             break;
  226.         }
  227.  
  228.         c = c->urm;
  229.     }
  230. }
  231.  
  232. void MutaCarte(jucator &juc1, jucator &juc2, carteJoc carte)
  233. {
  234.     StergeCarte(juc1, carte);
  235.     InsereazaCarte(juc2, carte);
  236. }
  237.  
  238. void AfiseazaToatePachetele()
  239. {
  240.     for (int i = 1; i <= nrJucatori; i++)
  241.     {
  242.         cout << "Jucatorul " << jucatori[i].numar << ' ' << jucatori[i].nume << endl;
  243.         AfisarePachetJucator(jucatori[i]);
  244.         cout << endl;
  245.     }
  246. }
  247.  
  248. int CarteSpeciala()
  249. {
  250.     // Noua regula: Exista o carte speciala, anume 5♥.
  251.     // Cand se da o runda, daca un jucator are aceasta carte, acesta va fi castigatorul rundei, indiferent de cartea maxima din runda.
  252.     // Verificam daca unul dintre jucatori are ca prima carte cartea speciala.
  253.     for (int i = 1; i <= nrJucatori; i++)
  254.         if (jucatori[i].nrCarti > 0)
  255.             if (jucatori[i].prim->info.numar.display == '5' && jucatori[i].prim->info.simbol == 'C')
  256.                 return i;
  257.  
  258.     return 0; // daca nimeni nu a avut cartea speciala
  259. }
  260.  
  261. void CarteMaxRunda()
  262. {
  263.     //verific daca vreun castigator are cartea speciala
  264.     int castigator_cspeciala = CarteSpeciala();
  265.     if (castigator_cspeciala != 0)
  266.     {
  267.         castigator.nrJucator = castigator_cspeciala;
  268.         castigator.indiceCarte = 12; //un nr mai mare decat orice carte, ca sa evitam gasirea altor carti de 5 si inceperea unui razboi
  269.         castigator.valCarte = 5;
  270.     }
  271.     else
  272.     {
  273.         //initializare
  274.         castigator.indiceCarte = jucatori[1].prim->info.numar.indice;
  275.         castigator.valCarte = jucatori[1].prim->info.numar.valRazboi;
  276.         castigator.nrJucator = 1;
  277.  
  278.         int carte_curenta = 0;
  279.         for (int i = 2; i <= nrJucatori; i++)
  280.         {
  281.             carte_curenta = jucatori[i].prim->info.numar.indice;
  282.             if (castigator.indiceCarte < carte_curenta)
  283.             {
  284.                 castigator.indiceCarte = carte_curenta;
  285.                 castigator.valCarte = jucatori[i].prim->info.numar.valRazboi;
  286.                 castigator.nrJucator = i;
  287.             }
  288.         }
  289.     }
  290. }
  291.  
  292. int CartiEgaleRunda(int carte_max)
  293. {
  294.     int carti_egale = 0;
  295.     int carte_curenta = 0;
  296.     for (int i = 1; i <= nrJucatori; i++)
  297.     {
  298.         carte_curenta = jucatori[i].prim->info.numar.indice;
  299.         if (carte_curenta == carte_max)
  300.         {
  301.             carti_egale++;
  302.         }
  303.     }
  304.     return carti_egale;
  305. }
  306.  
  307. void StergeJucator(int nr)
  308. {
  309.     for (int i = nr; i < nrJucatori; i++)
  310.     {
  311.         jucatori[i] = jucatori[i + 1];
  312.     }
  313.     jucatori[nrJucatori].nrCarti = 0;
  314.     jucatori[nrJucatori].prim = NULL;
  315.     nrJucatori--;
  316. }
  317.  
  318. void VerificaJucatori()
  319. {
  320.     for (int i = 1; i <= nrJucatori; i++)
  321.     {
  322.         if (jucatori[i].nrCarti == 0)
  323.         {
  324.             StergeJucator(i);
  325.             i--;
  326.         }
  327.     }
  328. }
  329.  
  330. // Avem nevoie de definirea asta ca sa il putem apela in Runda()
  331. void Razboi(int nrCartiRazboi);
  332.  
  333. void Runda()
  334. {
  335.     CarteMaxRunda();
  336.     int carti_egale = CartiEgaleRunda(castigator.indiceCarte);
  337.  
  338.     if (carti_egale > 1)
  339.     {
  340.         Razboi(castigator.valCarte);
  341.     }
  342.     else
  343.     {
  344.         jucatori[castigator.nrJucator].scor++;
  345.         cout << jucatori[castigator.nrJucator].nume << " are cea mai mare carte! "<< endl;
  346.         for (int i = 1; i <= nrJucatori; i++)
  347.             MutaCarte(jucatori[i], jucatori[castigator.nrJucator], jucatori[i].prim->info);
  348.     }
  349.  
  350.     // Stergem jucatorii fara carti
  351.     VerificaJucatori();
  352. }
  353.  
  354. // Avem nevoie de doua variabile globale in caz ca dupa ce s-a dat un razboi mai trebuie sa se dea unul
  355. jucator auxRazboi;
  356. void Razboi(int nrCartiRazboi)
  357. {
  358.     cout << "RAZBOI!\n";
  359.  
  360.     // Luam jucatorii care sunt in razboi
  361.     for (int i = 1; i <= nrJucatori; i++)
  362.     {
  363.         if (jucatori[i].prim->info.numar.indice == castigator.indiceCarte)
  364.         {
  365.             jucatori[i].inRazboi = true;
  366.         }
  367.         else
  368.         {
  369.             jucatori[i].inRazboi = false;
  370.         }
  371.     }
  372.  
  373.     // Verificam cati jucatori au un numar insificient de carti
  374.     int jucFaraCartiDestule = 0;
  375.     for (int i = 1; i <= nrJucatori; i++)
  376.     {
  377.         if (jucatori[i].inRazboi == true)
  378.         {
  379.             if (jucatori[i].nrCarti <= nrCartiRazboi)
  380.                 jucFaraCartiDestule++;
  381.         }
  382.     }
  383.  
  384.     // REGULA: daca toti jucatorii nu au carti suficiente atunci se considera egalitate
  385.     if (jucFaraCartiDestule == nrJucatori)
  386.     {
  387.         cout << "EGALITATE intre jucatorii: ";
  388.  
  389.         int aux = 1;
  390.         for (int i = 1; i <= nrJucatori; i++)
  391.         {
  392.             cout << aux++ << " ";
  393.             StergeJucator(i);
  394.             i--;
  395.         }
  396.  
  397.         cout << endl;
  398.         return;
  399.     }
  400.  
  401.     // Jucatorii cu carti insuficiente vor pierde
  402.     for (int i = 1; i <= nrJucatori; i++)
  403.     {
  404.         if (jucatori[i].inRazboi == true)
  405.         {
  406.             int aux = jucatori[i].nrCarti;
  407.             if (aux <= nrCartiRazboi)
  408.             {
  409.                 for (int j = 1; j <= aux; j++)
  410.                 {
  411.                     MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  412.                 }
  413.                 StergeJucator(i);
  414.                 i--;
  415.             }
  416.         }
  417.     }
  418.  
  419.     // Mutam cartile de la jucatorii ramasi in aux
  420.     for (int i = 1; i <= nrJucatori; i++)
  421.     {
  422.         if (jucatori[i].inRazboi == true)
  423.         {
  424.             for (int j = 1; j <= nrCartiRazboi; j++)
  425.             {
  426.                 MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  427.             }
  428.         }
  429.     }
  430.  
  431.     // Aflam cartea maxima
  432.     CarteMaxRunda();
  433.  
  434.     int cartiEgale = CartiEgaleRunda(castigator.indiceCarte);
  435.     if (cartiEgale > 1)
  436.     {
  437.         Razboi(castigator.valCarte);
  438.     }
  439.     else
  440.     {
  441.         // Mutam cartile la castigator
  442.  
  443.         for (int i = 1; i <= nrJucatori; i++)
  444.         {
  445.             MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  446.         }
  447.  
  448.         jucatori[castigator.nrJucator].scor++;
  449.         cout << jucatori[castigator.nrJucator].nume << " are cea mai mare carte! " << endl;
  450.         int aux = auxRazboi.nrCarti;
  451.         for (int i = 1; i <= aux; i++)
  452.         {
  453.             MutaCarte(auxRazboi, jucatori[castigator.nrJucator], auxRazboi.prim->info);
  454.         }
  455.  
  456.         auxRazboi.nrCarti = 0;
  457.         auxRazboi.prim = NULL;
  458.     }
  459. }
  460.  
  461. void MakeRazboi(int carteMax = 0)
  462. {
  463.     bool seDaRazboi = false;
  464.  
  465.     if (carteMax == 0)
  466.     {
  467.         CarteMaxRunda();
  468.         carteMax = castigator.indiceCarte;
  469.     }
  470.  
  471.     for (int i = 1; i < nrJucatori; i++)
  472.     {
  473.         for (int j = i + 1; j <= nrJucatori; j++)
  474.         {
  475.             if (jucatori[i].prim->info.numar.indice == jucatori[j].prim->info.numar.indice)
  476.             {
  477.                 if (jucatori[i].prim->info.numar.indice == carteMax)
  478.                     seDaRazboi = true;
  479.             }
  480.         }
  481.     }
  482.  
  483.     if (!seDaRazboi)
  484.     {
  485.         for (int i = 1; i <= nrJucatori; i++)
  486.         {
  487.             jucatori[i].prim = NULL;
  488.             jucatori[i].nrCarti = 0;
  489.         }
  490.  
  491.         AmestecaPachet(carte);
  492.  
  493.         CartiJucator(nrJucatori, NR_CARTI / nrJucatori);
  494.  
  495.         MakeRazboi(carteMax);
  496.     }
  497. }
  498.  
  499.  
  500. void AfiseazaScorJucatori()
  501. {
  502.     ifstream fin("clasament.txt");
  503.     int n;
  504.     fin>>n;
  505.     for(int i = 1; i <= n; i++)
  506.     {
  507.         int scor;
  508.         char nume[51];
  509.  
  510.         fin.get();
  511.         fin>>scor;
  512.         fin.get();
  513.         fin.get(nume, 50);
  514.  
  515.         cout<<"#"<<i<<": "<<nume<<" - "<<scor<<endl;
  516.     }
  517. }
  518.  
  519. void ModificaTopPlayers()
  520. {
  521.     // Modificam doar daca nu este egalitate
  522.     if(nrJucatori > 0)
  523.     {
  524.  
  525.         fstream fin;
  526.         fin.open("clasament.txt");
  527.  
  528.         int n;
  529.         fin>>n;
  530.  
  531.         jucator topJucatori[11];
  532.  
  533.         for(int i = 1; i <= n; i++)
  534.         {
  535.             fin.get();
  536.             fin>> topJucatori[i].scor;
  537.             fin.get();
  538.             fin.get(topJucatori[i].nume, 50);
  539.         }
  540.  
  541.  
  542.         topJucatori[n+1].scor = jucatori[1].scor;
  543.         strcpy(topJucatori[n+1].nume, jucatori[1].nume);
  544.  
  545.         for(int i = 1; i <= n; i++)
  546.         {
  547.             for(int j = i + 1; j <= n+1; j++)
  548.                 if(topJucatori[i].scor < topJucatori[j].scor)
  549.                 {
  550.                     swap(topJucatori[i].nume, topJucatori[j].nume);
  551.                     swap(topJucatori[i].scor, topJucatori[j].scor);
  552.                 }
  553.         }
  554.         if(n < 10)
  555.             n++;
  556.  
  557.         fin.close();
  558.         ofstream fout("clasament.txt");
  559.  
  560.         fout<<n<<endl;
  561.         for(int i = 1; i <= n; i++)
  562.         {
  563.             fout<<topJucatori[i].scor<<" "<<topJucatori[i].nume<<endl;
  564.         }
  565.  
  566.         fout.close();
  567.     }
  568.  
  569. }
  570.  
  571. void WaitForMouseClick(int &x, int &y)
  572. {
  573.     while(!ismouseclick(WM_LBUTTONDOWN))
  574.     {
  575.         delay(10);
  576.     }
  577.  
  578.     delay(10);
  579.     getmouseclick(WM_LBUTTONDOWN, x, y);
  580. }
  581.  
  582. void StartGameButton();
  583. void TopPlayersButton();
  584. void QuitGameButton();
  585.  
  586. void WaitForButtonClick()
  587. {
  588.     int x = -1, y = -1;
  589.  
  590.     while(x == -1 && y == -1)
  591.     {
  592.  
  593.         WaitForMouseClick(x, y);
  594.  
  595.         if(x >= 400 && x <= 600 && y >= 100 && y <= 175)
  596.             StartGameButton();
  597.         else if(x >= 400 && x <= 600 && y >= 200 && y <= 275)
  598.             TopPlayersButton();
  599.         else if(x >= 400 && x <= 600 && y >= 300 && y <= 375)
  600.             QuitGameButton();
  601.         else
  602.             x = y = -1;
  603.     }
  604. }
  605.  
  606.  
  607. void StartGameButton()
  608. {
  609.     system("cls");
  610.     do
  611.     {
  612.         cout << "Numarul de jucatori (max - " << NR_JUCATORI_MAX << "): ";
  613.         cin >> nrJucatori;
  614.     } while (nrJucatori > NR_JUCATORI_MAX || nrJucatori < 2);
  615.  
  616.     cout << "Numele jucatorilor: " << endl;
  617.     cin.get();
  618.     for (int i = 1; i <= nrJucatori; i++)
  619.     {
  620.         cin.get(jucatori[i].nume, 51);
  621.         cin.get();
  622.     }
  623.     // Generam pachetul de carti
  624.     GenerarePachet(carte);
  625.  
  626.     // Eliminam cartile in plus
  627.     EliminareCarti(carte, NR_CARTI % nrJucatori);
  628.  
  629.     // Amestecam pachetul
  630.     AmestecaPachet(carte);
  631.  
  632.     // Impartim cartile la jucatori
  633.     int nrCartiJucator = NR_CARTI / nrJucatori;
  634.     cout << "\nNumarul de carti per jucator:\n" << nrCartiJucator << endl << endl;
  635.     CartiJucator(nrJucatori, nrCartiJucator);
  636.  
  637.     // Creem un razboi
  638.     // MakeRazboi();
  639.  
  640.     AfiseazaToatePachetele();
  641.  
  642.     while (nrJucatori > 1)
  643.     {
  644.         Runda();
  645.  
  646.         cout << endl;
  647.         AfiseazaToatePachetele();
  648.     }
  649.  
  650.     cout << endl;
  651.     cout << "Castigator: "<<jucatori[1].nume<<endl;
  652.     cout << "Scor: " << jucatori[1].scor<<endl;
  653.  
  654.     ModificaTopPlayers();
  655.  
  656.     WaitForButtonClick();
  657. }
  658.  
  659. void TopPlayersButton()
  660. {
  661.     system("cls");
  662.     cout << "----- TOP JUCATORI -----"<<endl;
  663.     cout << endl;
  664.     AfiseazaScorJucatori();
  665.     WaitForButtonClick();
  666. }
  667.  
  668. void QuitGameButton()
  669. {
  670.     exit(0);
  671. }
  672.  
  673.  
  674. void MainMenu()
  675. {
  676.     readimagefile("images/background.jpg", 0, 0, WIDTH, HEIGTH);
  677.     readimagefile("images/start_game.jpg", (WIDTH/2) - 100, 100, 200, 175);
  678.     readimagefile("images/top_players.jpg", (WIDTH/2) - 100, 200, 200, 125);
  679.     readimagefile("images/quit_game.jpg", (WIDTH/2) - 100, 300, 200, 225);
  680.  
  681.     WaitForButtonClick();
  682. }
  683.  
  684. int main()
  685. {
  686.     int x, y;
  687.     initwindow(WIDTH, HEIGTH, "RAZBOI");
  688.  
  689.     MainMenu();
  690.  
  691.  
  692.     return 0;
  693. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement