Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013
Dokumentáció 1. Követelmény feltárás 1.1 Célkitűzés, projekindító dokumentum A projekt célja egy póker program készítése. A játék egyjátékos módban, gépi ellenfelek ellen működne, ahol a feladat, hogy a Texas Holdem szabályai szerint legyőzzük ellenfeleinket, azaz elnyerjük a zsetonjaikat. A cél egy minél könnyebben kezelhető felület kialakítása a Drag&Drop rendszer alkalmazásával grafikus felületen. Emellett folyamatosan nyomon követhető az aktuális állás és az előzőleg történtek a játszmában. Kiemelt szerepet kap a gépi ellenfél intelligenciája is. Az addig lefutott játszmákról statisztika íródik. 1.2 Szakterületi fogalomjegyzék Dealer Button: Az osztót jelölő kis korong. Flop: Az asztalra képpel felfelé kiosztott három lap. Turn : A negyedik felfordított lap az asztalon. River : Az ötödik felfordított lap az asztalon. Community cards (Közös lapok) : A középre kiosztott 5 lap, amit mindenki sajátjaként használhat. Blind (Vaklicit) : Az osztótól balra ülő két embernek mindenképpen licitálnia kell. Ezt hívják vak licitnek. Az osztótól balra ülő ember adja a kis vak licitet (Small Blind - SB), míg a következő a nagy vak licitet (Big Blind - BB). Bet (Nyitás) : Az első berakott tét a licit során. Call (Tartás) : Egy másik játékos által berakott tét tartása. Raise (Emelés) : Egy másik játékos által berakott tét emelése. Fold (dobás) : Ha előtted nyitottak, vagy emeltek és nem akarod tartani a tétet, akkor dobnod kell. Check (passz) : Ha még senki nem nyitott előtted, akkor lehetőséged van passzolni. (Azaz nem kell pénzt beraknod.) Persze ha utánad valaki nyit, akkor döntened kell, hogy tartod vagy dobsz. Pot : A játék során berakott pénz összessége. No limit : No limit játéknál az emelés felső határa a nálad lévő pénz mennyisége. A minimális emelés nem lehet kisebb mint a nagy vak licit, illetve mint az előző emelés a licitkörben. Pl. $1/$2-es NL asztalnál a nagy vak $2. Ekkor a minimális nyitás, emelés $2. De ha előttünk valaki 10 dollárt emelt, akkor abban a körben már minimum 10 dollárral kell nekünk is
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 emelni, ha emelni szeretnénk. A következő licitkörben megint $2-ről indul a minimális emelés. Pre-flop : Az osztás és a flop kirakása közti időszak. Showdown : A játék végén a lapok megmutatása.
1.3 Használatieset-modell, funkcionális követelmények
1.4 Szakterületi követelmények A fejlesztéshez szükséges a JAVA nyelv ismerete. A szoftver használatához szükséges a Texas Holdem No Limit játékszabályainak ismerete. 1.5 Nem funkcionális követelmények A fejlesztéshez szükséges hardver: A fejlesztéshez használtszoftverek: Operációs rendszer: Windows 7 Követelmény elemzés: Word szövegszerkesztő NetBeans IDE 7.3 A futtatáshoz szükséges operációs rendszer: Windows XP, Vista, 7, 8 A futtatáshoz szükséges hardver: A legtöbb ma használt PC elegendő.
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 2. Tervezés 2.1. A program architektúrája A program legfontosabb elemei: a grafikus megjelenítő rétegen át a logikai rész, mely több fő egységből épül fel. Ezek közé tartozik a mesterséges intelligencia, a laperősségek, a historyrendszer, illetve maga a játék szimulációja. Ezek szorosan összekapcsolódnak, így megalkotva egy egységet. 2.2. Osztálymodell 1. Card osztály Feladat: Az egyes kártyalapok megadására szolgál. Két paramétert vár létrehozásakor: a számát és a típusát.
új kártya
2. Player osztály Feladat: A pókerprogram játékosainak megadására szolgál. Egy játékos lehet MI által, illetve ember által vezérelt. Tartalmazza a játékos zsetonjainak számát, a kezében lévő 2 lapot, az ülőhelyének sorszámát, az adott státuszát, hogy benn van-e a játékban, megadta-e vagy sem, emelt-e vagy sem, illetve a laperősségét. Játékosokból maximum 6 lehet egy asztalnál. 3. PUser osztály Őse: Player osztály Feladat: Ez egy alosztály, az ember által vezérelt játékos kezelése, melyből összesen csak egy darab lehet az asztalnál. Egyedisége, hogy meg kell adni a nevet. 4. PComputer osztály Őse: Player osztály Feladat: Ez egy alosztály, az MI által vezérelt játékos kezelése. Egyedisége, hogy programozható mesterséges intelligenciát használ, melynek lényege, hogy a historyrendszert kihasználva, nézi az előző körben történt eseményeket és az hat a játékos tulajdonságaira, melyek alapján a program kiszámolja, hogy mennyire legyen az MI agresszív, blöffölös, emelős vagy éppen csendesebb, óvatosabb. 5. Hands osztály Absztrakt osztály Feladat: A laperősségek megadására szolgál. A lényege, hogy a bejövő listából kiválasztja, hogy az adott pókerkéznek megfelelnek-e a listában levő lapok. Ha igen, akkor megadja annak értékét is, melyre egy külön pontozórendszer szolgál, mivel fontos az is, hogy ha két ugyanolyan pókerkeze van egy-egy játékosnak, akkor a nagyobbik lapokkal rendelkező nyerje a kört. 6. TimeCounter osztály Feladat: Visszaszámláló, mely a vaklimitek kezelését és a játékos válaszolásának idejét végzi. 7. Round osztály Feladat: Egy adott kör feladatait végzi. Itt tároljuk a potot/sidepotot, a játékosok által megadott zsetonokat, az asztalon lévő 3/4/5 kártyalapot (flop, river, turn), illetve a legnagyobb hívást az adott körre vonatkozóan. 8. Status osztály Feladat: Ennek az osztálynak a feladata lényegében a pókerasztal háttérben történő feladatainak elvégzése, így a history-rendszerhez szükségesen a körök tárolása, a kisvak-
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 nagyvak limitjeinek, a vakemeléshez tartozó periodikus idő, illetve az osztójátékos ülésszámának tárolása. 9. TexasHoldem osztály Főosztály Feladat: Itt mennek végbe a legfontosabb feladatok a programhoz kapcsolódóan, illetve a logikai réteg szíve ez az osztály. Itt szimulálódik az egész játék. Metódusai minden egyes körben lefuttatnak, pl.: egy lista feltöltése kártyákkal, keverés, osztóválasztás, potbeszedés, pókerkezek kiosztása játékosonként, nyertes kiértékelése, osztások. 10. Grafikai osztály Feladat: A logikai részt belekapcsolja a saját megjelenítő rétegébe, ezáltal grafikus felületet teremtve a programnak.
2.3. Osztálydiagram
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 2.4. Dinamikus működés Felhasználó interakcióit mutatja szekvencia digram által.
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 2.5. Felhasználói-felület modell
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 2.6. Részletes programterv 1. Card osztály Adattagok: - type: String típus, egy kártya objektum formáját határozza meg, amely 4 fajta lehet: pikk, treff, káró, kőr. - number: int típus, egy kártya objektum számát határozza meg, amely 2-től 14-ig számokat tartalmaz. 11-es szám a bubi, 12-es szám a dáma, 13-as szám a király, 14-es szám az ászt határozza meg. 2. Player osztály Szülőosztály. Konstruktorába meg kell adni a játékos zsetonjainak számát (chips), illetve az ülőhelyének sorszámát. Adattagok: - chips: int típus, a játékosnál lévő zsetonok száma. - card1, card2: Card osztálybeli objektumok, a játékosnál lévő két lap. - place: int típus, a játékos ülőhelyének a sorszáma. - status: String típus, a játékos állapotát határozza meg, amely lehet: call (megadta a hívást), check (továbbot mondott), fold (bedobta a lapjait), raise (emelt), out (kiesett a játékból), none (még nem nyilatkozott, általában kör elején). - handname: String típus, a játékosnál lévő legmagasabb pókerkéz neve. - highesthand: int típus, a játékosnál lévő legmagasabb pókerkéz értéke. 3. PUser osztály Őse: Player osztály Konstruktorába meg kell adni a játékos nevét (name). Adattagok: - name: String típus, a játékos neve. 4. PComputer osztály Őse: Player osztály Konstruktorába meg kell adni a játékos stílusát (style). Adattagok: - style: String típus, az MI játékos stílusát határozza meg, amely lehet: agresszív (agressive), biztonságos (safety), átlagos (average), vegyes (custom). - agressive, bluff, modesty, talent: int típusúak, az MI játékos stílusához tartozó változók, amelyek megadják, hogy a különböző helyzetekben miként reagáljon. - morale: int típus, az előző körben történteket figyelembe véve alakít ki egy 0-10 közötti számot, amely hatással van az MI játékos stílusára. Programozható mesterséges intelligencia: Lehetőség van a mesterséges intelligencia beállítására különböző statisztikai értékek alapján. A style változóban megadott stílus ilyen mintákat tartalmaz, amelyet az adott MI túlnyomó többségben alkalmazni fog egy játék során. Lényegi adattag még a morale változó, amely figyeli az előző kör történéseit a statisztika alapján, és ha pl. egy játékos az előző 5 kört elveszítette és kevés zsetonja van, akkor ez a változó alacsony lesz és kevésbé fog rámenős lenni még egy agresszív stílusú játékos is. A programozhatósághoz több változó értékét kell megadnunk, amelyek által a program kiszámolja a játékos stílusát.
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 5. Hands osztály Absztrakt osztály Adattagok: - 9 darab egész konstans szám, amelyek a különböző pókerkezek bemondásának nagyságát határozzák meg. - list: Card típusból álló lista, az 5 legerősebb/pókerkézhez szükséges lapokból egy adott játékoshoz rendelve. Metódusok: - getTypeSortedCards: egy beérkező Card típusból álló listát rendez Card típusa szerint. - value{PÓKERKÉZ}: az adott pókerkéz értékét adja vissza egy egész számként. 6. TimeCounter osztály Adattagok: - timer: Timer típus, az időzítőhöz szükséges változó. A játékosnak 30 másodperce van reagálni (megadni, passzolni, hívni, emelni, bedobni). A játékban 5 percenként van vakemelés. 7. Round osztály Egy adott kör négy részre van osztva: flop előtt, flop után, river után, turn után. Ezt több adattag is felhasználja (négyelemű lista). Adattagok: - cards: Card típusból álló lista, az asztalon lévő közös kártyákat tartalmazza, 0, 3, 4 vagy 5 elemű lehet. - playerschip: Player - Integer párokból álló négyelemű lista, a lista az adott játékosokhoz tartozó, a kör több fázisában megadott zsetonok számát tartalmazza kulcs-érték párokként. Pl.: a lista első eleme olyan kulcs-érték párokat tartalmaz, ahol lekérdezhetők, hogy a flop előtt, mely játékosok mennyit adtak a flopba, amíg tovább nem lépett a program (vagy megadták vagy bedobták). - limitchip: egész típusokat tartalmazó négyelemű lista, az adott fázisokban a legnagyobb hívásokat tartalmazza. - pot: egész típus, a körben megadott zsetonok összesége. - sidepots: egész típusokat tartalmazó lista, az ún. sidepot(-ok )hoz tartozó zsetonok összesége. - partOfTheRound: egész típus, a kör négy fázisa: 0: flop előtt, 1: flop után, 2: river után, 3: turn után. Metódusok: - setupRound: void típus, feltölti a két darab négyelemű listát kezdeti értékekkel. 8. Status osztály Konstruktorába meg kell adni a kisvak kezdőértékét (smallblind), illetve a vakemelések közti időt (time). Adattagok: - rounds: Round típusból álló lista, a lezajlott körök tárolására szolgál. Fontos szerepe van a history-rendszerben. - smallblind, bigblind: egész típusok, az asztalnál lévő kisvak, nagyvak értéke. - time: egész típus, meghatározza, hogy hány percenként van vakemelés. - dealer: egész típus, meghatározza, hogy hányas helyen ül az osztó (dealer). Metódusok: - addRound: void típus, hozzáad egy Round típust a rounds listához.
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 9. TexasHoldem osztály Főosztály Adattagok: - players: Player típusból álló lista, a játékban résztvevő játékosokat tartalmazza. - deck: Card típusból álló lista, a játékban résztvevő pókerpakli (francia kártyapakli jokerek kivételével). - actRound: Round típus, az aktuális kör megadására szolgál. - username: String típus, a felhasználó nevét adja meg. - status: Status típus, az asztalnál zajló információk rögzítésére szolgál. - gameover: logikai típus, a játék végét figyelő adattag. Metódusok: - setupThePlayers: void típus, hozzáad egy Round típust a rounds listához. - shuffleTheDeck: void típus, a deck listát feltölti Card típusokkal, azaz elkészíti a pókerpaklit, majd véletlenszerűen megkeveri a lista elemeit, ezzel egy rendezetlen listát alkotva, amely úgy hat, mint egy megkevert pakli. - deal: void típus, beállítja az összes játékosnak a card1, majd a card2 értékét a pakliból húzva a lapokat. - foldAllCards: void típus, minden játékos lapjait null értékre állítja. Ennek célja, hogy a körök végén mindenkitől "összegyűjti" a program a lapokat. - dealerChoose: void típus, kioszt minden játékosnak egy lapot, és azalapján megállapítja, hogy akié a legerősebb lap, az lesz az osztó. - betBlinds: void típus, az osztó utáni játékos zsetonjaiból levonja a kisvak értékét, majd az utána lévő játékos zsetonjaiból a nagyvak értékét, és berakja ezeket a potba. - dealTableCards: void típus, a paraméter alapján eldönti, hogy a kör melyik fázisában jár a program, és aszerint kirakja a lapokat az asztalra. Ha flop jön, akkor 3-at, ha turn vagy river, akkor 1 lapot rak ki. - burnCard: void típus, a deck utolsó elemét kiveszi, azaz kiveszi a pakliból a legfelső lapot. - addRound: void típus, új kört indít. - callBid: void típus, beállítja az adott játékos státuszát "call"-ra, levonja tőle a megfelelő mennyiségű zsetont és hozzáadja a pothoz. - foldBid: void típus, beállítja az adott játékos státuszát "fold"-ra. - checkBid: void típus, beállítja az adott játékos státuszát "check"-re. - raiseBid: void típus, beállítja az adott játékos státuszát "raise"-re, levonja tőle a megfelelő mennyiségű zsetont és hozzáadja a pothoz. - checkEndPartOfTheRound: logikai típus, visszatér azzal, hogy vége van-e az adott kör jelenlegi fázisának. - checkOutPlayers: void típus, megnézi, hogy akinek a zsetonjainak a száma megegyezik 0-val az kiesett, ha a felhasználó az, akkor vége a játéknak és szimulációval fejeződik be a játék (ha szükség van rá). - getTypeSortedCards: Card típusból álló lista, egy comparator által típus szerint rendezi a listát, majd visszatér vele. - getSortedCards: Card típusból álló lista, egy comparator által érték szerint rendezi a listát, majd visszatér vele. - hands: void típus, megnézi, hogy az adott játékosnak mi a legmagasabb kombináció a kezében, majd azt beállítja a játékoshoz. - endRound: void típus, a kör befejezése tartozik ide. Lépteti a dealert, kiosztja a potot, megnézi, hogy kell vakemelés, ha igen, akkor emeli, ha valaki veszített, akkor kiírja a helyezését. - isEndGame: logikai típus, megnézi, hogy véget ért-e a játék, ha igen, akkor ha szükség van a játszma hátralevő részét leszimulálja.
Alkalmazások fejlesztése - Texas Holdem - Somogyi Gergő - 2013 3. Implementáció 3.1. Fejlesztőeszközök NetBeans IDE 7.3 (kódolás) Microsoft Word 2007 (dokumentáció) NotePad++ (tesztelés) 3.2. Forráskód, futtatható kód Grafika: ../graphics/cards/ - kártyafelületeket tartalmazó PNG fájlok ../graphics/table.jpg - pókerasztalt tartalmazó JPEG fájl Forráskód: ../TexasHoldem/src/gui/TexasHoldemGraphic.java - grafikai réteget tartalmazó forráskódfájl ../TexasHoldem/src/texasholdem/Card.java Hands.java Player.java PComputer.java PUser.java Round.java Status.java TexasHoldem.java TimeCounter.java - logikai réteget tartalmazó forráskódfájlok 3.3. Alkalmazott kódolási szabványok JAVA-ra vonatkozó kódolási konvenciók, CamelCase, get/set/is előtagok használata. Változók és metódusok nevei megfelelnek a programban betöltött szerepüknek.
4. Tesztelés
5. Felhasználói dokumentáció 5.1. A futtatáshoz ajánlott hardver-, szoftverkonfiguráció A legtöbb ma használt PC elegendő. Operációs rendszer: Windows XP, Vista, 7, 8. 32/64 bit. JAVA SE szoftver szükséges a futtatáshoz. 5.2. Futtatás Telepítésre nincs szükség, csupán elegendő elindítani a mellékelt texasholdem.jar nevű fájlt. 5.3. A program használata Elindításkor meg kell adnunk a felhasználónevünket, ezután már indul is a játék. Új játék létrehozására bármikor lehetőségünk van. Szükséges ismernünk a Texas Holdem nevű kártyajáték szabályait.