Black Jack je karetní hra, ve které hrají hráči proti krupiérovi.
My si uděláme zjednodušenou verzi, ve které bude hrát pouze jeden hráč proti krupiérovi (počítač).
Cílem je, aby součet karet byl co nejblíže 21, přičemž nesmí tuto hodnotu překročit.
Jak bude program fungovat:
Na začátku obdrží krupiér jednu kartu, hráč obdrží dvě.
Karty jsou rozdávány tak, aby všichni viděli jejich hodnoty → tzn. v našem programu bude hráč vidět, jaké karty obdržel počítač.
Následně dostává hráč další karty tak dlouho, dokud neřekne dost → náš program se jej bude opakovaně ptát, zda chce další kartu.
Krupiér nemá svobodnou volbu: pokud je součet jeho karet menší než 17, pak si musí vzít další kartu; pokud je součet jeho karet větší nebo roven 17, pak si nesmí vzít další kartu.
Na konci hry se porovnají součty hodnot karet hráče a krupiéra:
Přesáhl-li hráč 21, pak prohrál.
Přesáhl-li krupiér 21 (a hráč ne), pak hráč vyhrál.
Pokud ani hráč, ani krupiér 21 nepřesáhli, pak vyhrává ten, kdo má vyšší součet.
Pokud jsou součty stejné, pak je to remíza.
Hodnoty karet:
2–10 mají hodnotu podle svého čísla.
Janek, Dáma, Král mají hodnotu 10.
Nebudeme brát v úvahu Eso (u toho si totiž můžeme vybrat jeho hodnotu – buď 1, nebo 11).
Technické provedení:
Výběr karty provede funkce, která vrací číslo (které se přičte k součtu karet).
Výběr je náhodný (zatím neřešíme, že v balíčku je pouze omezený počet karet).
Výpis vítěze provede funkce.
Vzorový výstup:
Balíček karet:
Balíček karet bude představovat celočíselné pole:
Velikost pole bude 12 (karty 2–10, Janek, Dáma, Král).
Každý prvek pole bude značit, kolik karet dané hodnoty v balíčku ještě zbývá.
Na začátku má každá hodnota 4 karty (celkem 48 karet, eso ignorujeme).
Manipulace s balíčkem karet:
Po každém tažení karty je nutné balíček aktualizovat – počet karet dané hodnoty se musí snížit o jedna.
Když se tedy táhne karta, tak je nutné aktualizovat pole (snížit počet karet dané hodnoty o 1).
Stav balíčku po vybrání karty hodnoty Janek:
Může se stát, že karta najednou dojde.
Tato karta už tedy nesmí být tažena → vygenerování karty musí proběhnout znovu.
4x byla vybrána karta Janek, stav balíčku:
Rozdíl mezi výrazy „tažená karta“ a „vygenerovaná karta“ – vygenerování karty znamená vygenerování náhodného čísla, zatímco tažení karty znamená, že ji ukážeme hráči (hraje se s ní). Vygenerovanou kartu nejdříve musíme podrobit zkoumání, zda se vůbec ještě v balíčku nachází. U tažené karty už toto zkoumání proběhlo – je v balíčku a následně tedy musíme snížit její počet v balíčku karet.
Je tedy vhodné vytvořit si funkci, která kontroluje, zda karta dané hodnoty je ještě v balíčku.
Pokud je, tak je tato karta tažena.
Pokud není, tak se vygeneruje nová karta a opět se zkontroluje, zda je ještě v balíčku.
Je tedy možné, že se karta bude generovat vícekrát.
A taky je možné, že nám karty dojdou (všechny prvky v poli budou nulové) → to ale zatím nebudeme řešit.
Doporučení (ale není nutné se jím řídit):
Vytvoř si funkci pro náplň balíčku (každý prvek bude na začátku mít hodnotu 4).
Vytvoř si funkci pro aktualizaci balíčku – má dva parametry: balíček (pole) a hodnotu karty (celé číslo od 2 do 13, 11 = Janek, 12 = Dáma, 13 = Král).
Např. funkce void aktualizuj_balicek(int balicek[], int karta) sníží hodnotu prvku balicek[karta-2] o jedna.
Konkrétně aktualizuj_balicek(balicek, 11) sníží hodnotu prvku balicek[9] o jedna (tzn. sníží se počet karet hodnoty Janek).
Vytvoř si funkci pro kontrolu, zda je karta v balíčku.
Může vracet booleovskou hodnotu (true pokud karta je v balíčku, false pokud v balíčku není).
Např. funkce bool je_uvnitr(int balicek[], int karta) zkontroluje, zda prvek balicek[karta-2] je větší než nula.
Konkrétně je_uvnitr(balicek, 11) zkontroluje, zda prvek balicek[9] je větší než nula (tj. v balíčku je ještě nějaký Janek, kterého můžeme táhnout).
Vzorový výstup:
Program by měl počítat počet odehraných karet, aby se nestalo, že během hry karty dojdou.
Co má program dělat, když karty začnou docházet, je na vás.
Program lze například nastavit tak, že uživatel se může chovat hloupě a může táhnout karty tak dlouho, než v balíčku zůstane pouze jedna karta (aby si mohl nějakou kartu táhnout i počítač).
Nebo se může v momentě, kdy karty dojdou, použít nový balíček
Vzorový výstup:
Doplňte do programu i eso, u kterého si uživatel i počítač volí jeho hodnotu (buď 1, nebo 11).