Építsünk meg egy póker játék alapjait!
A feladat célja kifejezetten az, hogy most ne foglalkozzunk a Unity-vel kapcsolatos játékfejlesztői részletekkel. Csak a szükséges típusokat és algoritmusokat definiáljuk. Ez sem lesz feltétlenül egyszerű, de jó gyakorlat a C# ismereteik berögzítésére.
Haladjunk lépésenként, és javaslom, az én megoldásom megnézése előtt próbáld implementálni saját megoldásodat vagy legalább gondold át, hogyan állnál neki!
Lássunk hozzá!
Francia kártya
Először is definiáljunk egy típust, ami egy francia kártya lapot reprezentál! Erre mindenképp szükségünk lesz.
Hogy mi a lap értéke és színe, azt egy-egy enum változó tartalmazza. Az ehhez szükséges felsorolt típusokat is definiáljuk!
52 lapos pakli
Írjunk most egy metódust, ami egy paraméterben kapott listát feltölt az franciakártya 52 lapjával!
Keverés
Írjuk meg a metódust, ami megkever egy tetszőleges hosszú kártyapaklit!
Lapok rendezése
Írjuk meg a metódust, ami sorba rendez egy tetszőleges hosszú paklit
Lapok kiíratása
Most írjunk metódust, ami egyszerű és jól olvasható formában kiír egy tetszőleges kártya listát!
Póker kombinációk
A pókerben 5 lap egy “kéz”. Ezen kéznek van egy értéke, ami az alapján számolható ki, hogy milyen lapkombinációk rakhatók ki az öt lapból. Tekintsük át ezeket a póker kombinációkat és hozzunk létre egy enum típust belőlük
Póker kombináció tesztfüggvények
Írjunk függvényt a fenti összes lapkombinációóhoz, kivéve a magas lap! Minden esetben az adott függvény öt lapról, hogy a megfelelő lapkombinációhoz tartozik-e.
Pl.: bool IsRoyalFush(List<Card> hand) { … }
Mivel egy lapot több kombináció-ra is tesztelni fogunk ezért érdemes lesz majd ezen tesztelési ciklus előtt csak egyszer rendezni, ezért:
- A megvalósított függvények mindegyike feltételezi, hogy a bemeneti lista 5 elemű és rendezett!
Mivel ha találtunk egy magas értékű kombinációt, már nem érdekel minket az alacsonyabb, ezért:
- A függvények mindegyike csak akkor kell, hogy helyes eredményt adjon, ha a magasabb értékű kombinációk már ki lettek zárva.
Pl.: Nem baj ha egy Full House-re a Drill lekérdező függvény is true
-t ad vissza.
Póker kezek értékei
A pókerben nem csak az számít, milyen típusú kombináció van a kézben.
Azonos típusú kombinációk esetén a kéz bizonyos értékei döntenek. Ennek részletes szabályait a legördülő menü alatt olvashatod minden egyes kombinációra külön-külön. Mindazonáltal erre most nincs szükség, mivel egyetlen összevont szabállyal is megfogalmazható, két megegyező típusú kézről, hogy melyik az erősebb. Mivel ezen univerzális szabályt rövidebben lehet szóban megfogalmazni, ezért lekódolni is ezt rövidebb, egyszerűbb.
Most írjuk meg a függvényt, ami az “univerzális” szerint sorba rakja a kártyákat!
A PokerHand
típus
Most definiáljuk a póker kéz típust.
A PokerHand típus konstruktora egy 5 elemű listáját kapja meg lapoknak. Ebből kiszámolja a konstruktor a kézben lévő póker kombinációt és az előző feladatban megírt függvénnyel sorba állított listát a lapokból.
A konstruktor kapja meg a játékos nevét is.
Póker kezek összehasonlítása
Definiáljunk egy összehasonlító függvényt, amivel majd sorba tudunk tenni kezeket érték szerint!
Kéz kiíratása
Definiáljuk felül a Hand típus ToString()
metódusát is!
Póker játszma
Most végre játsszuk le a játszmát!
Ehhez írjunk függvényt, ami tetszőleges számú játékosra kioszt lapokat (ötöt fejenként) és sorba teszi a játékosokat a kezük erőssége szempontjából, majd kiírja a kezeket és a játékosok sorrendjét!
És most teszteljük le!
PlayPokerMatch("Homer", "Moe", "Barney", "Carl", "Lenny");