Advertisement
MeehoweCK

Untitled

Dec 21st, 2020
1,032
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <vector>
  5. #include <conio.h>
  6.  
  7. using namespace std;
  8.  
  9. enum class Kombinacje   // lista wyliczeniowa możliwych wyników (ułożona od najsłabszego do najlepszego możliwego wyniku)
  10. {
  11.     para, dwie_pary, nieparzyste, parzyste, trojka, czworka, full, maly_strit, duzy_strit, general
  12. };
  13.  
  14. struct Gracz
  15. {
  16.     short nr;
  17.     string imie;
  18.     short kosci[5];
  19.     Kombinacje wynik;
  20.     short wynik2;
  21. };
  22.  
  23. vector<Gracz> gracze;       // wektor przechowujący wszystkich graczy
  24. short rundy;
  25.  
  26. short suma(short* kosci)        // zwraca sume oczek na kostkach
  27. {
  28.     short wynik = 0;
  29.     for(short i = 0; i < 5; ++i)
  30.         wynik += kosci[i];
  31.     return wynik;
  32. }
  33.  
  34. bool czy_jest(short* kosci, short liczba) // funkcja sprawdzająca czy dana liczba występuje w wyrzuconej kombinacji
  35. {
  36.     for(short i = 0; i < 5; ++i)
  37.         if(kosci[i] == liczba) return true;
  38.     return false;
  39. }
  40.  
  41. bool duzystrit(short* kosci)    // osobna funkcja sprawdzająca czy z kombinacji wychodzi duży strit
  42. {
  43.     if(czy_jest(kosci, 6) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4) && czy_jest(kosci, 5)) return true;
  44.     return false;
  45. }
  46.  
  47. bool malystrit(short* kosci)    // osobna funkcja sprawdzająca czy z kombinacji wychodzi mały strit
  48. {
  49.     if(czy_jest(kosci, 1) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4) && czy_jest(kosci, 5)) return true;
  50.     return false;
  51. }
  52.  
  53. bool czworka(short* kosci, short& pkt)
  54. {
  55.     if(kosci[0] == kosci[1] && kosci[1] == kosci[2] && kosci[2] == kosci[3])
  56.     {
  57.         pkt = 4 * kosci[0] + 20;
  58.         return true;
  59.     }
  60.     if(kosci[1] == kosci[2] && kosci[2] == kosci[3] && kosci[3] == kosci[4])
  61.     {
  62.         pkt = 4 * kosci[1] + 20;
  63.         return true;
  64.     }
  65.     return false;
  66. }
  67.  
  68. bool trojka(short* kosci, short& pkt)
  69. {
  70.     if(kosci[0] == kosci[1] && kosci[1] == kosci[2])
  71.     {
  72.         pkt = 3 * kosci[0];
  73.         return true;
  74.     }
  75.  
  76.     if(kosci[1] == kosci[2] && kosci[2] == kosci[3])
  77.     {
  78.         pkt = 3 * kosci[1];
  79.         return true;
  80.     }
  81.  
  82.     if(kosci[2] == kosci[3] && kosci[3] == kosci[4])
  83.     {
  84.         pkt = 3 * kosci[2];
  85.         return true;
  86.     }
  87.     return false;
  88. }
  89.  
  90. bool nieparzyste(short* kosci)
  91. {
  92.     if(kosci[0] %2 != 0 && kosci[1] %2 != 0 && kosci[2] %2 != 0 && kosci[3] %2 != 0 && kosci[4] %2 != 0)
  93.         return true;
  94.     return false;
  95. }
  96.  
  97. bool parzyste(short* kosci)
  98. {
  99.     if(kosci[0] %2 == 0 && kosci[1] %2 == 0 && kosci[2] %2 == 0 && kosci[3] %2 == 0 && kosci[4] %2 == 0)
  100.         return true;
  101.     return false;
  102. }
  103.  
  104. bool dwie_pary(short* kosci, short& pkt)
  105. {
  106.     if(kosci[0] == kosci[1] && kosci[2] == kosci[3])
  107.     {
  108.         pkt = 2 * kosci[0] + 2 * kosci[2];
  109.         return true;
  110.     }
  111.     if(kosci[0] == kosci[1] && kosci[3] == kosci[4])
  112.     {
  113.         pkt = 2 * kosci[0] + 2 * kosci[3];
  114.         return true;
  115.     }
  116.     if(kosci[1] == kosci[2] && kosci[3] == kosci[4])
  117.     {
  118.         pkt = 2 * kosci[1] + 2 * kosci[3];
  119.         return true;
  120.     }
  121.     return false;
  122. }
  123.  
  124. bool para(short* kosci, short& pkt)
  125. {
  126.     if(kosci[0] == kosci[1])
  127.     {
  128.         pkt = 2 * kosci[0];
  129.         return true;
  130.     }
  131.     if(kosci[1] == kosci[2])
  132.     {
  133.         pkt = 2 * kosci[1];
  134.         return true;
  135.     }
  136.     if(kosci[2] == kosci[3])
  137.     {
  138.         pkt = 2 * kosci[2];
  139.         return true;
  140.     }
  141.     if(kosci[3] == kosci[4])
  142.     {
  143.         pkt = 2 * kosci[3];
  144.         return true;
  145.     }
  146.     return false;
  147. }
  148.  
  149. Kombinacje wynik(short* kosci, short& punkty)      // funkcja zwracająca wynik z wyrzuconych kości
  150. {
  151.     Kombinacje figura;
  152.     punkty = 0;
  153.     short punkty_spr;
  154.  
  155.     bool flaga = true;
  156.     // sprawdzanie genera³a
  157.     for(short i = 1; i < 5; ++i)
  158.         if(kosci[i] != kosci[0])
  159.         {
  160.             flaga = false;
  161.             break;
  162.         }
  163.  
  164.     if(flaga)
  165.     {
  166.         figura = Kombinacje::general;
  167.         punkty = 50 + suma(kosci);
  168.     }
  169.  
  170.     // sprawdzanie duzego strita
  171.     if(duzystrit(kosci))
  172.     {
  173.         if(20 > punkty)
  174.         {
  175.             figura = Kombinacje::duzy_strit;
  176.             punkty = 20;
  177.         }
  178.     }
  179.  
  180.     // sprawdzanie malego strita
  181.     if(malystrit(kosci))
  182.     {
  183.         if(15 > punkty)
  184.         {
  185.             figura = Kombinacje::maly_strit;
  186.             punkty = 15;
  187.         }
  188.     }
  189.  
  190.     // sprawdzanie fulla
  191.     if((kosci[0] == kosci[1] && kosci[2] == kosci[3] && kosci[3] == kosci[4]) || (kosci[0] == kosci[1] && kosci[1] == kosci[2] && kosci[3] == kosci[4]))
  192.     {
  193.         punkty_spr = 10 + suma(kosci);
  194.         if(punkty_spr > punkty)
  195.         {
  196.             figura = Kombinacje::full;
  197.             punkty = punkty_spr;
  198.         }
  199.     }
  200.  
  201.     // sprawdzanie czwórki
  202.     if(czworka(kosci, punkty_spr))
  203.     {
  204.         if(punkty_spr > punkty)
  205.         {
  206.             figura = Kombinacje::czworka;
  207.             punkty = punkty_spr;
  208.         }
  209.     }
  210.  
  211.     // sprawdzanie trojki
  212.     if(trojka(kosci, punkty_spr))
  213.     {
  214.         if(punkty_spr > punkty)
  215.         {
  216.             figura = Kombinacje::trojka;
  217.             punkty = punkty_spr;
  218.         }
  219.     }
  220.  
  221.     // sprawdzanie nieparzystych
  222.     if(nieparzyste(kosci))
  223.     {
  224.         punkty_spr = suma(kosci);
  225.         if(punkty_spr > punkty)
  226.         {
  227.             punkty = punkty_spr;
  228.             figura = Kombinacje::nieparzyste;
  229.         }
  230.     }
  231.  
  232.     // sprawdzanie parzystych
  233.     if(parzyste(kosci))
  234.     {
  235.         punkty_spr = suma(kosci);
  236.         if(punkty_spr > punkty)
  237.         {
  238.             punkty = punkty_spr;
  239.             figura = Kombinacje::parzyste;
  240.         }
  241.     }
  242.  
  243.     // sprawdzanie dwóch par
  244.     if(dwie_pary(kosci, punkty_spr))
  245.     {
  246.         if(punkty_spr > punkty)
  247.         {
  248.             punkty = punkty_spr;
  249.             figura = Kombinacje::dwie_pary;
  250.         }
  251.     }
  252.  
  253.     // sprawdzanie pary
  254.     if(para(kosci, punkty_spr))
  255.     {
  256.         if(punkty_spr > punkty)
  257.         {
  258.             punkty = punkty_spr;
  259.             figura = Kombinacje::para;
  260.         }
  261.     }
  262.  
  263.     return figura;
  264. }
  265.  
  266. void sortuj(short* tab)
  267. {
  268.     for(short i = 0; i < 4; ++i)
  269.         for(short j = 0; j < 4 - i; ++j)
  270.             if(tab[j] < tab[j + 1])
  271.                 swap(tab[j], tab[j + 1]);
  272. }
  273.  
  274. void wypisz(short* tab)
  275. {
  276.     for(short i = 0; i < 5; ++i)
  277.         cout << tab[i] << '\t';
  278.     cout << endl;
  279. }
  280.  
  281. string wypisz_wynik(Kombinacje kombo)
  282. {
  283.     switch(kombo)
  284.     {
  285.     case Kombinacje::czworka:
  286.         return "czworka";
  287.     case Kombinacje::duzy_strit:
  288.         return "duzy strit";
  289.     case Kombinacje::full:
  290.         return "full";
  291.     case Kombinacje::general:
  292.         return "general";
  293.     case Kombinacje::maly_strit:
  294.         return "maly strit";
  295.     case Kombinacje::para:
  296.         return "para";
  297.     case Kombinacje::trojka:
  298.         return "trojka";
  299.     case Kombinacje::parzyste:
  300.         return "parzyste";
  301.     case Kombinacje::nieparzyste:
  302.         return "nieparzyste";
  303.     case Kombinacje::dwie_pary:
  304.         return "dwie pary";
  305.     }
  306. }
  307.  
  308. void kopiuj_tablice(short* tab, short* posortowana)
  309. {
  310.     for(short i = 0; i < 5; ++i)
  311.         posortowana[i] = tab[i];
  312.     sortuj(posortowana);
  313. }
  314.  
  315. bool czy_juz_jest(vector<short> przerzucone, short liczba)      // funkcja sprawdzająca czy numer przerzuconej kostki już jest w tablicy
  316. {
  317.     short rozmiar = przerzucone.size();
  318.     for(short i = 0; i < rozmiar; ++i)
  319.         if(przerzucone[i] == liczba)
  320.             return true;
  321.     return false;
  322. }
  323.  
  324. void przerzuc(short gracz)
  325. {
  326.     vector<short> przerzucone;
  327.     przerzucone.clear();
  328.     char znak;
  329.     short numer;
  330.     do
  331.     {
  332.         do
  333.         {
  334.             znak = getch();
  335.             znak = toupper(znak);
  336.         }
  337.         while(znak != '1' && znak != '2' && znak != '3' && znak != '4' && znak != '5' && znak != 'K');
  338.  
  339.         if(znak == 'K')
  340.             break;
  341.  
  342.         numer = znak - '0';
  343.         if(czy_juz_jest(przerzucone, numer - 1))
  344.             continue;       // ta kostka już została wybrana, więc pomijamy
  345.         przerzucone.push_back(numer - 1);
  346.         cout << numer << '\t';
  347.         if(przerzucone.size() == 5) break;      // wszystkie kości zostały wybrane, więc kolejnych już nie wpisujemy
  348.     }
  349.     while(true);
  350.  
  351.     // przerzucanie wybranych kości
  352.     short ile = przerzucone.size();
  353.     if(ile == 0)
  354.     {
  355.         cout << "Nie wybrales/wybralas kosci do przerzucenia.\n";
  356.         return;
  357.     }
  358.  
  359.     cout << "\nWcisnij dowolny klawisz, aby przerzucic wybrane kosci...\n";
  360.     getch();
  361.     srand(time(nullptr));
  362.     for(short i = 0; i < ile; ++i)
  363.         gracze[gracz].kosci[przerzucone[i]] = 1 + rand() % 6;
  364.     cout << "Kosci zostaly rzucone ;)\t";
  365.     wypisz(gracze[gracz].kosci);
  366. }
  367.  
  368. void rzut_koscmi(short n)
  369. {
  370.     srand(time(nullptr));
  371.     for(short i = 0; i < 5; ++i)
  372.         gracze[n].kosci[i] = 1 + rand() % 6;
  373.     cout << "Kosci zostaly rzucone ;)\t";
  374.     wypisz(gracze[n].kosci);
  375.     cout << "Czy chcesz przerzucic kosci? (t/n): ";
  376.     char znak;
  377.     do
  378.     {
  379.         znak = getch();
  380.         znak = toupper(znak);
  381.     }
  382.     while(znak != 'T' && znak != 'N');
  383.     if(znak == 'T')
  384.     {
  385.         cout << "TAK\n";
  386.         cout << "Wybierz numery kosci (1-5), ktore chcesz przerzucic lub wcisnij K jesli zakonczyles/zakonczylas wybieranie:\n";
  387.  
  388.         // wybieranie kosci do przerzucenia:
  389.         przerzuc(n);
  390.     }
  391.     bool flaga = true;
  392.     if(znak == 'N')
  393.     {
  394.         flaga = false;
  395.         cout << "NIE\n";
  396.     }
  397.  
  398.     // ponowne przerzucenie kości
  399.     if(flaga)
  400.     {
  401.         cout << "Czy chcesz ponownie przerzucic kosci? (t/n): ";
  402.         do
  403.         {
  404.             znak = getch();
  405.             znak = toupper(znak);
  406.         }
  407.         while(znak != 'T' && znak != 'N');
  408.         if(znak == 'T')
  409.         {
  410.             cout << "TAK\n";
  411.             cout << "Wybierz numery kosci (1-5), ktore chcesz przerzucic lub wcisnij K jesli zakonczyles/zakonczylas wybieranie:\n";
  412.  
  413.             // wybieranie kosci do przerzucenia:
  414.             przerzuc(n);
  415.         }
  416.         if(znak == 'N')
  417.             cout << "NIE\n";
  418.     }
  419.  
  420.     // sprawdzenie wyniku:
  421.     short tablica[5];
  422.     kopiuj_tablice(gracze[n].kosci, tablica);
  423.     short punkty;
  424.     gracze[n].wynik = wynik(tablica, punkty);
  425.     gracze[n].wynik2 += punkty;
  426.  
  427.     // wypisanie wyniku:
  428.     cout << "\n\tTwoj wynik to " << wypisz_wynik(gracze[n].wynik) << " (liczba punktow: " << punkty << ')' << endl << endl;
  429.     cout << "Wcisnij dowolny klawisz, aby zakonczyc swoja ture...";
  430.     getch();
  431. }
  432.  
  433. // funkcje operatorowe, umożliwiające weryfikowanie który z graczy ma lepszy wynik:
  434. bool operator<(Gracz A, Gracz B)
  435. {
  436.     if(A.wynik2 < B.wynik2)
  437.         return true;
  438.     return false;
  439. }
  440.  
  441. bool operator==(Gracz A, Gracz B)
  442. {
  443.     if(A.wynik2 == B.wynik2)
  444.         return true;
  445.     return false;
  446. }
  447.  
  448. void sortuj_ranking()
  449. {
  450.     short ile = gracze.size() - 1;
  451.  
  452.     for(short i = 0; i < ile; ++i)
  453.         for(short j = 0; j < ile - i; ++j)
  454.             if(gracze[j] < gracze[j + 1])
  455.                 swap(gracze[j], gracze[j + 1]);
  456.  
  457. }
  458.  
  459. void wypisz_ranking(bool koniec)
  460. {
  461.     short ile = gracze.size();
  462.     short miejsce = 1;
  463.  
  464.     // wypisanie pierwszego miejsca:
  465.     cout << "1. Gracz nr " << gracze[0].nr << "\t(" << gracze[0].imie << ")\t" << "wynik: " << gracze[0].wynik2 << " pkt\n";
  466.  
  467.     // wypisanie kolejnych miejsc:
  468.     for(short i = 1; i < ile; ++i)
  469.     {
  470.         if(gracze[i] < gracze[i - 1])
  471.             miejsce = i + 1;
  472.         cout << miejsce << ". Gracz nr " << gracze[i].nr << "\t(" << gracze[i].imie << ")\t" << "wynik: " << gracze[i].wynik2 << " pkt\n";
  473.     }
  474.  
  475.     if(koniec)
  476.     {
  477.         // liczymy ilu graczy zwyciężyło:
  478.         short zwyciezcy = 1;
  479.  
  480.         for(short i = 1; i < ile; ++i)
  481.         {
  482.             if(gracze[i] == gracze[0])
  483.                 ++zwyciezcy;
  484.             else
  485.                 break;
  486.         }
  487.  
  488.         cout << endl;
  489.         if(zwyciezcy == 1)
  490.             cout << "Zwyciezyl gracz nr " << gracze[0].nr << " (" << gracze[0].imie << ") Gratulacje!\n";
  491.         else    // wypisanie więcej niż jednego gracza
  492.         {
  493.             cout << "Zwyciezyli ex aequo ";
  494.  
  495.             for(short i = 0; true; ++i)
  496.             {
  497.                 cout << "gracz nr " << gracze[i].nr << " (" << gracze[i].imie << ')';
  498.                 if(i == zwyciezcy - 1)
  499.                 {
  500.                     cout << "\nGratulacje!\n";
  501.                     break;
  502.                 }
  503.                 else if(i == zwyciezcy - 2)
  504.                     cout << " i ";
  505.                 else
  506.                     cout << ", ";
  507.             }
  508.         }
  509.     }
  510. }
  511.  
  512. void gra()
  513. {
  514.     short liczba_graczy = gracze.size();
  515.     char komenda;
  516.  
  517.     for(short i = 0; i < rundy; ++i)
  518.     {
  519.         system("cls");
  520.         cout << "RUNDA " << i + 1 << endl;
  521.         cout << "Wcisnij dowolny klawisz, aby rozpoczac runde!";
  522.         getch();
  523.  
  524.         for(short i = 0; i < liczba_graczy; ++i)
  525.         {
  526.             system("cls");
  527.             cout << "Tura gracza " << i + 1 << ": " << gracze[i].imie << "\nWcisnij dowolny klawisz, aby rzucic koscmi!\n";
  528.             getch();
  529.             rzut_koscmi(i);
  530.         }
  531.  
  532.         if(i < rundy - 1)
  533.         {
  534.             system("cls");
  535.             cout << "Runda zostala zakonczona. Czy chcesz zobaczyc aktualny ranking? (t/n) ";
  536.             do
  537.             {
  538.                 komenda = getch();
  539.                 komenda = toupper(komenda);
  540.             }
  541.             while(komenda != 'T' && komenda != 'N');
  542.  
  543.             if(komenda == 'T')
  544.             {
  545.                 cout << "TAK\n";
  546.                 wypisz_ranking(false);
  547.                 cout << endl << "Wcisnij dowolny klawisz, aby kontynuowac...";
  548.                 getch();
  549.             }
  550.             else
  551.             {
  552.                 cout << "NIE\n";
  553.             }
  554.         }
  555.     }
  556.  
  557.     system("cls");
  558.     cout << "Wszyscy gracze rzucili koscmi. Wcisnij dowolny klawisz, aby zobaczyc kto wygral!";
  559.     getch();
  560.     system("cls");
  561. }
  562.  
  563. void interfejs()        // funkcja uruchamiająca program
  564. {
  565.     cout << "Wpisz liczbe graczy (od 2 do 10): ";
  566.     short liczba_graczy;
  567.     cin >> liczba_graczy;
  568.     while(cin.fail() || liczba_graczy < 2 || liczba_graczy > 10)
  569.     {
  570.         cout << "Wpisales/wpisalas niepoprawna liczbe. Wpisz jeszcze raz: ";
  571.         cin.clear();
  572.         cin.ignore(99999, '\n');
  573.         cin >> liczba_graczy;
  574.     }
  575.  
  576.     gracze.resize(liczba_graczy);
  577.  
  578.     // wpisywanie imion graczy:
  579.     cout << "Podaj imiona graczy\n";
  580.     for(short i = 0; i < liczba_graczy; ++i)
  581.     {
  582.         cout << "\tGracz nr " << i + 1 << ": ";
  583.         cin >> gracze[i].imie;
  584.         gracze[i].nr = i + 1;
  585.     }
  586.  
  587.     system("cls");
  588.  
  589.     cout << "Wpisz liczbe rund (od 1 do 5): ";
  590.     cin >> rundy;
  591.     while(cin.fail() || liczba_graczy < 1 || liczba_graczy > 5)
  592.     {
  593.         cout << "Wpisales/wpisalas niepoprawna liczbe. Wpisz jeszcze raz: ";
  594.         cin.clear();
  595.         cin.ignore(99999, '\n');
  596.         cin >> rundy;
  597.     }
  598.  
  599.     cout << "Wcisnij dowolny klawisz, aby rozpoczac gre...";
  600.     getch();
  601.     gra();
  602.     sortuj_ranking();
  603.     wypisz_ranking(true);
  604.     cout << "\n\n\nWcisnij N, aby wyjsc z programu lub T, aby zagrac jeszcze raz...";
  605.  
  606.     char znak;
  607.     do
  608.     {
  609.         znak = getch();
  610.         znak = toupper(znak);
  611.     }
  612.     while(znak != 'T' && znak != 'N');
  613.  
  614.     if(znak == 'T')
  615.     {
  616.         system("cls");
  617.         interfejs();
  618.     }
  619. }
  620.  
  621. int main()
  622. {
  623.     interfejs();
  624.     return 0;
  625. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement