MeehoweCK

Untitled

May 10th, 2020
1,293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. /*Zadanie 5.
  2. Napisz program, który z talii 52 kart losuje 5 kart. Przyjmij, że karty
  3. mają nazwy: As, Król, Dama, Walet, 10, 9, 8, 7, 6, 5, 4, 3, 2 oraz
  4. kolory: trefl, karo, kier, pik. Sprawdź, czy w wylosowanych kartach jest
  5. kareta.*/
  6.  
  7. #include <iostream>
  8. #include <ctime>
  9.  
  10. enum class figura       //co oznacza enum - jest to tzw. typ wyliczeniowy, czyli typ tworzony przez programistę
  11. {
  12.     as = 0, w2, w3, w4, w5, w6, w7, w8, w9, w10, walet, dama, krol  //dlaczego tylko as=0 - kolejne wartości są już liczone po kolei automatycznie (czyli w2 = 1 itd.)
  13. };
  14.  
  15. enum class kolor
  16. {
  17.     karo = 0, kier, pik, trefl
  18. };
  19.  
  20. struct Karta
  21. {
  22.     figura wartosc;
  23.     kolor znaczek;
  24. };
  25.  
  26. using namespace std;
  27.  
  28. bool juz_jest(int* tab, int n, int wartosc) // to funkcja, która sprawdza czy podana liczba (wartosc) znajduje się w tablicy (tab) w pierwszych n elementach. Dzięki niej powtórzenie kart nie jest możliwe
  29. {
  30.     for(int i = 0; i < n; ++i)
  31.         if(tab[i] == wartosc)
  32.             return true;
  33.     return false;
  34. }
  35.  
  36. void losuj_reke(int* tab)     // losuje pięć kart "na rękę" - tak aby się nie powtarzały
  37. {
  38.     srand(static_cast<unsigned>(time(nullptr)));
  39.  
  40.     int suspect;
  41.  
  42.     for(int i = 0; i < 5; ++i)
  43.     {
  44.         do
  45.         {
  46.             suspect = rand() % 52;
  47.         } while(juz_jest(tab, i, suspect));
  48.         tab[i] = suspect;
  49.     }
  50. }
  51.  
  52. void wypisz_karte(Karta karta)
  53. {
  54.     int wartosc = static_cast<int>(karta.wartosc);      //co oznacza zapis <int>(karta.wartosc) - jest to tzw. rzutowanie statyczne. Dzięki niemu możemy pobrać wartości kart i je porównać ze sobą (np. as = 0)
  55.     int kolor = static_cast<int>(karta.znaczek);
  56.  
  57.     switch(wartosc)
  58.     {
  59.     case 0:
  60.         cout << "As ";
  61.         break;
  62.     case 1:
  63.         cout << "2 ";
  64.         break;
  65.     case 2:
  66.         cout << "3 ";
  67.         break;
  68.     case 3:
  69.         cout << "4 ";
  70.         break;
  71.     case 4:
  72.         cout << "5 ";
  73.         break;
  74.     case 5:
  75.         cout << "6 ";
  76.         break;
  77.     case 6:
  78.         cout << "7 ";
  79.         break;
  80.     case 7:
  81.         cout << "8 ";
  82.         break;
  83.     case 8:
  84.         cout << "9 ";
  85.         break;
  86.     case 9:
  87.         cout << "10 ";
  88.         break;
  89.     case 10:
  90.         cout << "Walet ";
  91.         break;
  92.     case 11:
  93.         cout << "Dama ";
  94.         break;
  95.     case 12:
  96.         cout << "Krol ";
  97.         break;
  98.     }
  99.  
  100.     switch(kolor)
  101.     {
  102.     case 0:
  103.         cout << "karo\n";
  104.         break;
  105.     case 1:
  106.         cout << "kier\n";
  107.         break;
  108.     case 2:
  109.         cout << "pik\n";
  110.         break;
  111.     case 3:
  112.         cout << "trefl\n";
  113.         break;
  114.     }
  115. }
  116.  
  117. bool jest_kareta(int* reka) //co oznacza "reka" ?? - są to karty "na ręce" czyli trzymane przez gracza
  118. {
  119.     int licznik = 1;
  120.     int szukana = reka[0] / 4;  //po co dzielimy przez 4 - aby określić czy wartość karty jest ta sama. Przykładowo asy mają numery od 0 do 3, dwójki od 4 do 7 itd.
  121.     for(int i = 1; i < 5; ++i)
  122.         if(reka[i] / 4 == szukana)
  123.             ++licznik;
  124.     if(licznik == 4)
  125.         return true;
  126.     szukana = reka[1] / 4;  // po co po raz drugi przepisujemu te wartość do szukana - bo mamy sprawdzić czy wśród pięciu kart są cztery o tej samej wartości. Więc najpierw porównujemy do pierwszej karty (reka[0]), a potem jeszcze na wszelki wypadek do drugiej (reka[1])
  127.     for(int i = 2; i < 5; ++i)
  128.         if(reka[i] / 4 != szukana)
  129.             return false;
  130.     return true;
  131. }
  132.  
  133. int main()
  134. {
  135.     Karta talia[52];
  136.     for(int i = 0; i < 13; ++i)
  137.         for(int j = 0; j < 4; ++j)
  138.            {
  139.                 talia[i*4 + j].wartosc = static_cast<figura>(i); //co oznacza ten zapis <figura>(i) - to jest rzutowanie statyczne, tak jak w 54. wierszu
  140.                //po co dodajemy j ?? - żeby każda karta miała inny numer (od 0 do 51)
  141.                 talia[i*4 + j].znaczek = static_cast<kolor>(j);
  142.         }
  143.     int reka[5];
  144.     losuj_reke(reka);
  145.  
  146.     for(int i = 0; i < 5; ++i)
  147.         wypisz_karte(talia[reka[i]]);
  148.  
  149.     if(jest_kareta(reka))
  150.         cout << "\nJest kareta\n";
  151.     else
  152.         cout << "\nNie ma karety\n";
  153.     return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment