Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.47 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 "stdafx.h"
  16. #include <string.h>
  17. #include <iostream>
  18. #include <cstring>
  19. #include <stdlib.h>
  20. #include <time.h>
  21.  
  22. using namespace std;
  23.  
  24. // numarul de carti de joc
  25. const unsigned short NR_CARTI = 52;
  26. unsigned short nr_carti_actuale = 52;
  27.  
  28. // spatiul din fata intentionat lasat liber, pt. a incepe cu 1
  29. const char *NUMERE = " 234567890JQKA";
  30.  
  31. // trefla, romb (caro), cupa, pica
  32. const char *SIMBOLURI = " TRCP";
  33.  
  34. // numarul maxim de jucatori
  35. const unsigned short NR_JUCATORI_MAX = 4;
  36. int nrJucatori = 0;
  37.  
  38. struct numarCarte
  39. {
  40.     int indice;
  41.     int valRazboi;
  42.     char display;
  43.  
  44.     //pentru K; indice = 11, display = 'K'
  45. };
  46.  
  47. struct carteJoc {
  48.     numarCarte numar;
  49.     char simbol;
  50. } carte[NR_CARTI];
  51.  
  52. struct node
  53. {
  54.     carteJoc info;
  55.     node* urm;
  56. };
  57.  
  58. struct jucator
  59. {
  60.     int numar;
  61.     char nume[51];
  62.     int nrCarti = 0;
  63.     bool inRazboi;
  64.     int scor = 0;
  65.     node* prim;
  66.     node* ultim;
  67. }jucatori[NR_JUCATORI_MAX + 1];
  68.  
  69. struct castigatorRunda
  70. {
  71.     int indiceCarte;
  72.     int nrJucator;
  73.     int valCarte;
  74. }castigator;
  75.  
  76. void AmestecaPachet(carteJoc carte[])
  77. {
  78.     unsigned short int i1, i2;
  79.     carteJoc aux;
  80.  
  81.     srand(time(NULL));
  82.     for (int i = 1; i <= 100; i++)
  83.     {
  84.         i1 = 1 + rand() % nr_carti_actuale;
  85.         i2 = 1 + rand() % nr_carti_actuale;
  86.  
  87.         aux = carte[i1];
  88.         carte[i1] = carte[i2];
  89.         carte[i2] = aux;
  90.     }
  91. }
  92.  
  93. void AfisarePachet(carteJoc carte[])
  94. {
  95.     for (int i = 1; i <= nr_carti_actuale; i++)
  96.         cout << "{" << carte[i].numar.display << "," << carte[i].simbol << "}\t";
  97.  
  98.     cout << "\n";
  99. }
  100.  
  101. void GenerarePachet(carteJoc carte[])
  102. {
  103.     int nrCarte = 1;
  104.     for (int i = 1; i <= 13; i++)
  105.     {
  106.         for (int j = 1; j <= 4; j++)
  107.         {
  108.             numarCarte numarC;
  109.             numarC.display = NUMERE[i];
  110.             numarC.indice = i + 1;
  111.             numarC.valRazboi = i + 1;
  112.  
  113.             if (i >= 10)
  114.             {
  115.                 if (NUMERE[i] == 'A')
  116.                 {
  117.                     numarC.valRazboi = 11;
  118.                 }
  119.                 else
  120.                 {
  121.                     // pentru J Q K
  122.                     numarC.valRazboi = 10;
  123.                 }
  124.             }
  125.  
  126.             carte[nrCarte].numar = numarC;
  127.             carte[nrCarte].simbol = SIMBOLURI[j];
  128.  
  129.             nrCarte++;
  130.         }
  131.     }
  132. }
  133.  
  134. void EliminareCarti(carteJoc carte[], int cartiElim)
  135. {
  136.     for (int i = cartiElim; i <= NR_CARTI; i++)
  137.     {
  138.         carte[i - cartiElim] = carte[i];
  139.     }
  140.     nr_carti_actuale = NR_CARTI - cartiElim;
  141. }
  142.  
  143. void InsereazaCarte(jucator &juc, carteJoc carte)
  144. {
  145.     node *elem = new node;
  146.     elem->info = carte;
  147.     elem->urm = NULL;
  148.  
  149.     if (juc.prim == NULL)
  150.     {
  151.         juc.prim = elem;
  152.     }
  153.     else
  154.     {
  155.         node *nod = juc.prim;
  156.         while (nod->urm != NULL)
  157.             nod = nod->urm;
  158.  
  159.         nod->urm = elem;
  160.     }
  161.  
  162.     juc.nrCarti++;
  163. }
  164.  
  165. void AfisarePachetJucator(jucator juc)
  166. {
  167.     node *c = juc.prim;
  168.     for (int i = 1; i <= juc.nrCarti; i++)
  169.     {
  170.         cout << "{" << c->info.numar.display << "," << c->info.simbol << "}\t";
  171.         c = c->urm;
  172.     }
  173.     cout << "\n";
  174. }
  175.  
  176. void CartiJucator(int nrJucatori, int nrCartiJucator)
  177. {
  178.     //Cream cate o lista de carti pentru fiecare jucator
  179.  
  180.     int carte_ST = 1; //prima carte pt primul jucator
  181.     int carte_F = nrCartiJucator; //ultima carte pt primul jucator
  182.  
  183.     for (int i = 1; i <= nrJucatori; i++)
  184.     {
  185.         jucatori[i].numar = i;
  186.         for (int j = carte_ST; j <= carte_F; j++)
  187.             InsereazaCarte(jucatori[i], carte[j]);
  188.         carte_ST = carte_F + 1;
  189.         carte_F += nrCartiJucator;
  190.     }
  191. }
  192.  
  193. void StergeCarte(jucator &juc, carteJoc carte)
  194. {
  195.     if (juc.prim == NULL)
  196.         return;
  197.  
  198.     juc.nrCarti--;
  199.     node *c = juc.prim;
  200.  
  201.     // daca primul nod trebuie eliminat
  202.     if (c->info.numar.indice == carte.numar.indice && c->info.simbol == carte.simbol)
  203.     {
  204.         juc.prim = juc.prim->urm;
  205.         delete c;
  206.  
  207.         return;
  208.     }
  209.  
  210.     // in caz ca e in interiorul listei sau ultimul nod
  211.     for (int i = 1; i <= juc.nrCarti; i++)
  212.     {
  213.         if (c->urm->info.numar.indice == carte.numar.indice && c->urm->info.simbol == carte.simbol)
  214.         {
  215.             node *q = c->urm;
  216.             c->urm = q->urm;
  217.             delete q;
  218.  
  219.             break;
  220.         }
  221.  
  222.         c = c->urm;
  223.     }
  224. }
  225.  
  226. void MutaCarte(jucator &juc1, jucator &juc2, carteJoc carte)
  227. {
  228.     StergeCarte(juc1, carte);
  229.     InsereazaCarte(juc2, carte);
  230. }
  231.  
  232. void AfiseazaToatePachetele()
  233. {
  234.     for (int i = 1; i <= nrJucatori; i++)
  235.     {
  236.         cout << "Jucatorul " << jucatori[i].numar << ' ' << jucatori[i].nume << endl;
  237.         AfisarePachetJucator(jucatori[i]);
  238.         cout << endl;
  239.     }
  240. }
  241.  
  242. int CarteSpeciala()
  243. {
  244.     // Noua regula: Exista o carte speciala, anume 5♥.
  245.     // Cand se da o runda, daca un jucator are aceasta carte, acesta va fi castigatorul rundei, indiferent de cartea maxima din runda.
  246.     // Verificam daca unul dintre jucatori are ca prima carte cartea speciala.
  247.     for (int i = 1; i <= nrJucatori; i++)
  248.         if (jucatori[i].nrCarti > 0)
  249.             if (jucatori[i].prim->info.numar.display == '5' && jucatori[i].prim->info.simbol == 'C')
  250.                 return i;
  251.  
  252.     return 0; // daca nimeni nu a avut cartea speciala
  253. }
  254.  
  255. void CarteMaxRunda()
  256. {
  257.     //verific daca vreun castigator are cartea speciala
  258.     int castigator_cspeciala = CarteSpeciala();
  259.     if (castigator_cspeciala != 0)
  260.     {
  261.         castigator.nrJucator = castigator_cspeciala;
  262.         castigator.indiceCarte = 12; //un nr mai mare decat orice carte, ca sa evitam gasirea altor carti de 5 si inceperea unui razboi
  263.         castigator.valCarte = 5;
  264.     }
  265.     else
  266.     {
  267.         //initializare
  268.         castigator.indiceCarte = jucatori[1].prim->info.numar.indice;
  269.         castigator.valCarte = jucatori[1].prim->info.numar.valRazboi;
  270.         castigator.nrJucator = 1;
  271.  
  272.         int carte_curenta = 0;
  273.         for (int i = 2; i <= nrJucatori; i++)
  274.         {
  275.             carte_curenta = jucatori[i].prim->info.numar.indice;
  276.             if (castigator.indiceCarte < carte_curenta)
  277.             {
  278.                 castigator.indiceCarte = carte_curenta;
  279.                 castigator.valCarte = jucatori[i].prim->info.numar.valRazboi;
  280.                 castigator.nrJucator = i;
  281.             }
  282.         }
  283.     }
  284. }
  285.  
  286. int CartiEgaleRunda(int carte_max)
  287. {
  288.     int carti_egale = 0;
  289.     int carte_curenta = 0;
  290.     for (int i = 1; i <= nrJucatori; i++)
  291.     {
  292.         carte_curenta = jucatori[i].prim->info.numar.indice;
  293.         if (carte_curenta == carte_max)
  294.         {
  295.             carti_egale++;
  296.         }
  297.     }
  298.     return carti_egale;
  299. }
  300.  
  301. void StergeJucator(int nr)
  302. {
  303.     for (int i = nr; i < nrJucatori; i++)
  304.     {
  305.         jucatori[i] = jucatori[i + 1];
  306.     }
  307.     jucatori[nrJucatori].nrCarti = 0;
  308.     jucatori[nrJucatori].prim = NULL;
  309.     nrJucatori--;
  310. }
  311.  
  312. void VerificaJucatori()
  313. {
  314.     for (int i = 1; i <= nrJucatori; i++)
  315.     {
  316.         if (jucatori[i].nrCarti == 0)
  317.         {
  318.             StergeJucator(i);
  319.             i--;
  320.         }
  321.     }
  322. }
  323.  
  324. // Avem nevoie de definirea asta ca sa il putem apela in Runda()
  325. void Razboi(int nrCartiRazboi);
  326.  
  327. void Runda()
  328. {
  329.     CarteMaxRunda();
  330.     int carti_egale = CartiEgaleRunda(castigator.indiceCarte);
  331.  
  332.     if (carti_egale > 1)
  333.     {
  334.         Razboi(castigator.valCarte);
  335.     }
  336.     else
  337.     {
  338.         jucatori[castigator.nrJucator].scor++;
  339.         cout << jucatori[castigator.nrJucator].nume << " are cea mai mare carte! "<< endl;
  340.         for (int i = 1; i <= nrJucatori; i++)
  341.             MutaCarte(jucatori[i], jucatori[castigator.nrJucator], jucatori[i].prim->info);
  342.     }
  343.  
  344.     // Stergem jucatorii fara carti
  345.     VerificaJucatori();
  346. }
  347.  
  348. // Avem nevoie de doua variabile globale in caz ca dupa ce s-a dat un razboi mai trebuie sa se dea unul
  349. jucator auxRazboi;
  350. void Razboi(int nrCartiRazboi)
  351. {
  352.     cout << "RAZBOI!\n";
  353.  
  354.     // Luam jucatorii care sunt in razboi
  355.     for (int i = 1; i <= nrJucatori; i++)
  356.     {
  357.         if (jucatori[i].prim->info.numar.indice == castigator.indiceCarte)
  358.         {
  359.             jucatori[i].inRazboi = true;
  360.         }
  361.         else
  362.         {
  363.             jucatori[i].inRazboi = false;
  364.         }
  365.     }
  366.  
  367.     // Verificam cati jucatori au un numar insificient de carti
  368.     int jucFaraCartiDestule = 0;
  369.     for (int i = 1; i <= nrJucatori; i++)
  370.     {
  371.         if (jucatori[i].inRazboi == true)
  372.         {
  373.             if (jucatori[i].nrCarti <= nrCartiRazboi)
  374.                 jucFaraCartiDestule++;
  375.         }
  376.     }
  377.  
  378.     // REGULA: daca toti jucatorii nu au carti suficiente atunci se considera egalitate
  379.     if (jucFaraCartiDestule == nrJucatori)
  380.     {
  381.         cout << "EGALITATE intre jucatorii: ";
  382.  
  383.         int aux = 1;
  384.         for (int i = 1; i <= nrJucatori; i++)
  385.         {
  386.             cout << aux++ << " ";
  387.             StergeJucator(i);
  388.             i--;
  389.         }
  390.  
  391.         cout << endl;
  392.         return;
  393.     }
  394.  
  395.     // Jucatorii cu carti insuficiente vor pierde
  396.     for (int i = 1; i <= nrJucatori; i++)
  397.     {
  398.         if (jucatori[i].inRazboi == true)
  399.         {
  400.             int aux = jucatori[i].nrCarti;
  401.             if (aux <= nrCartiRazboi)
  402.             {
  403.                 for (int j = 1; j <= aux; j++)
  404.                 {
  405.                     MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  406.                 }
  407.                 StergeJucator(i);
  408.                 i--;
  409.             }
  410.         }
  411.     }
  412.  
  413.     // Mutam cartile de la jucatorii ramasi in aux
  414.     for (int i = 1; i <= nrJucatori; i++)
  415.     {
  416.         if (jucatori[i].inRazboi == true)
  417.         {
  418.             for (int j = 1; j <= nrCartiRazboi; j++)
  419.             {
  420.                 MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  421.             }
  422.         }
  423.     }
  424.  
  425.     // Aflam cartea maxima
  426.     CarteMaxRunda();
  427.  
  428.     int cartiEgale = CartiEgaleRunda(castigator.indiceCarte);
  429.     if (cartiEgale > 1)
  430.     {
  431.         Razboi(castigator.valCarte);
  432.     }
  433.     else
  434.     {
  435.         // Mutam cartile la castigator
  436.  
  437.         for (int i = 1; i <= nrJucatori; i++)
  438.         {
  439.             MutaCarte(jucatori[i], auxRazboi, jucatori[i].prim->info);
  440.         }
  441.  
  442.         jucatori[castigator.nrJucator].scor++;
  443.         cout << jucatori[castigator.nrJucator].nume << " are cea mai mare carte! " << endl;
  444.         int aux = auxRazboi.nrCarti;
  445.         for (int i = 1; i <= aux; i++)
  446.         {
  447.             MutaCarte(auxRazboi, jucatori[castigator.nrJucator], auxRazboi.prim->info);
  448.         }
  449.  
  450.         auxRazboi.nrCarti = 0;
  451.         auxRazboi.prim = NULL;
  452.     }
  453. }
  454.  
  455. void MakeRazboi(int carteMax = 0)
  456. {
  457.     bool seDaRazboi = false;
  458.  
  459.     if (carteMax == 0)
  460.     {
  461.         CarteMaxRunda();
  462.         carteMax = castigator.indiceCarte;
  463.     }
  464.  
  465.     for (int i = 1; i < nrJucatori; i++)
  466.     {
  467.         for (int j = i + 1; j <= nrJucatori; j++)
  468.         {
  469.             if (jucatori[i].prim->info.numar.indice == jucatori[j].prim->info.numar.indice)
  470.             {
  471.                 if (jucatori[i].prim->info.numar.indice == carteMax)
  472.                     seDaRazboi = true;
  473.             }
  474.         }
  475.     }
  476.  
  477.     if (!seDaRazboi)
  478.     {
  479.         for (int i = 1; i <= nrJucatori; i++)
  480.         {
  481.             jucatori[i].prim = NULL;
  482.             jucatori[i].nrCarti = 0;
  483.         }
  484.  
  485.         AmestecaPachet(carte);
  486.  
  487.         CartiJucator(nrJucatori, NR_CARTI / nrJucatori);
  488.  
  489.         MakeRazboi(carteMax);
  490.     }
  491. }
  492.  
  493. void AfiseazaScorJucatori()
  494. {
  495.  
  496. }
  497.  
  498. void ModificaTopPlayers()
  499. {
  500.  
  501. }
  502.  
  503. int main()
  504. {
  505.     do
  506.     {
  507.         cout << "Numarul de jucatori (max - " << NR_JUCATORI_MAX << "): ";
  508.         cin >> nrJucatori;
  509.     } while (nrJucatori > NR_JUCATORI_MAX || nrJucatori < 2);
  510.  
  511.     cout << "Numele jucatorilor: " << endl;
  512.     cin.get();
  513.     for (int i = 1; i <= nrJucatori; i++)
  514.     {
  515.         cin.get(jucatori[i].nume, 51);
  516.         cin.get();
  517.     }
  518.     // Generam pachetul de carti
  519.     GenerarePachet(carte);
  520.  
  521.     // Eliminam cartile in plus
  522.     EliminareCarti(carte, NR_CARTI % nrJucatori);
  523.  
  524.     // Amestecam pachetul
  525.     AmestecaPachet(carte);
  526.  
  527.     // Impartim cartile la jucatori
  528.     int nrCartiJucator = NR_CARTI / nrJucatori;
  529.     cout << "\nNumarul de carti per jucator:\n" << nrCartiJucator << endl << endl;
  530.     CartiJucator(nrJucatori, nrCartiJucator);
  531.  
  532.     // Creem un razboi
  533.     // MakeRazboi();
  534.  
  535.     AfiseazaToatePachetele();
  536.  
  537.     while (nrJucatori > 1)
  538.     {
  539.         Runda();
  540.  
  541.         cout << endl;
  542.         AfiseazaToatePachetele();
  543.     }
  544.  
  545.     cout << endl;
  546.     cout << "Castigator: "<<jucatori[1].nume<<endl;
  547.     cout << "Scor: " << jucatori[1].scor<<endl;
  548.  
  549.     ModificaTopPlayers();
  550.     cout << endl;
  551.     cout << "----- TOP JUCATORI -----"<<endl;
  552.     cout << endl;
  553.     AfiseazaScorJucatori();
  554.  
  555.     system("pause");
  556.     return 0;
  557. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement