Advertisement
MeehoweCK

Untitled

Dec 16th, 2020
927
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.16 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.     suma, 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.  
  25. bool czy_jest(short* kosci, short liczba) // funkcja sprawdzająca czy dana liczba występuje w wyrzuconej kombinacji
  26. {
  27.     for(short i = 0; i < 5; ++i)
  28.         if(kosci[i] == liczba) return true;
  29.     return false;
  30. }
  31.  
  32. bool duzystrit(short* kosci)    // osobna funkcja sprawdzająca czy z kombinacji wychodzi duży strit
  33. {
  34.     if(czy_jest(kosci, 1) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4) && czy_jest(kosci, 5)) return true;
  35.     if(czy_jest(kosci, 6) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4) && czy_jest(kosci, 5)) return true;
  36.     return false;
  37. }
  38.  
  39. bool malystrit(short* kosci)    // osobna funkcja sprawdzająca czy z kombinacji wychodzi mały strit
  40. {
  41.     if(czy_jest(kosci, 1) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4)) return true;
  42.     if(czy_jest(kosci, 5) && czy_jest(kosci, 2) && czy_jest(kosci, 3) && czy_jest(kosci, 4)) return true;
  43.     if(czy_jest(kosci, 5) && czy_jest(kosci, 6) && czy_jest(kosci, 3) && czy_jest(kosci, 4)) return true;
  44.     return false;
  45. }
  46.  
  47. Kombinacje wynik(short* kosci)      // funkcja zwracająca wynik z wyrzuconych kości
  48. {
  49.     bool flaga = true;
  50.     // sprawdzanie genera³a
  51.     for(short i = 1; i < 5; ++i)
  52.         if(kosci[i] != kosci[0])
  53.         {
  54.             flaga = false;
  55.             break;
  56.         }
  57.     if(flaga) return Kombinacje::general;
  58.  
  59.     // sprawdzanie duzego strita
  60.     if(duzystrit(kosci)) return Kombinacje::duzy_strit;
  61.  
  62.     // sprawdzanie malego strita
  63.     if(malystrit(kosci)) return Kombinacje::maly_strit;
  64.  
  65.     // sprawdzanie fulla
  66.     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])) return Kombinacje::full;
  67.  
  68.     // sprawdzanie czwórki
  69.     if((kosci[0] == kosci[1] && kosci[1] == kosci[2] && kosci[2] == kosci[3]) || (kosci[1] == kosci[2] && kosci[2] == kosci[3] && kosci[3] == kosci[4])) return Kombinacje::czworka;
  70.  
  71.     // sprawdzanie trojki
  72.     if((kosci[0] == kosci[1] && kosci[1] == kosci[2]) || (kosci[1] == kosci[2] && kosci[2] == kosci[3]) || (kosci[2] == kosci[3] && kosci[3] == kosci[4])) return Kombinacje::trojka;
  73.  
  74.     return Kombinacje::suma;
  75. }
  76.  
  77. void sortuj(short* tab)
  78. {
  79.     for(short i = 0; i < 4; ++i)
  80.         for(short j = 0; j < 4 - i; ++j)
  81.             if(tab[j] < tab[j + 1])
  82.                 swap(tab[j], tab[j + 1]);
  83. }
  84.  
  85. void wypisz(short* tab)
  86. {
  87.     for(short i = 0; i < 5; ++i)
  88.         cout << tab[i] << '\t';
  89.     cout << endl;
  90. }
  91.  
  92. string wypisz_wynik(Kombinacje kombo)
  93. {
  94.     switch(kombo)
  95.     {
  96.     case Kombinacje::czworka:
  97.         return "czworka";
  98.     case Kombinacje::duzy_strit:
  99.         return "duzy strit";
  100.     case Kombinacje::full:
  101.         return "full";
  102.     case Kombinacje::general:
  103.         return "general";
  104.     case Kombinacje::maly_strit:
  105.         return "maly strit";
  106.     case Kombinacje::suma:
  107.         return "brak kombinacji";
  108.     case Kombinacje::trojka:
  109.         return "trojka";
  110.     }
  111. }
  112.  
  113. void kopiuj_tablice(short* tab, short* posortowana)
  114. {
  115.     for(short i = 0; i < 5; ++i)
  116.         posortowana[i] = tab[i];
  117.     sortuj(posortowana);
  118. }
  119.  
  120. bool czy_juz_jest(vector<short> przerzucone, short liczba)      // funkcja sprawdzająca czy numer przerzuconej kostki już jest w tablicy
  121. {
  122.     short rozmiar = przerzucone.size();
  123.     for(short i = 0; i < rozmiar; ++i)
  124.         if(przerzucone[i] == liczba)
  125.             return true;
  126.     return false;
  127. }
  128.  
  129. void przerzuc(short gracz)
  130. {
  131.     vector<short> przerzucone;
  132.     przerzucone.clear();
  133.     char znak;
  134.     short numer;
  135.     do
  136.     {
  137.         do
  138.         {
  139.             znak = getch();
  140.             znak = toupper(znak);
  141.         } while(znak != '1' && znak != '2' && znak != '3' && znak != '4' && znak != '5' && znak != 'K');
  142.  
  143.         if(znak == 'K')
  144.             break;
  145.  
  146.         numer = znak - '0';
  147.         if(czy_juz_jest(przerzucone, numer - 1))
  148.             continue;       // ta kostka już została wybrana, więc pomijamy
  149.         przerzucone.push_back(numer - 1);
  150.         cout << numer << '\t';
  151.         if(przerzucone.size() == 5) break;      // wszystkie kości zostały wybrane, więc kolejnych już nie wpisujemy
  152.     } while(true);
  153.  
  154.     // przerzucanie wybranych kości
  155.     short ile = przerzucone.size();
  156.     if(ile == 0)
  157.     {
  158.         cout << "Nie wybrales/wybralas kosci do przerzucenia.\n";
  159.         return;
  160.     }
  161.  
  162.     cout << "\nWcisnij dowolny klawisz, aby przerzucic wybrane kosci...\n";
  163.     getch();
  164.     srand(time(nullptr));
  165.     for(short i = 0; i < ile; ++i)
  166.         gracze[gracz].kosci[przerzucone[i]] = 1 + rand() % 6;
  167.     cout << "Kosci zostaly rzucone ;)\t";
  168.     wypisz(gracze[gracz].kosci);
  169. }
  170.  
  171. short suma(short* kosci)        // zwraca sume oczek na kostkach
  172. {
  173.     short wynik = 0;
  174.     for(short i = 0; i < 5; ++i)
  175.         wynik += kosci[i];
  176.     return wynik;
  177. }
  178.  
  179. void rzut_koscmi(short n)
  180. {
  181.     srand(time(nullptr));
  182.     for(short i = 0; i < 5; ++i)
  183.         gracze[n].kosci[i] = 1 + rand() % 6;
  184.     cout << "Kosci zostaly rzucone ;)\t";
  185.     wypisz(gracze[n].kosci);
  186.     cout << "Czy chcesz przerzucic kosci? (t/n): ";
  187.     char znak;
  188.     do
  189.     {
  190.         znak = getch();
  191.         znak = toupper(znak);
  192.     } while(znak != 'T' && znak != 'N');
  193.     if(znak == 'T')
  194.     {
  195.         cout << "TAK\n";
  196.         cout << "Wybierz numery kosci (1-5), ktore chcesz przerzucic lub wcisnij K jesli zakonczyles/zakonczylas wybieranie:\n";
  197.  
  198.         // wybieranie kosci do przerzucenia:
  199.         przerzuc(n);
  200.     }
  201.     if(znak == 'N')
  202.         cout << "NIE\n";
  203.  
  204.     // sprawdzenie wyniku:
  205.     short tablica[5];
  206.     kopiuj_tablice(gracze[n].kosci, tablica);
  207.     gracze[n].wynik = wynik(tablica);
  208.     gracze[n].wynik2 = suma(tablica);
  209.  
  210.     // wypisanie wyniku:
  211.     cout << "\n\tTwoj wynik to " << wypisz_wynik(gracze[n].wynik) << " (suma oczek: " << gracze[n].wynik2 << ')' << endl << endl;
  212.     cout << "Wcisnij dowolny klawisz, aby zakonczyc swoja ture...";
  213.     getch();
  214. }
  215.  
  216. void gra()
  217. {
  218.     short liczba_graczy = gracze.size();
  219.  
  220.     for(short i = 0; i < liczba_graczy; ++i)
  221.     {
  222.         system("cls");
  223.         cout << "Tura gracza " << i + 1 << ": " << gracze[i].imie << "\nWcisnij dowolny klawisz, aby rzucic koscmi!\n";
  224.         getch();
  225.         rzut_koscmi(i);
  226.     }
  227.  
  228.     system("cls");
  229.     cout << "Wszyscy gracze rzucili koscmi. Wcisnij dowolny klawisz, aby zobaczyc kto wygral!";
  230.     getch();
  231.     system("cls");
  232. }
  233.  
  234. // funkcje operatorowe, umożliwiające weryfikowanie który z graczy ma lepszy wynik:
  235. bool operator<(Gracz A, Gracz B)
  236. {
  237.     if(A.wynik < B.wynik)
  238.         return true;
  239.     if(A.wynik == B.wynik && A.wynik2 < B.wynik2)
  240.         return true;
  241.     return false;
  242. }
  243.  
  244. bool operator==(Gracz A, Gracz B)
  245. {
  246.     if(A.wynik == B.wynik && A.wynik2 == B.wynik2)
  247.         return true;
  248.     return false;
  249. }
  250.  
  251. void sortuj_ranking()
  252. {
  253.     short ile = gracze.size() - 1;
  254.  
  255.     for(short i = 0; i < ile; ++i)
  256.         for(short j = 0; j < ile - i; ++j)
  257.             if(gracze[j] < gracze[j + 1])
  258.                 swap(gracze[j], gracze[j + 1]);
  259.  
  260. }
  261.  
  262. void wypisz_ranking()
  263. {
  264.     short ile = gracze.size();
  265.     short miejsce = 1;
  266.  
  267.     // wypisanie pierwszego miejsca:
  268.     cout << "1. Gracz nr " << gracze[0].nr << "\t(" << gracze[0].imie << ")\t" << "wynik: " << wypisz_wynik(gracze[0].wynik) << " (suma oczek: " << gracze[0].wynik2 << ")\n";
  269.  
  270.     // wypisanie kolejnych miejsc:
  271.     for(short i = 1; i < ile; ++i)
  272.     {
  273.         if(gracze[i] < gracze[i - 1])
  274.             miejsce = i + 1;
  275.         cout << miejsce << ". Gracz nr " << gracze[i].nr << "\t(" << gracze[i].imie << ")\t" << "wynik: " << wypisz_wynik(gracze[i].wynik) << " (suma oczek: " << gracze[i].wynik2 << ")\n";
  276.     }
  277.  
  278.     // liczymy ilu graczy zwyciężyło:
  279.     short zwyciezcy = 1;
  280.  
  281.     for(short i = 1; i < ile; ++i)
  282.     {
  283.         if(gracze[i] == gracze[0])
  284.             ++zwyciezcy;
  285.         else
  286.             break;
  287.     }
  288.  
  289.     cout << endl;
  290.     if(zwyciezcy == 1)
  291.         cout << "Zwyciezyl gracz nr " << gracze[0].nr << " (" << gracze[0].imie << ") Gratulacje!\n";
  292.     else    // wypisanie więcej niż jednego gracza
  293.     {
  294.         cout << "Zwyciezyli ex aequo ";
  295.  
  296.         for(short i = 0; true; ++i)
  297.         {
  298.             cout << "gracz nr " << gracze[i].nr << " (" << gracze[i].imie << ')';
  299.             if(i == zwyciezcy - 1)
  300.             {
  301.                 cout << "\nGratulacje!\n";
  302.                 break;
  303.             }
  304.             else if(i == zwyciezcy - 2)
  305.                 cout << " i ";
  306.             else
  307.                 cout << ", ";
  308.         }
  309.     }
  310. }
  311.  
  312. void interfejs()        // funkcja uruchamiająca program
  313. {
  314.     cout << "Wpisz liczbe graczy (od 2 do 10): ";
  315.     short liczba_graczy;
  316.     cin >> liczba_graczy;
  317.     while(cin.fail() || liczba_graczy < 2 || liczba_graczy > 10)
  318.     {
  319.         cout << "Wpisales niepoprawna liczbe. Wpisz jeszcze raz: ";
  320.         cin.clear();
  321.         cin.ignore(99999, '\n');
  322.         cin >> liczba_graczy;
  323.     }
  324.  
  325.     gracze.resize(liczba_graczy);
  326.  
  327.     // wpisywanie imion graczy:
  328.     cout << "Podaj imiona graczy\n";
  329.     for(short i = 0; i < liczba_graczy; ++i)
  330.     {
  331.         cout << "\tGracz nr " << i + 1 << ": ";
  332.         cin >> gracze[i].imie;
  333.         gracze[i].nr = i + 1;
  334.     }
  335.  
  336.     cout << "Wcisnij dowolny klawisz, aby rozpoczac gre...";
  337.     getch();
  338.     gra();
  339.     sortuj_ranking();
  340.     wypisz_ranking();
  341.     cout << "\n\n\nWcisnij N, aby wyjsc z programu lub T, aby zagrac jeszcze raz...";
  342.  
  343.     char znak;
  344.     do
  345.     {
  346.         znak = getch();
  347.         znak = toupper(znak);
  348.     } while(znak != 'T' && znak != 'N');
  349.  
  350.     if(znak == 'T')
  351.     {
  352.         system("cls");
  353.         interfejs();
  354.     }
  355. }
  356.  
  357. int main()
  358. {
  359.     interfejs();
  360.     return 0;
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement