Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Zadanie 5.
- Napisz program, który z talii 52 kart losuje 5 kart. Przyjmij, że karty
- mają nazwy: As, Król, Dama, Walet, 10, 9, 8, 7, 6, 5, 4, 3, 2 oraz
- kolory: trefl, karo, kier, pik. Sprawdź, czy w wylosowanych kartach jest
- kareta.*/
- #include <iostream>
- #include <ctime>
- enum class figura //co oznacza enum - jest to tzw. typ wyliczeniowy, czyli typ tworzony przez programistę
- {
- 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.)
- };
- enum class kolor
- {
- karo = 0, kier, pik, trefl
- };
- struct Karta
- {
- figura wartosc;
- kolor znaczek;
- };
- using namespace std;
- 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
- {
- for(int i = 0; i < n; ++i)
- if(tab[i] == wartosc)
- return true;
- return false;
- }
- void losuj_reke(int* tab) // losuje pięć kart "na rękę" - tak aby się nie powtarzały
- {
- srand(static_cast<unsigned>(time(nullptr)));
- int suspect;
- for(int i = 0; i < 5; ++i)
- {
- do
- {
- suspect = rand() % 52;
- } while(juz_jest(tab, i, suspect));
- tab[i] = suspect;
- }
- }
- void wypisz_karte(Karta karta)
- {
- 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)
- int kolor = static_cast<int>(karta.znaczek);
- switch(wartosc)
- {
- case 0:
- cout << "As ";
- break;
- case 1:
- cout << "2 ";
- break;
- case 2:
- cout << "3 ";
- break;
- case 3:
- cout << "4 ";
- break;
- case 4:
- cout << "5 ";
- break;
- case 5:
- cout << "6 ";
- break;
- case 6:
- cout << "7 ";
- break;
- case 7:
- cout << "8 ";
- break;
- case 8:
- cout << "9 ";
- break;
- case 9:
- cout << "10 ";
- break;
- case 10:
- cout << "Walet ";
- break;
- case 11:
- cout << "Dama ";
- break;
- case 12:
- cout << "Krol ";
- break;
- }
- switch(kolor)
- {
- case 0:
- cout << "karo\n";
- break;
- case 1:
- cout << "kier\n";
- break;
- case 2:
- cout << "pik\n";
- break;
- case 3:
- cout << "trefl\n";
- break;
- }
- }
- bool jest_kareta(int* reka) //co oznacza "reka" ?? - są to karty "na ręce" czyli trzymane przez gracza
- {
- int licznik = 1;
- 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.
- for(int i = 1; i < 5; ++i)
- if(reka[i] / 4 == szukana)
- ++licznik;
- if(licznik == 4)
- return true;
- 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])
- for(int i = 2; i < 5; ++i)
- if(reka[i] / 4 != szukana)
- return false;
- return true;
- }
- int main()
- {
- Karta talia[52];
- for(int i = 0; i < 13; ++i)
- for(int j = 0; j < 4; ++j)
- {
- talia[i*4 + j].wartosc = static_cast<figura>(i); //co oznacza ten zapis <figura>(i) - to jest rzutowanie statyczne, tak jak w 54. wierszu
- //po co dodajemy j ?? - żeby każda karta miała inny numer (od 0 do 51)
- talia[i*4 + j].znaczek = static_cast<kolor>(j);
- }
- int reka[5];
- losuj_reke(reka);
- for(int i = 0; i < 5; ++i)
- wypisz_karte(talia[reka[i]]);
- if(jest_kareta(reka))
- cout << "\nJest kareta\n";
- else
- cout << "\nNie ma karety\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment