Entwicklung und Implementierung eines Pokerclients mit Pokerbots Tim Suchner Betreuerin: PD Dr. rer. nat. Elke Wilkeit Zweitgutachter: Dr. Hans Fleischhack Oldenburg, 11. Juli 2007 Inhaltsverzeichnis Inhaltsverzeichnis 1. Einleitung 1.1. Geschichte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Ziel des Projekts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Begrifflichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 6 2. Pokertheorie 2.1. Regeln . . . . . . . . . . . . . . . . . 2.1.1. Rangordnung der Pokerhände 2.1.2. Dealer . . . . . . . . . . . . . 2.1.3. Blinds . . . . . . . . . . . . . 2.1.4. Limits . . . . . . . . . . . . . 2.1.5. Spielverlauf . . . . . . . . . . 2.2. Wahrscheinlichkeiten . . . . . . . . . 2.2.1. Starthände . . . . . . . . . . 2.2.2. Flop . . . . . . . . . . . . . . 2.2.3. Nach dem Flop . . . . . . . . 2.3. Taktik . . . . . . . . . . . . . . . . . 2.3.1. Grundlagen . . . . . . . . . . 2.3.2. Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 8 9 9 10 11 11 15 18 19 19 25 3. Umsetzung 3.1. Server . . . . . . . . . . . . . . . . 3.1.1. Anforderungen . . . . . . . 3.1.2. Entwurf . . . . . . . . . . . 3.2. Client . . . . . . . . . . . . . . . . 3.2.1. Anforderungen . . . . . . . 3.2.2. Entwurf . . . . . . . . . . . 3.3. Bots . . . . . . . . . . . . . . . . . 3.3.1. Anforderungen . . . . . . . 3.3.2. Entwurf . . . . . . . . . . . 3.3.3. Kartenbewertung . . . . . . 3.3.4. Implementierung eines Bots 3.4. Kommunikation . . . . . . . . . . . 3.4.1. Anforderungen . . . . . . . 3.4.2. Entwurf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 33 33 33 39 39 39 39 39 40 42 44 47 47 47 . . . . . . . . . . . . . . 3 Inhaltsverzeichnis 4. Bot Statistik 4.1. Kurzer Spielzeitraum . . . 4.1.1. Beschreibung . . . 4.1.2. Interpretation . . . 4.2. Langer Spielzeitraum . . . 4.2.1. Beschreibung . . . 4.2.2. Interpretation . . . 4.3. Turnier . . . . . . . . . . . 4.3.1. Beschreibung . . . 4.3.2. Interpretation . . . 4.4. Abweichungen . . . . . . . 4.5. Fazit . . . . . . . . . . . . 4.5.1. Fixed Limit Poker 4.5.2. Poker Turnier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 50 50 52 53 53 55 56 56 58 59 60 60 60 5. Ausblick 5.1. Client/Server . . . . . . . . . . . 5.1.1. Nutzerkonto . . . . . . . . 5.1.2. Tischverwaltung . . . . . . 5.1.3. Lehrsystem . . . . . . . . 5.2. Bots . . . . . . . . . . . . . . . . 5.2.1. Punktesystem . . . . . . . 5.2.2. Anpassung an den Gegner 5.2.3. Bluffen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 61 61 61 62 62 62 63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A. Anhang 64 Abbildungsverzeichnis 69 Tabellenverzeichnis 69 Literaturverzeichnis 71 Glossar 72 4 1. Einleitung 1.1. Geschichte Ohne eine Gefühlsregung schaut der mexikanische Cowboy sein Gegenüber mit funkelnden Augen an. Ich setze alles.“, sagt er und schiebt einen Stapel Dollarscheine in die ” Mitte. Sein Gegenspieler lächelt und lässt seine gelben Zähne vorblitzen. Ich gehe mit.“, ” sagt er siegessicher, schiebt ebenfalls einen Stapel Scheine in die Mitte und deckt seine Karten auf. Er hat ein Full House, drei Vieren und zwei Könige. Gierig langt er nach den Banknoten, die sich in der Mitte angehäuft haben. Nicht so schnell!“, zischt der ” Mexikaner und deckt seinerseits die Karten auf. Er hat vier Asse. Der Mexikaner greift nach den Dollars und stopft sie in seine staubigen Taschen. Als er aufsteht zu gehen, zieht sein Gegenspieler seinen Colt und schreit: Betrüger! Gib mir mein Geld wieder.“. Der ” Mexikaner schaut ihn mit zuzammengekniffenen Augen an und seine Hand wandert in Richtung seines Pistolengürtels. . . Eine solche oder ähnliche Szene findet sich in fast jedem Western. Dadurch hat sich in den Köpfen vieler Menschen der Eindruck verfestigt, dass es sich bei Poker um ein uramerikanisches Spiel handelt. Doch auch wenn sich nicht mit Sicherheit sagen lässt, wo das Pokerspiel seinen Ursprung hat, gibt es Hinweise darauf, dass die Wurzeln des Pokers nicht in den USA liegen. So wird den Persern nachgesagt, dass sie bereits vor hunderten von Jahren ein pokeränliches Spiel gespielt haben. Zudem gab es im 16. Jahrhundert ein deutsches Kartenspiel namens Pochen“, bei dem geblufft werden musste. Daraus ” entwickelte sich die französische Version Poque“. Überlieferungen zufolge brachten die ” Franzosen dieses Spiel nach New Orleans, wo es sich mit Hilfe der Schaufelraddampfer entlang des Mississippi verbreitete. Ziemlich bald wurde Poque“ in Poker umbenannt ” und während des Amerikanischen Bürgerkriegs wurden die Regeln verändert, wodurch es nun erlaubt war, Karten zu tauschen, um die Hand zu verbessern [HK00]. Mit der Zeit entwickelten sich weitere Pokervarianten. Die gebräuchlichsten sind heute Draw Poker, Stud Poker und Community Card Poker, zu der auch die Variante Texas Hold’em gehört. 1.2. Ziel des Projekts Im Zuge dieses individuellen Projekts soll ein Pokerclient inklusive selbstständig spielender Pokerbots entwickelt werden. Dabei soll die Pokervariante Texas Hold’em umgesetzt werden, da sie häufig in Poker-Turnieren und auch bei der Poker-Weltmeisterschaft (World Series of Poker) gespielt wird und sich auch in Deutschland zunehmender Beliebtheit er- 5 KAPITEL 1. EINLEITUNG freut. Dadurch, dass es bei dieser Variante neben den zwei verdeckten Karten (Pocket Cards) auch bis zu fünf öffentliche Karten (Community Cards) gibt, ist diese Variante strategisch sehr interessant und anspruchsvoll. 1.3. Begrifflichkeiten Der Pokerwortschatz ist durchsetzt von Anglizismen, für die es oft keine zufriedenstellenden Übersetzungen gibt. In dieser Arbeit wird daher auf die gebräuchlichen englischen Begriffe zurückgegriffen, die innerhalb des Textes erklärt und auch im Glossar zusammengefasst werden. 6 2. Pokertheorie 2.1. Regeln Die Pokervariante Texas Hold’em wird mit einem französischen Kartenspiel gespielt, das aus 52 Karten besteht. Ziel des Spiels ist es, mit der besten Hand zu gewinnen, oder durch geschicktes Bieten die anderen Spieler aus dem Spiel zu vertreiben. Die Pokerhand des Spielers sind dabei die besten fünf Karten aus seinen zwei verdeckten Startkarten kombiniert mit den fünf öffentlichen Karten. 2.1.1. Rangordnung der Pokerhände Beim Texas Hold’em Poker hat das Ass die höchste Wertigkeit, gefolgt von König, Dame, Bube, Zehn, Neun, . . . ; die niedrigste Karte ist die Zwei. Beim Bilden einer Straße kann das Ass auch als Eins genommen werden. Die Spielfarbe der Karten hat keine Bedeutung für die Wertigkeit (Ausnahme: Bestimmung des Dealers siehe 2.1.2). Es gibt folgende Pokerhände beginnend mit der niedrigsten: (Eine Übersicht der Rangordnung der Pokerhände findet sich in Tabelle 2.1.) • Höchste Karte (high card): Hat ein Spieler keine der anderen Kombinationen, zählt die höchste seiner fünf Karten. • Ein Paar (one pair): Zwei gleichhohe Karten bilden ein Paar. • Zwei Paare (two pairs): Der Spieler hält zwei mal zwei gleichhohe Karten. Das bessere der beiden Paare bestimmt dabei die Wertigkeit der Hand. • Drilling (three of a kind, set): Ein Drilling setzt sich aus drei gleichhohen Karten zusammen. • Straße (straight): Fünf aufeinanderfolgende Karten bilden eine Straße. Die Wertigkeit der Straße wird durch die höchste Karte bestimmt. • Flush: Hat ein Spieler fünf Karten der selben Farbe, so hält er einen Flush. Die höchste Karte im Flush bestimmt die Wertigkeit. • Full House: Ein Drilling in Kombination mit einem Paar bildet das Full House. Die Höhe des Full House wird durch den Drilling bestimmt. 7 KAPITEL 2. POKERTHEORIE • Vierling (four of a kind): Ein Vierling setzt sich aus vier gleichhohen Karten zusammen. • Straight Flush: Wenn ein Spieler eine Straße mit Karten derselben Spielfarbe hält, hat er einen Straight Flush. • Royal Flush: Der höchste Straight Flush heißt Royal Flush. Bei gleichwertigen Pokerhänden, zählt die höhere Beikarte, der sogenannte Kicker. Sollten die Pokerhände inklusive Kicker gleichwertig sein, wird der Pot zwischen den Spielern geteilt. Hand Royal Flush Straight Flush Vierling / Poker Full House Flush Straße Drilling zwei Paare ein Paar höchste Karte Insgesamt Kombinationen Wahrscheinlichkeit 4324 37260 224848 3473184 4047644 6180020 6461620 31433400 58627800 23294460 0,00003232 0,00027851 0,00168067 0,02596102 0,03025494 0,04619382 0,04829870 0,23495536 0,43822546 0,17411920 133784560 1,00000000 Beispiel 10♥-J♥-Q♥-K♥-A♥ 4♣-5♣-6♣-7♣-8♣ 9♣-9♦-9♥-9♠ 7♣-7♦-7♥-K♥-K♠ 2♥-5♥-10♥-Q♥-K♥ 9♣-10♠-J♥-Q♠-K♦ 7♣-7♦-7♥ Q♣-Q♠-K♥-K♠ J♥-J♠ A♣ Tabelle 2.1.: Rangordnung der Pokerhände in absteigender Reihenfolge [PI06b] (inklusive der Kombinationsmöglichkeiten und Wahrscheinlichkeiten für die besten fünf von sieben Karten aus 52) 2.1.2. Dealer Zu Beginn des Spiels wird der Kartengeber (Dealer) bestimmt, indem jeder Spieler eine Karte zieht. Der Spieler mit der höchsten Karte wird Dealer, was durch den Dealer Button gekennzeichnet wird. Man sagt auch: Der Spieler befindet sich am Button“. Haben zwei ” oder mehr Spieler gleich hohe Karten, entscheidet die Farbe der Karte in der Reihenfolge ♣-♦-♥-♠ (mit Pik als höchster Farbe). Nach jeder Runde wechselt der Dealer im Uhrzeigersinn. In Spielkasinos übernimmt ein Croupier die Rolle des Dealers, so dass es sich beim Spieler mit dem Dealer Button nur um einen fiktiven Kartengeber handelt [Bra03]. 8 2.1. REGELN 2.1.3. Blinds Die Blinds sind Mindesteinsätze, die dazu dienen, das Spiel am Laufen zu halten. Es wird zwischen Small und Big Blind unterschieden; der Big Blind entspricht dem doppelten Small Blind. Der Spieler, der sich links neben dem Dealer befindet, zahlt den Small Blind, während sein linker Nachbar den Big Blind bezahlen muss. Es ist üblich die Spieler, die die Blinds geleistet haben, auch als Big Blind bzw. Small Blind zu bezeichnen. Alle Einsätze, also auch die Blinds, werden im Pot in der Tischmitte gesammelt [Bra03]. Abbildung 2.1.: Pokertisch [Bra03] 2.1.4. Limits Beim Texas Hold’em Poker werden drei Arten von Limits unterschieden: • No Limit: Es gibt keine Begrenzung der Einsatzhöhe, jeder Spieler kann, wenn er an der Reihe ist, seine gesammten Chips setzen und somit all in gehen. Allerdings gibt es einen Mindesteinsatz, der entweder dem Big Blind entspricht, oder der Höhe des letzten Einsatzes bzw. der letzten Erhöhung. • Pot Limit: Der Einsatz wird begrenzt durch die Menge der Chips, die sich im Moment im Pot befinden. 9 KAPITEL 2. POKERTHEORIE • Fixed Limit: Die Höhe der Einsätze wird durch das lower Limit, das dem Big Blind entspricht, und dem higher Limit, das dem doppelten Big Blind entspricht, begrenzt. In den ersten beiden Bietrunden zählt das lower und danach das higher Limit. In jeder Bietrunde darf ein Einsatz maximal drei mal erhöht werden. Da der Pokerclient vorrangig und die Bots auschließlich auf fixed Limit ausgelegt werden, wird im weiteren Verlauf der Ausarbeitung von einem fixed Limit ausgegangen, so dass im Folgenden zu beachten ist, dass der Spielverlauf und die angeführten Taktiken nur bedingt auf die anderen Limitarten übertragbar sind. 2.1.5. Spielverlauf Pocket Cards und erste Bietrunde Am Anfang jeder Runde erhält jeder Spieler zwei verdeckte Karten, die sogenannten Pocket (oder Hole) Cards. Nun folgt die erste Bietrunde, die durch den Spieler begonnen wird, der sich links neben dem Big Blind befindet. Dieser Spieler muss den Big Blind Einsatz zahlen, d. h. mitgehen, um im Spiel zu bleiben. Nach der Aktion des Spielers wird die Runde im Uhrzeigersinn fortgesetzt. Um im Spiel zu bleiben, muss jeder Spieler den aktuellen Einsatz zahlen. Alle Spieler, inklusive der Blinds, haben auch die Möglichkeit, den Einsatz zu erhöhen, wenn sie an der Reihe sind. Eine solche Erhöhung muss dem Betrag des Big Blinds entsprechen. Es kann maximal dreimal erhöht werden, so dass der Maximaleinsatz beim vierfachen Big Blind liegt. Wenn der Spieler, der sich im Small Blind befindet, an der Reihe ist, muss er die Differenz zwischen Small und Big Blind, sowie alle vorhergehenden Erhöhungen, zahlen um im Spiel zu bleiben. Der Spieler im Big Blind hat die Möglichkeit zu checken, falls bis zu diesem Zeitpunkt keine Erhöhung erfolgt ist und damit die erste Bietrunde zu beenden. Ansonsten wird die Runde durch den Spieler beendet, der rechts neben dem Spieler sitzt, der die letzte Erhöhen-Aktion durchgeführt hat [Bra03]. Flop und zweite Bietrunde Nachdem die erste Bietrunde beendet wurde, deckt der Kartengeber die ersten drei Community Cards auf, den sogenannten Flop. Das Bieten startet beim Small Blind, also dem Spieler links neben dem (fiktiven) Dealer. Dieser kann entweder einen Einsatz in Höhe des Big Blinds tätigen oder checken. Jeder Spieler hat die Möglichkeit zu checken, solange kein Einsatz getätigt wurde, so dass unter Umständen der Pot nicht weiter erhöht wird. Wenn ein Spieler checkt und ein Spieler in späterer Position erhöht, kommt der Spieler der gecheckt hat nocheinmal an die Reihe und kann mitgehen oder sogar noch erhöhen. Um im Spiel zu bleiben muss ein Spieler alle Einsätze und Erhöhungen mitgehen, so dass jeder Spieler mit dem gleichen Anteil am Pot beteiligt ist [Bra03]. 10 2.2. WAHRSCHEINLICHKEITEN Turn und dritte Bietrunde Zu Beginn der dritten Bietrunde deckt der Kartengeber eine vierte öffentliche Karte (den Turn) auf. Das Bieten startet wiederum beim Small Blind. Die Einsätze werden jetzt verdoppelt, so dass für jede Setzen- oder Erhöhen-Aktion nun der doppelte Big Blind zu zahlen ist [Bra03]. River und letzte Bietrunde Als letztes deckt der Dealer die fünfte öffentliche Karte, die sogenannte River Karte auf und es gibt eine abschließende Bietrunde, die beim Small Blind beginnt. Die Einsatzhöhe ist indentisch zur dritten Bietrunde [Bra03]. Showdown Ist nach der letzten Bietrunde noch mehr als ein Spieler im Spiel, werden die Karten aufgedeckt (Showdown) und der Spieler mit der stärksten Hand gewinnt den Pot [Bra03]. Aktion Beschreibung Checken (Check) Der Spieler tätigt keinen Einsatz und wartet ab; der nächste Spieler ist an der Reihe (nur möglich, wenn vorher kein Einsatz getätigt wurde). Mitgehen (Call) Der Spieler bringt den höchsten, vorher geleisteten Einsatz. Erhöhen (Raise) Der Spieler erhöht den Einsatz um die Höhe des Big Blinds (Nach dem Flop um die Höhe des zweifachen Big Blinds). Passen (Fold) Der Spieler passt und gibt seine Pocket Cards ab. Tabelle 2.2.: Mögliche Spieleraktionen 2.2. Wahrscheinlichkeiten 2.2.1. Starthände Zu Anfang des Spiels erhält jeder Spieler 2 Karten aus 52, daher gibt es 52 = 1326 2 11 KAPITEL 2. POKERTHEORIE Abbildung 2.2.: Bietstruktur 10-20 Texas Hold’em - Blinds [Bra03]: Small-5, Big-10 verschiedene Kombinationsmöglichkeiten. Da beim Poker die Farbe der Karten keine Rolle für die Wertigkeit der Hand spielt 12 2.2. WAHRSCHEINLICHKEITEN (abgesehen von gleichen Farben) befinden sich unter den 1326 Kombinationen viele gleichstarke Hände (z. B. 7♠-9♣ und 7♥-9♣). Deshalb lassen sich drei verschiedene Wertigkeiten unterscheiden [Als04]: Paare Da es 13 verschieden hohe Karten gibt, gibt es auch 13 verschieden starke Paare. Ein Paar setzt sich aus zwei gleichhohen Karten mit unterschiedlicher Farbe zusammen, also lässt sich ein Paar durch zwei aus den vier Farben kombinieren, deshalb gibt es 4 13 · = 13 · 6 = 78 2 mögliche Kombinationen [Als04]. Zwei Karten der gleichen Farbe Es gibt 13 verschieden hohe Karten der gleichen Farbe, daraus ergeben sich 13 = 78 2 unterschiedlich starke Hände. Für die Ermittlung der Kombinationsmöglichkeiten müssen die vier verschiedene Farben berücksichtigt werden, dadurch ergeben sich 78 · 4 = 312 Möglichkeiten für gleichfarbige Karten [Als04]. Zwei Karten ungleicher Farbe (ohne Paare) Aus den 13 verschieden hohen Karten lassen sich ebenfalls 13 = 78 2 unterschiedlich starke Hände ungleicher Farbe bilden. Um die Kombinationen zu bestimmen, werden erst die Möglichkeiten ermittelt, eine aus vier Farben und dann nochmals eine aus den verbleibenden drei Farben zu wählen. Daraus ergeben sich 4 3 78 · = 78 · 4 · 3 = 936 1 1 13 KAPITEL 2. POKERTHEORIE Kombinationsmöglichkeiten. Alles in allem gibt es daher unter den 1326 Kombinationsmöglichkeiten 13+78+78 = 169 Starthände verschiedener Wertigkeit, der Rest ist gleichwertig [Als04]. Aus den vorhergehenden Betrachtungen ergeben sich somit folgende Wahrscheinlichkeiten: • ein bestimmtes Paar: P = 0,453 %. • irgendein Paar: P = 78 1326 = 6 1326 1 , 17 = 1 , 221 also eine Wahrscheinlichkeit von etwa also eine Wahrscheinlichkeit von etwa 5,88 %. • Zwei bestimmte Karten der gleichen Farbe: P = scheinlichkeit von etwa 0,3 % • Zwei Karten der gleichen Farbe: P = von etwa 23,53 % 312 1326 = 4 , 17 • Zwei bestimmte Karten ungleicher Farbe: P = scheinlichkeit von etwa 0,9 % • Zwei Karten ungleicher Farbe: P = etwa 70,59 % 936 1326 = 12 , 17 4 1326 = 2 , 633 also eine Wahr- also eine Wahrscheinlichkeit 12 1326 = 2 , 221 also eine Wahr- also eine Wahrscheinlichkeit von Mehrere Pocket Paare In diesem Teil soll die Wahrscheinlichkeit untersucht werden, dass wenn ein Spieler ein Paar als Starthand hat, ein oder mehrere Gegenspieler ein besseres Paar haben. Ein Gegenspieler: Wenn ein Spieler ein Paar Könige als Starthand hat, verbleiben 50 Karten im Stapel, so dass es noch 50 = 1225 2 weitere Kombinationsmöglichkeiten für die Starthand des Gegenspielers gibt. Damit der Gegenspieler ein besseres Paar hat, benötigt er ein Paar Asse. Die Wahrscheinlichkeit ein bestimmtes Paar aus den verbleibenen 1225 Kombinationsmöglichkeiten zu bekommen, beträgt 6 P = ≈ 0, 0049 1225 D. h. mit einer Wahrscheinlichkeit von 0,49 % hat der Gegenspieler ein besseres Paar, wenn der erste Spieler ein Paar Könige hält. Zur Verallgemeinerung dieser Berechnung wird den möglichen Paaren ein Zahlenwert d zugeordnet, der anzeigt, wieviele höhere Kartenwert-Stufen es zu einer bestimmten Stufe gibt: d = 0 für A-A, d = 1 für K-K, . . ., d = 12 für 2-2. Dadurch ergibt sich folgende Formel: 6·d P = 1225 14 2.2. WAHRSCHEINLICHKEITEN Mehrere Gegenspieler: Für eine Anzahl von n Gegenspielern lautet eine Näherungsformel [Inf]: 6d 6d − 1 6d 6d − 1 6d − 2 6d n n n P = · − · · + · · · 2 3 1 50 50 48 50 48 46 2 2 2 2 2 2 In Tabelle 2.3 werden die Wahrscheinlichkeiten, mit denen ein Spieler der ein Paar als Starthand hält, auf ein höheres Paar trifft, abhängig von der Anzahl der Mitspieler zusammengefasst. K-K Q-Q J-J 10-10 9-9 8-8 7-7 6-6 5-5 4-4 3-3 2-2 n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 n=9 0,0049 0,0098 0,0147 0,0196 0,0245 0,0294 0,0343 0,0392 0,0441 0,0490 0,0539 0,0588 0,0098 0,0195 0,0292 0,0388 0,0483 0,0579 0,0673 0,0767 0,0861 0,0954 0,1047 0,1139 0,0146 0,0291 0,0434 0,0576 0,0716 0,0855 0,0992 0,1127 0,1261 0,1394 0,1525 0,1655 0,0195 0,0386 0,0575 0,0760 0,0942 0,1122 0,1299 0,1472 0,1643 0,1811 0,1977 0,2139 0,0243 0,0480 0,0713 0,0940 0,1163 0,1381 0,1594 0,1803 0,2007 0,2207 0,2403 0,2594 0,0291 0,0574 0,0849 0,1117 0,1378 0,1632 0,1880 0,2121 0,2355 0,2583 0,2805 0,3022 0,0338 0,0666 0,0983 0,1291 0,1588 0,1876 0,2155 0,2425 0,2687 0,2941 0,3187 0,3425 0,0386 0,0757 0,1115 0,1460 0,1792 0,2112 0,2421 0,2718 0,3005 0,3281 0,3548 0,3806 0,0433 0,0848 0,1246 0,1627 0,1992 0,2342 0,2678 0,3000 0,3309 0,3606 0,3893 0,4168 Tabelle 2.3.: Wahrscheinlichkeit mit einem Pocketpaar auf ein höheres Paar zu treffen für einen bis neun Gegner 2.2.2. Flop In diesem Abschnitt sollen Wahrscheinlichkeiten untersucht werden, mit der die Starthand im Flop verbessert wird. Da der Flop aus drei Karten (K1 , K2 , K3 ) besteht, ergeben sich die Einzelwahrscheinlichkeiten, dass aus einer Anzahl von n gewünschten Karten eine kommt, folgendermaßen: P (K1 ) = n ; 50 P (K2 ) = n ; 49 P (K3 ) = n 48 15 KAPITEL 2. POKERTHEORIE Allgemein Im ersten Fall soll die Wahrscheinlichkeit bestimmt werden, dass mindestens eine aus einer Anzahl von n gewünschten Karten auf dem Flop kommt. Dazu wird die Wahrscheinlichkeit bestimmt, mit der die gewünschte Karte nicht auf dem Flop kommt und davon die Komplementärwahrscheinlichkeit gebildet: P (F1 ) = P (K1 ∩ K2 ∩ K3 ) = 1−(1− n n n 50 − n 49 − n 48 − n )·(1− )·1−( ) = 1− · · 50 49 48 50 49 48 Als nächstes soll die Wahrscheinlichkeit bestimmt werden, mit der genau zwei bestimmte aus einer Anzahl von n gewünschten Karten auf dem Flop kommen. Die Gesamtwahrscheinlichkeit setzt sich aus denen dreier verschiedener Ereignisse zusammen: P (F2 ) = P (K1 ∩ K2 ∩ K3 ) + P (K1 ∩ K2 ∩ K3 ) + P (K1 ∩ K2 ∩ K3 ) n n n n · n−1 · (1 − n−2 ) + 50 · (1 − n−1 ) · n−1 + (1 − 50 ) · 49 · n−1 = 50 49 48 49 48 48 48−(n−2) 49−(n−1) n−1 n n 50−n n n−1 = 50 · n−1 · + · · + · · 49 48 50 49 48 50 49 48 50−n) n−1 n 50−n n 50−n n n−1 = 50 · n−1 · + · · + · · 49 48 50 49 48 50 49 48 = 3 · n·(n−1)·(50−n) 117600 = n·(n−1)·(50−n) 39200 Im dritten Fall soll die Wahrscheinlichkeit bestimmt werden, dass genau drei aus einer Anzahl von n gewünschten Karten auf dem Flop kommen: P (F3 ) = P (K1 ∩ K2 ∩ K3 ) = n n−1 n−2 · · 50 49 48 Speziell In diesem Teilabschnitt wird die Berechnung von speziellen Wahrscheinlichkeiten, die nicht anhand der vorherigen Formeln bestimmt werden können, anhand von Beispielen aufgezeigt. Paar zu Full House: Hält ein Spieler ein Pocket Paar, so ergibt sich die Wahrscheinlichkeit ein Full House zu floppen folgendermaßen: P = 2 48 3 48 2 3 48 3 2 · · + · · + · · = 0, 007347 50 49 48 50 49 48 50 49 48 Dabei werden die Einzelwahrscheinlichkeiten der folgenden Fälle addiert: 1. Die erste Karte des Flops bildet mit dem Pocketpaar einen Drilling (zwei Möglichkeiten), die zweite Karte ist irgendeine, außer eine weitere Karte passend zum Pocket Paar (49 verbleibene Karten minus eine, die zum Pocket Paar passt = 48 Möglichkeiten) und die dritte bildet ein Paar mit der zweiten (drei Möglichkeiten). 2. Die erste Karte trifft nicht das Pocket Paar, die zweite bildet einen Drilling mit dem Pocket Paar und die dritte Karte des Flops bildet ein Paar mit der ersten. 16 2.2. WAHRSCHEINLICHKEITEN 3. Die erste Karte passt nicht zum Pocket Paar, die zweite bildet ein Paar mit der ersten und die dritte Karte trifft das Pocket Paar. Unsuited zu Flush Draw: In diesem Beispiel besteht die Starthand aus zwei Karten unterschiedlicher Farbe. Es soll die Wahrscheinlichkeit bestimmt werden, mit der drei gleichfarbige Karten, die zu einer Karte der Starthand passen, auf dem Flop kommen. Der Begriff Draw bezeichnet eine verbesserungswürdige Pokerhand, der noch eine Karte fehlt. Im Fall eines Flush Draws bedeutet das, dass dem Spieler noch eine Karte einer bestimmten Farbe fehlt, um seinen Flush zu komplettieren. 24 11 10 P = · · = 0, 022449 50 49 48 Die Wahrscheinlichkeit, dass die Farbe der erste Karte des Flops zu einer der Pocket , da es jeweils 12 gleichfarbige Karten gibt. Zur BerechKarten passt, ergibt sich aus 24 50 nung der Wahrscheinlichkeiten der zweiten und dritten Karte des Flops verbleiben daher noch 11, bzw. 10 gleichfarbige Karten. Kein Paar zu Zwei Paare: Hält ein Spieler zwei Karten, die kein Paar bilden, kann die Wahrscheinlichkeit, dass er auf dem Flop Zwei Paare erhält folgerdermaßen bestimmt werden: 6 3 44 6 44 6 44 9 6 P = · · + · · + · · = 0, 040408 50 49 48 50 49 48 50 49 48 Die Gesamtwahrscheinlichkeit ergibt sich durch die Summe der Einzelwahrscheinlichkeiten folgender Fälle: 1. Die erste Karte des Fops trifft eine der beiden Pocket Karten (sechs Möglickeiten), die zweite Karte trifft die andere Karte der Starthand (drei Möglichkeiten) und die dritte Karte verpasst beide (48 verbleibene Karten minus zwei passend zur ersten Karte des Pocket Paars minus zwei passend zur zweiten Karte des Pocket Paars = 44 Möglichkeiten). 2. Die erste Karte bildet ein Paar mit einer der Pocket Karten, die zweite Karte verpasst die andere Pocket Karte und die dritte bildet entweder ein Paar mit der zweiten Karte des Flops oder mit der anderen, nicht gepaarten Karte der Starthand. 3. Die erste Karte verpasst die zwei Pocket Karten, die zweite bildet ein Paar mit einer der Pocket Karten oder der ersten Karte des Flops und die dritte bildet ein Paar mit einer der verbleibenden Karten. Kein Paar zu Drilling: 6 2 44 6 P = · · + 50 49 48 50 Kein Paar zu Vierling: 6 P = 50 · 44 2 44 6 2 · + · · = 0, 013469 49 48 50 49 48 · 2 1 · = 0, 000102 49 48 17 KAPITEL 2. POKERTHEORIE Beispiel Starthand Verbesserung Berechnung P Hand Flop Paar Drilling+ Full House Vierling P (F1 ), n = 2 0,117551 A♥-A♠ 2.2.2 (Speziell) 0,007347 A♥-A♠ P (F2 ), n = 2 0,002449 A♥-A♠ Suited Backdoor FD+ FD Flush P (F1 ), n = 11 P (F2 ), n = 11 P (F3 ), n = 11 Unsuited Backdoor FD FD P (F2 ), n = 12 0,127959 J♠-Q♦ 2.2.2 (Speziell) 0,022449 J♠-Q♦ Kein Paar Paar+ Zwei Paare Drilling Vierling P (F1 ), n = 6 0,324285 A♥-K♠ 9♠-K♦-4♣ 2.2.2 (Speziell) 0,040408 A♥-K♠ 7♥-K♦-A♣ 2.2.2 (Speziell) 0,013459 A♥-K♠ 3♣-K♦-K♣ 2.2.2 (Speziell) 0,000102 A♥-K♠ A♠-A♣-A♦ 7♠-A♣-J♦ 8♥-A♣-8♠ A♦-A♣-Q♣ 0,533724 A♦-K♦ 2♣-10♥-8♦ 0,109438 A♦-K♦ 7♥-5♦-8♦ 0,008418 A♦-K♦ 9♦-5♦-8♦ 2♦-10♥-6♦ 7♠-3♠-K♠ Tabelle 2.4.: Wahrscheinlichkeiten die Starthand auf dem Flop zu verbessern. (Mit FD = Flush Draw und X+ = X oder besser) 2.2.3. Nach dem Flop Hält ein Spieler nach dem Flop einen Open Ended Straight Draw, d. h. es fehlt eine Karte am Anfang oder am Ende, um die Straße zu komplettieren (z. B. 5-6-7), dann gibt es acht Karten, die die Straße komplett machen (vier mal 4 und vier mal 8). Die Anzahl der Karten, die verbleiben, um die Hand zu verbessern werden Outs genannt [Bra03]. Da es noch 47 unbekannte Karten gibt (52 minus zwei (Starthand) minus drei (Flop)), errechnet sich die Wahrscheinlichkeit, dass eine von den acht Karten als nächste kommt, durch: 8 = 0, 1702 P = 47 d. h. mit einer Wahrscheinlichkeit von 17,02 % wird die Straße komplettiert. Die Wahrscheinlichkeiten lassen sich verallgemeinern zu P (T ) = outs , mit T = ˆ benötigte Karte kommt auf Turn 47 P (R) = outs , mit R = ˆ benötigte Karte kommt auf River 46 bzw. 18 2.3. TAKTIK Die Wahrscheinlichkeit, dass entweder die Turn- oder Riverkarte die Pokerhand verbessert, ergibt sich aus dem Komplement der Vereinigung der Komplementärereignisse T und R: outs outs 47 − outs 46 − outs ) · (1 − )=1− · 47 46 47 46 Wenn man die acht möglichen Outs aus aus dem Anfangsbeispiel einsetzt ergibt sich daher eine Wahrscheinlichkeit von 31,45 %, dass die fehlende Karte auf dem Turn oder River kommt. In Tabelle 2.5 sind die Wahrscheinlichkeiten für verschiedene Outs zusammengefasst. P (T ∩ R) = 1 − P (T ) · P (R) = 1 − (1 − outs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Turn River T/R Beispiel Verbesserung 0,0213 0,0426 0,0638 0,0851 0,1064 0,1277 0,1489 0,1702 0,1915 0,2128 0,2340 0,2553 0,2766 0,2979 0,3191 0,3404 0,3617 0,3830 0,4043 0,4255 0,4468 0,0217 0,0435 0,0652 0,0870 0,1087 0,1304 0,1522 0,1739 0,1957 0,2174 0,2391 0,2609 0,2826 0,3043 0,3261 0,3478 0,3696 0,3913 0,4130 0,4348 0,4565 0,0426 0,0842 0,1249 0,1647 0,2035 0,2414 0,2784 0,3145 0,3497 0,3839 0,4172 0,4496 0,4810 0,5116 0,5412 0,5698 0,5976 0,6244 0,6503 0,6753 0,6994 Drilling Pocket Paar Ein Paar Zwei Paare Ein Paar Kein Paar Drilling Open Ended SD Flush Draw Inside SD Vierling Drilling Zwei Paare Full House Zwei Paare oder Drilling Ein Paar Full House Straight Flush Straight oder Paar Open Ended SD Straight oder Paar Tabelle 2.5.: Wahrscheinlichkeiten, die Hand nach dem Flop zu verbessern; Paare beziehen sich auf Paare mit den Pocket Cards; mit SD = Straight Draw 2.3. Taktik 2.3.1. Grundlagen Die wichtigsten Entscheidungsfaktoren sind [Bra03]: 19 KAPITEL 2. POKERTHEORIE • Starthand • Spielposition • Anzahl der Spieler • Pot Odds • Spielweise der anderen Spieler Nachfolgend werden diese Faktoren näher betrachtet. Starthand Das Potential der Starthand (Hole Cards) richtig einschätzen zu können, ist eine Grundvoraussetzung, um gutes Texas Hold’em zu spielen. Um einen Überblick der Qualität von Starthänden zu bekommen, werden diese in Tabelle 2.6 anhand ihrer Wahrscheinlichkeit (siehe Abschnitt 2.2.1) in Gruppen eingeteilt [Bra03]. Stärke Beschreibung Beispiel Premium Hände, die ohne Hilfe gewinnen Hohe Paare: A-A, K-K, Q-Q, Jkönnen J, 10-10; Straight Draws mit Assen wie z. B. A♣-K♣ oder A♠K♥ Stark Hände, die möglicherweise eine Mittlere Paare: 9-9, 8-8, 7-7; Verbesserung brauchen, um zu Karten, die hohe Straßen bis gewinnen zum Ass erlauben wie z. B. K♣Q♠; Royal Draws wie K♥-J♥ Drawing Hände, die Hilfe durch die Community Cards benötigen Kleine Paare: 6-6, 5-5, 4-4, 33, 2-2; Verbundene Karten, die einen Straight Flush ermöglichen wie z. B. 5♦-6♦; Hohe Flush Draws mit Assen wie A♥-7♥ Schlechte Karten Sollten nicht gespielt werden Alle nicht aufgeführten Hände. Tabelle 2.6.: Gruppeneinteilung von Starthänden [Bra03] Die Spielposition Die beste Position des Spieles ist die Dealerposition, da der Spieler in dieser Position als letzter Spieler in der Runde an der Reihe ist (Ausnahme: vor dem Flop). Der Vorteil 20 2.3. TAKTIK einer späten Position ist, dass der Spieler erst einmal die Aktionen der anderen Spieler beobachten kann und aufgrund dessen die Stärke seiner Karten besser einschätzen kann. Im Gegensatz dazu kann ein Spieler, der sich in einer frühen Position befindet, nicht einschätzen, wie groß der Pot werden wird. Geht ein Spieler in früher Position mit und nach ihm wird erhöht, kann er eventuell nicht weiter mitgehen und verliert seinen Einsatz. Um den Nachteil der frühen Position wettzumachen, benötigt man eine starke Starthand. In Tabelle 2.7 sind Empfehlungen für spielbare Starthände abhängig von der Position zu finden [Bra03]. Sitzposition relativ zum Dealer Position frühe Position 1–3 mittlere Position 4–6 späte Position 6–9 Spielbare Hände Premium Hände Premium und starke Hände Premium, starke und drawing Hände Tabelle 2.7.: Positionsempfehlungen für Starthände [Bra03] Hutchinson-Punktesystem Eine weitere Methode, um spielbare Starthände auszuwählen, ist das HutchinsonPunktesystem, mit dem man einer Starthand einen Zahlenwert zuordnen kann. Dieser Zahlenwert hilft dem Spieler bei der Entscheidung seiner Aktion. 1. Den Einzelkarten der Starthand werden Werte zugeordnet und addiert. (A = 16, K = 14, Q = 13, J = 12, 10 = 11, 9 = 9 8 = 8, . . . , 2 = 2) 2. Die Beziehung der Karten untereinander wird durch Aufaddieren eines oder mehrerer Werte nach folgender Einteilung berücksichtigt: • Paar = 10 • Karten von gleicher Farbe (suited) = 4 • verbundene Karten (connectors) = 3 • Lücke von einer Karte = 2 • Lücke von zwei Karten = 1 3. Die Position am Tisch wird durch Aufaddierung eines der folgenden Werte einbezogen: • mittlere Position = 3 • späte Position oder Dealer = 5 21 KAPITEL 2. POKERTHEORIE 4. Je nach Größe der Summe sollte der Spieler folgende Aktion durchführen: • Summe ≥ 30: mitgehen • Summe ≥ 34: mitgehen, erhöhen oder mitgehen nach einer Erhöhung • passen ansonsten Hat ein Spieler z. B. J♥-10♥ als Starthand in Dealerposition, ergibt sich die Summe zu 12 + 11 = 23 (für die Einzelkarten), 23 + 4 = 27 (für die gleiche Farbe), 27 + 3 = 30 (verbundene Karten) und 30 + 5 = 35 (für die Position). Daraus würde sich ergeben, dass der Spieler mitgehen oder erhöhen oder sogar nach einer Erhöhung mitgehen kann [PI06a]. Anzahl der Spieler Es besteht ein direkter Zusammenhang zwischen Anzahl der Spieler und Stärke einer Starthand. Je mehr Spieler mitspielen, desto wahrscheinlicher ist es, dass zwei Spieler premium Starthände haben [Bra03]. Dieser Zusammenhang lässt sich in Tabelle 2.3 gut erkennen. So liegt beispielsweise die Wahrscheinlichkeit mit einem Paar Achten auf ein höheres Paar zu treffen bei einer Anzahl von drei Gegenspielern bei etwa 8,55 %, während sich die Wahrscheinlichkeit bei neun Gegnern schon auf ca. 23,42 % erhöht. Pot Odds Die Pot Odds (Pot Chancen) sind ein wichtiges Hilfsmittel, um zu errechnen, wann es sinnvoll ist mit einer drawing Hand, also einer Hand, die verbesserungswürdig ist, nach dem Flop weiter mitzugehen, sofern man mit dieser Hand gewinnen würde. Die Idee hinter den Pot odds ist relativ einfach. Angenommen ein Spieler müsste 10 Euro in einen 40 Euro Pot zahlen, um mitzugehen. Wenn er mit einer Wahrscheinlichkeit von 20 % die Karte bekommt, die er zum gewinnen braucht, bedeutet es, dass er auf lange Sicht jedes fünfte Mal gewinnt. D. h. er müsste, sofern er vier mal in derselben Situation verliert und beim fünften mal gewinnt, 5 mal 10 Euro zahlen und würde einen Pot von 50 Euro gewinnen. Der Spieler hätte also keinen Verlust gemacht, aber auch nichts gewonnen. Um Gewinn zu machen, sollte er nur mitgehen, wenn er weniger als 10 Euro zahlen muss [Bra03]. Im folgenden wird anhand eines Beispiels für eine drawing Hand die Berechnung der Pot Odds erklärt. Angenommen ein Spieler hält einen Flush Draw, d. h. er hat vier Karten der gleichen Farbe und benötigt eine weitere, um den Flush zu komplettieren. Um die Pot Odds zu ermitteln benötigt man als erstes die Wahrscheinlichkeit, mit der die benötigte Karte im Turn oder River erscheint. (siehe Abschnitt 2.2.3 und Tabelle 2.5) Für den beschriebenen Fall, wäre die Wahrscheinlichkeit nach dem Flop P = 0, 3497, bzw. 34,97 % und nach dem Turn P = 0, 1957, bzw. 19,57 %. Weiter wird angenommen, dass sich im 22 2.3. TAKTIK Pot vor den Turn 100 Euro befinden und der Spieler mit 10 Euro mitgehen müsste, wenn er im Spiel bleiben möchte. Die Pot Odds berechnen sich fogendermaßen: P otOdds = P · (P ot + Einsatz) mit P = ˆ die Wahrscheinlichkeit, dass die fehlende Karte kommt Daraus ergibt sich P otOdds = 0, 3497 · (100 + 10) = 38, 46, d. h. der Spieler sollte nur mitgehen, wenn er weniger als rund 38 Euro in den Pot einzahlen muss. Da er nur 10 Euro zahlen muss, sollte er mitgehen. Sollte beim Turn die benötigte Karte nicht kommen, der Pot nun bei 150 Euro stehen und der Spieler mit 50 Euro mitgehen müssen, um im Spiel zu bleiben, würden sich folgende Pot Odds ergeben: P otOdds = 0, 1957 · (150 + 50) = 39, 14. Der Spieler sollte in diesem Fall besser passen, da das Verhältnis zwischen Gewinnchance und nötigem Einsatz ungünstig ist. Pot Odds überschlagen Um die Pot Odds während eines Spiels einfacher berechnen zu können, bieten sich folgende Formeln für die Schätzung der Wahrscheinlichkeiten (in %) an: Nach dem Flop: P = outs · 4, für 1 ≤ outs ≤ 9 und P = outs · 4 − 1, für 10 ≤ outs ≤ 12 und P = outs · 4 − 2 für outs > 12 Nach dem Turn: P = outs · 2, für 1 ≤ outs ≤ 5 und P = outs · 2 + 2 für outs > 5 Zum Vergleich findet sich in Tabelle 2.8 eine Gegenüberstellung der in Tabelle 2.5 errechneten und der durch die Formeln überschlagenen Wahrscheinlichkeiten. Daraus lässt sich erkennen, dass die Annäherungsformeln relativ genaue Ergebnisse liefern [Kri04]. Spielweise der anderen Spieler Die Art, wie ein Spieler spielt, lässt sich in vier Kategorien einteilen, wobei gute Spieler ihr Spiel varieren: • Loose-passive (locker, freigiebig mit ihrem Geld, passiv in ihren Aktionen) • Loose-aggressive (locker, freigiebig mit ihrem Geld, übernehmen die Spielinitiative) • Tight-passive (dizipliniert, sorgsam mit ihrem Geld, passiv in ihren Aktionen) • Tight-aggressive (dizipliniert, sorgsam mit ihrem Geld, aggressive Spielweise) Loose-passive: Diese Art von Spielern gehen freigiebig mit ihrem Geld um, aber ihre Aktionen folgen denen der anderen Spieler. Sie spielen viele Hände, gehen oft mit, aber erhöhen selten. Befinden sich viele solcher Spieler am Tisch, können auch schwächere Hände gespielt werden, da die Gewinnhöhe steigt und sich dadurch gute Pot Odds ergeben [Bra03]. 23 KAPITEL 2. POKERTHEORIE Nach dem Flop outs Tats. Formel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 4,26 8,42 12,49 16,47 20,35 24,14 27,84 31,45 34,97 38,39 41,72 44,96 48,1 51,16 54,12 56,98 59,76 62,44 65,03 67,53 69,94 4 8 12 16 20 24 28 32 35 39 43 47 48 52 56 60 64 68 72 76 80 Nach dem Turn Fehler F. in % −0,26 6,0 −0,42 4,97 −0,49 3,91 −0,47 2,83 −0,35 1,73 −0,14 0,6 0,16 0,56 0,55 1,74 0,03 0,09 0,61 1,59 1,28 3,07 2,04 4,54 −0,1 0,22 0,84 1,65 1,88 3,48 3,02 5,29 4,24 7,1 5,56 8,9 6,97 10,71 8,47 12,54 10,06 14,39 Tats. Formel 2,17 4,35 6,52 8,7 10,87 13,04 15,22 17,39 19,57 21,74 23,91 26,09 28,26 30,43 32,61 34,78 36,96 39,13 41,3 43,48 45,65 2 4 6 8 10 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 Fehler F. in % −0,17 −0,35 −0,52 −0,7 −0,87 0,96 0,78 0,61 0,43 0,26 0,09 −0,09 −0,26 −0,43 −0,61 −0,78 −0,96 −1,13 −1,3 −1,48 −1,65 8,0 8,0 8,0 8,0 8,0 7,33 5,14 3,5 2,22 1,2 0,36 0,33 0,92 1,43 1,87 2,25 2,59 2,89 3,16 3,4 3,62 Tabelle 2.8.: Vergleich der Wahrscheinlichkeiten (in %) Loose-aggressive: Diese Art von Spielern gehen ebenfalls freigiebig mit ihrem Geld um, aber sie erhöhen oft auch mit schwachen Händen. Sitzt ein solcher Spieler in später Position, sollten die vorhergehenden mit einer Erhöhung rechnen und dementsprechend starke Karten spielen. Befinden sich viele loose-aggressive Spieler am Tisch, werden die Pots sehr groß, da selbst die schwächsten Hände aggressiv gespielt werden. An solchen Tischen sollten nur wirklich starke Hände gespielt werden. Es ist auch wahrscheinlich, dass viel Geld verloren wird, welches aber schon durch wenige Pots wieder zurückgewonnen werden kann [Bra03]. Tight-passive: Tight-passive Spieler gehen sorgsam mit ihrem Geld um und ihre Aktionen folgen denen der anderen Spieler. Sie bieten und erhöhen selten und gehen nur mit starken Händen mit. Sind viele solcher Spieler am Tisch, bleiben die Pots eher klein. Eine gute Strategie gegen diese Spieler ist eine aggressive Spielweise, auch mit schlechteren Karten [Bra03]. Tight-aggressive: Solche Spieler achten auf ihr Geld, übernehmen aber die Initiative, 24 2.3. TAKTIK wenn sie eine gute Hand halten. Dadurch zwingen sie andere Spieler ebenfalls hohe Einsätze zu bringen, wenn sie im Spiel bleiben wollen. Diese Spielweise ist die erfolgversprechendste, erfordert aber ein gutes Einschätzungsvermögen der gesamten Spielsituation. Befinden sich viele tight-aggressive Spieler am Tisch, sollten schlechtere Spieler besser aussteigen [Bra03]. Die Spielweise der einzelnen Spieler eines Tisches beeinflusst die Spielweise des gesamten Tisches durch gruppendynamische Prozesse. Es ist möglich, dass sich über mehrere Spiele hinweg die Spielweise des Tisches komplett und ohne direkt ersichtlichen Grund ändert. Deshalb ist es wichtig, die Gesamtspielweise immer zu beobachten, gerade für die Entscheidung, ob eine Starthand gespielt wird oder nicht. Im Verlauf einer Hand wird die Spielweise der einzelnen Spieler wieder wichtiger, da sich immer weniger Spieler aktiv im Spiel befinden [Bra03]. 2.3.2. Anwendung In diesem Abschnitt werden einige grundlegende Taktiken angerissen und anhand von Beispielen näher erklärt. Eine wichtige Voraussetzung für den Spieler ist, dass er erkennen kann, welches Potential die eigene Hand hat und einschätzen kann, welche Hände die Gegner halten könnten. Starthände Wie in Abschnitt 2.3.1 schon beschrieben, sollten die Hände in Abhängigkeit von Stärke und Spielposition gespielt werden. Das bedeutet, dass die Mehrzahl der Pocket Cards nicht gespielt werden und der Spieler geduldig sein muss. Es ist wichtig, die Stärke der Hand richtig einzuschätzen und nicht zu überschätzen. So wirken gleichfarbige Karten stark, da sie die Möglichkeit auf einen Flush bieten, aber in Wirklichkeit sind Flushes eher rar. Die meisten Hände beim Texas Hold’em werden durch hohe Paare in Verbindung mit einem guten Kicker gewonnen. In früher Position sollten nur starke und premium Hände gespielt werden, da damit gerechnet werden muss, dass ein Spieler in später Position noch erhöhen kann. Eine Erhöhung deutet meist auf eine starke Hand hin und deshalb sollte nicht mit einer drawing Hand mitgegangen werden. Mit einer premium Hand wie A-A oder K-K sollte immer erhöht oder eine vorherige Erhöhung erneut erhöht werden, egal von welcher Position. Dadurch werden Spieler mit schwächeren Händen aus dem Spiel getrieben und die Wahrscheinlichkeit zu gewinnen erhöht sich. In einer späten Position können auch drawing Hände wie 5♣-6♣ gespielt werden, solange vorher nicht erhöht wurde und viele Spieler (mindestens vier) mitgegangen sind. Dadurch befindet sich viel Geld im Pot und die Pot odds für spätere Spielsituationen sind gut [Bra03]. Beispiel 1: Ein Spieler bekommt als Starthand 2♦-5♣ und passt, weil er sich 25 KAPITEL 2. POKERTHEORIE daran hält, nur hohe Karten zu spielen. Auf dem Flop kommen die Karten 2♣-5♥-5♦, auf dem Turn 10♣ und auf dem River J♦. Es wird jede Runde viel geboten und am Ende gewinnt ein Spieler mit einen Pocket Paar Damen den inzwischen großen Pot. Der Spieler, der am Anfang gepasst hat, hätte ein Full House gehabt und somit die zwei Paare (Damen und Fünfer) des Gewinners geschlagen. Trotzdem war die Entscheidung, die Karten zu passen, richtig. Auch wenn man mit jeder Starthand gewinnen kann, verliert man auf lange Sicht mehr, als dass man gewinnt, wenn man niedrige Karten spielt. Hinzu kommt, dass der Spieler zum Zeitpunkt des Flops zwar die bestmögliche Hand gehalten hätte, aber am Turn oder River hätte ihn jeder Gegenspieler mit 10-10 oder J-J als Starthand schlagen können [Bra03]. Beispiel 2: Ein Spieler hält als Starthand 10♣-J♣ und befindet sich in früher Position links neben dem Big Blind. Er geht mit, der nächste Spieler erhöht, die nachfolgenden fünf Spieler passen, der Spieler am Button geht die Erhöhung mit und die beiden Blinds passen. Nun ist der anfängliche Spieler wieder an der Reihe und geht mit, weil er schon Geld in den Pot investiert hat. Auf dem Flop kommen die Karten A♦-2♥-7♠. Einer der beiden Gegenspieler setzt und der Spieler passt, weil seine Starthand nun wertlos geworden ist. Der Spieler hätte schon nach der Erhöhung vor dem Flop passen müssen, da es zu viel kostet auf eine Straße oder einen Flush aus früher Position zu spielen. Hinzu kommt noch, dass bei den wenigen Gegenspielern der Gewinn zu niedrig ausgefallen wäre, selbst wenn der Spieler seinen Draw getroffen hätte. Dieses Beispiel zeigt, dass eine solche Starthand in früher Position nicht gespielt werden sollte, da man sich nicht sicher sein kann, ob noch erhöht wird und wieviele Spieler in der Runde bleiben werden [Bra03]. Nach dem Flop Nach dem Flop sind fünf der sieben Karten, aus denen die Pokerhand gebildet werden, bekannt. Da die drei Karten des Flops für alle Spieler zählen, hat der Spieler, der zu diesem Zeitpunkt die beste Hand hält, sehr gute Chancen das Spiel zu gewinnen. Die folgenden zwei öffentlichen Karten können zwar die Hände der anderen verbessern, aber oft verstärken sie auch die Hand des Führenden. Deshalb ist es wichtig den Flop unter folgenden Gesichtspunkten richtig deuten zu können [Bra03]. Flops mit hohen Karten (Scare Cards): Da es sinnvoll ist, mit hohen Karten oder Paaren als Starthand zu spielen, sind hohe Karten im Flop (A, K, Q oder J) angstein” flößend“, deshalb nennt man sie Scare Cards. Ein Spieler, der vor dem Flop erhöht hat, hat möglicherweise ein hohes Paar oder zumindest zwei hohe Karten (A-Q), die er durch einen solchen Flop zu einem starken Paar oder sogar einem Drilling verbessert hat. Deshalb sollten solche Flops nur weitergespielt werden, wenn man das höchste Paar mit einem guten Kicker hält [Bra03]. Flops mit kleinen Karten (garbage): Bei einem Flop mit kleinen Karten (2♣-5♥-7♦) ist es weniger wahrscheinlich, dass ein Spieler ein Paar getroffen hat. Spieler die 26 2.3. TAKTIK hohe Karten oder hohe Paare halten, haben daher weiterhin einen großen Vorteil. Allerdings sollten die Spieler nicht unterschätzt werden, die den Small bzw. Big Blind gezahlt haben und nur mitgehen, oder checken mussten, da zuvor nicht erhöht wurde. Sollten diese Spieler plötzlich aktiv werden, könnte es sein, dass sie z. B. zwei Paare haben [Bra03]. Flops mit Paaren: Sollte der Flop ein Paar enthalten, ist es wichtig ein besseres Paar, als das im Flop zu bilden, da das Paar im Flop für alle Spieler zählt. Ein Spieler mit der Starthand A♣-3♣ wird seine Hand bei einem Flop wie 10♥-10♣-3♠ noch verbessern müssen, um zu gewinnen. Ein Flop mit einem Paar bietet auch die Möglichkeit, ein Full House zu bilden. Bei einem Flop mit einem hohen Paar und einer hohen Beikarte, wie Q♣-Q♣-J♥ ist es wahrscheinlicher, dass ein Spieler ein Full House hält, als bei kleineren Karten im Flop, da normalerweise bevorzugt hohe Karten gespielt werden [Bra03]. Drawing Flops: Ein solcher Flop enthält zwei Karten der gleichen Farbe (suited) oder zwei (fast) aufeinanderfolgende Karten, die Spielern mit passenden Karten eine drawing Hand geben [Bra03]. Flops, die schlagkräftige Hände erlauben: Solche Flops enthalten drei Karten derselben Farbe oder drei verbundene Karten und sollten nicht gespielt werden, wenn man nicht die Chance auf einen hohen Flush oder eine hohe Straße hat. Wenn ein oder mehrere Spieler setzen oder erhöhen, ist es wahrscheinlich, dass sie schon eine gute Hand oder einen guten Draw halten [Bra03]. Kombinierte Flops: Es befinden sich starke Karten (hohe Karten, gleiche Farben), wie K♦-K♠-Q♦ im Flop. Diese Situation ermöglicht durch die späteren Karten einen Flush, eine Straße, oder sogar einen Royal Flush und sollten deshalb auch nur mit einer starken Starthand gespielt werden [Bra03]. Solange ein Spieler nicht die beste Hand oder einen Draw zur besten Hand hält, sollte er nach dem Flop nicht weiter bieten oder mitgehen. Dabei ist die beste Hand nicht unbedingt die bestmögliche Hand, die sogenannten Nuts. Es ist wichtig die Hand richtig beurteilen zu können. Dadurch kann eingeschätzt werden, wann eine mittelmäßige Hand die aktuell beste ist und geboten werden sollte und wann eine premium Hand nicht mehr die beste ist und gepasst werden sollte [Bra03]. Beispiel 1: Ein Spieler hält in später Position A♦-Q♥, der Flop ist Q♣-7♦-3♠ und alle vorhergehenden Gegenspieler haben gecheckt. Der Spieler ist sich nicht sicher, ob er bieten soll, weil er nur ein Paar Damen hat. Der Spieler sollte bieten, da er, mit seinem Paar Damen und dem Ass als Kicker, im Moment höchstwahrscheinlich die beste Hand hält und sie durch spätere Karten auch noch verbessern kann. Solange es wahrscheinlich ist, dass man die beste Hand hält, sollte man bieten [Bra03]. Beispiel 2: Als Pocket Cards hält ein Spieler 6♦-7♦ und befindet sich in später 27 KAPITEL 2. POKERTHEORIE Position. Mit ihm spielen sechs weitere Spieler um den Pot. Der Flop setzt sich aus 8♠-9♠-10♥ zusammen. Bevor der Spieler an der Reihe ist, setzt ein Gegenspieler, ein weiterer erhöht und andere Spieler gehen mit der Erhöhung mit. Aufgrund der Straße, die er durch den Flop hält, geht der Spieler mit. Der Spieler hätte passen sollen, da es aufgrund der Bieten und Erhöhen Aktionen wahrscheinlich ist, dass ein Gegenspieler bereits eine höhere Straße (z. B. J-Q) hält. Die Spieler die mitgegangen sind halten wohlmöglich einen Flush Draw oder Q-K und hoffen auf einen Buben, der ihnen eine King-high Straight bringen würde. Die Straße des Spielers liegt an dieser Stelle wahrscheinlich schon weit zurück und es gibt auch keine Möglichkeiten zur Verbesserung [Bra03]. Nach dem Turn Nach dem Turn verdoppeln sich die Einsätze. Ab diesem Punkt ist es deshalb besonders wichtig die Hand der Gegenspieler richtig einschätzen zu können. Hält ein Spieler eine drawing Hand, sollte er seine Entscheidung, ob er weiter mitgeht oder passt von den Pot Odds abhängig machen. Hält ein Spieler zu diesem Zeitpunkt eine starke Hand, sollte er bieten, um Gegenspieler, die eine drawing Hand haben aus dem Spiel zu treiben und so die eigene Hand zu schützen. Dieses Vorgehen sollte allerding nur eingesetzt werden, wenn nur noch wenige Spieler im Spiel sind. Sind dagegen viele Spieler am Pot beteiligt, wird es schwierig die Spieler mit einer drawing Hand aus dem Spiel zu vertreiben, da die Pot Odds gut für sie sind. In einer solchen Situation sollte der Spieler versuchen mit möglichst wenig Investition zum River zu gelangen [Bra03]. Beispiel 1: Ein Spieler hält A♣-J♠ und im Flop liegen die Karten A♦-J♦-3♣. Der Spieler setzt, ein Gegenspieler geht mit, die anderen passen. Der Spieler vermutet daher, dass der letzte Gegenspieler einen Flush Draw hält. Auf dem Turn kommt 5♠ und der Gegenspieler checkt. Der Spieler checkt ebenfalls, weil er befürchtet, dass die fehlende ♦-Karte auf dem River kommen könnte. Auf dem River kommt tatsächlich ein Karo, der Gegenspieler bietet und der Spieler geht mit. Der Gegenspieler gewinnt mit einem Karo Flush. Der Spieler hat durch das Checken auf dem Turn zwar im Endeffekt Geld gespart, aber er hätte trotzdem bieten müssen. Durch das Checken hat er dem Gegenspieler eine kostenlose Karte ermöglicht, obwohl er unter Umständen gepasst hätte. Des Weiteren gewinnt der Gegenspieler in einem solchen Fall statistisch gesehen nur ein einem von fünf Fällen, da die Wahrscheinlichkeit 20 % beträgt, dass seine benötigte Karte auf dem River kommt. D. h. der Spieler gewinnt in vier von fünf Fällen und muss den Gegenspieler deshalb zwingen dafür zu bezahlen, um ihn zu schlagen. Auf lange Sicht gewinnt er dadurch deutlich mehr, als er verliert [Bra03]. Beispiel 2: In später Position hält ein Spieler die Starthand A♣-9♣ und der Flop ist 5♣-8♣-K♦. Ein Gegenspieler bietet, sechs Spieler gehen mit und der Spieler geht ebenfalls mit. Auf dem Turn erscheint Q♠. Es wird abermals geboten und sechs Spieler gehen mit. Der Pot steht jetzt bei 100 Euro und der Spieler müsste mit 12 Euro 28 2.3. TAKTIK mitgehen. Der Spieler zögert, weil er weiß, dass er in 80 % der Fälle verlieren wird. Der Spieler muss mitgehen, da die Pot Odds sehr gut sind, demnach könnte er bis ca. 22 Euro mitgehen. Da er auf lange Sicht in einem von fünf identischen Situationen gewinnt, hätte er, bei einem Einsatz von 12 Euro, 60 Euro investiert, aber 100 Euro gewonnen [Bra03]. Nach dem River An dieser Stelle sind alle Karten ausgegeben, deshalb sollte das Augenmerk darauf gerichtet werden, entweder das Maximum an Gewinn aus der besten Hand zu schlagen oder die Verluste, gegenüber komplettierten drawing Händen, gering zu halten. Der Spieler, der über die vorherigen Spielrunde die wahrscheinlich beste Hand gehalten hat, d. h. er hat geboten und die anderen Spieler sind mitgegangen, sollte das Bieten fortsetzen, solange keine Scare Card kommt. Eine Scare Card auf dem River ist eine höhere Karte, als die eigenen oder eine Karte, die eine drawing Hand wie einen Flush oder Straigth Draw vervollständigen würde. Kommt eine solche Karte auf dem River sollte der Spieler nur checken, damit eine spätere Erhöhung durch einen Gegenspieler, der nun die bessere Hand hält, vermieden wird. Sollte ein Gegenspieler anfangen zu bieten, ist es wahrscheinlich, dass er seine Hand vervollständigt hat und es sollte daher nicht weiter mitgegangen werden. Spieler, die ihren Draw nicht komplettieren konnten, sollten passen, um die Verluste gering zu halten, während ein Spieler, der die Nuts hält, immer bieten oder erhöhen sollte. Es kommt manchmal vor, dass ein Spieler über die Runden hinweg die beste Hand hält und nur eine oder zwei Karten des Stapels könnten ihn schlagen, wenn sie auf dem River kommen. Falls nun eine dieser Karten auf dem River ausgeteilt wird, nennt man das Bad Beat. Eine solche Situation ergibt sich meist, wenn ein Spieler zwei hohe Paare und sein Gegenspieler ein niedriges Pocket Paar (z. B. 3-3) hält und damit alle Einsätze und Erhöhungen des Spielers mitgeht, auch entgegen der Pot Odds. Auf dem River erscheint nun die 3, die für den ersten Spieler harmlos erscheint, aber dem Gegenspieler den Drilling vervollständigt. Solche Bad Beats sind unvermeidlich und es kann nichts dagegen getan werden. Es wäre falsch zu zögern, wenn man eine starke Hand hält und ebenso falsch seinerseits anzufangen unwahrscheinliche drawing Hands zu spielen [Bra03]. Beispiel 1: Die öffentlichen Karten sind K♣-Q♠-J♣-3♦-7♥ und ein Spieler in früher Position hält A♣-10♦. Er hält also die Nuts. Aus Angst die anderen aus dem Pot zu vertreiben, checkt er, in der Hoffnung, dass ein anderer Spieler noch bietet. Alle Gegenspieler checken und er gewinnt den Pot. Wenn ein Spieler die bestmöglichen Karten hält, sollte er auch bieten. Falls kein Gegenspieler mitgeht, hat er den gleichen Gewinn, als wenn alle checken. Durch das Bieten zwingt man die Gegner zu einer Entscheidung und eventuell auch zu einer Fehlentscheidung [Bra03]. Beispiel 2: Ein Spieler in früher Position hat Q♣-J♦ als Starthand. Bis zum 29 KAPITEL 2. POKERTHEORIE Turn wurden folgende Karten aufgedeckt: 3♣-Q♦-J♣-3♥. Der Spieler setzt und ein Gegenspieler geht mit. Auf dem River kommt A♣. Der Spieler bietet erneut, der Gegner erhöht und der Spieler geht mit. Der Gegenspieler deckt A♦-K♥ auf und gewinnt den Pot mit zwei Paaren (Asse und Dreier). Eine hohe Karte auf dem River sollte den Spieler skeptisch werden lassen. Viele Spieler neigen dazu, an einer Starthand wie A-K festzuhalten. Deshalb ist es wichtig, sich in den Gegner hineinzuversetzen, um abschätzen zu können, welche Hand er hält. Mit seiner Starthand hatte der Gegner am Turn zehn Outs, mit denen er den Spieler hätte schlagen können: drei Asse, drei Könige und vier Zehnen [Bra03]. Bluffen Das reine Bluffen durch Bieten und Erhöhen bis zum River mit nichts auf der Hand, wird in den seltensten Fällen zum Erfolg führen. Wenn ein Spieler mit einem reinen Bluff durchkommen möchte, muss er sich zuerst als tight-aggressiver Spieler am Tisch etablieren und einen Gegenspieler haben, der aufgrund dessen die Einsätze des Spielers respektiert. Hält der Gegenspieler die Nuts, wird das Bluffen gegen ihn trotzdem nicht funktionieren. Manchmal ist es aber auch wünschenswert, dass ein Bluff aufgedeckt wird, damit die Gegenspieler dazu verleitet werden, später bei starken Händen länger mitzugehen. An Tischen mit vorwiegend loose-passive Spielern, sollte nicht geblufft werden, da die Gegenspieler einerseits schwer aus der Hand zu vertreiben sind und andererseits auch bei starken Händen öfter mitgehen werden. Neben dem reinen Bluff gibt es aber noch weitere Möglichkeiten zu Bluffen, die anhand der folgenden Beispiele erläutert werden [Bra03]. Beispiel 1: Ein Spieler in später Position hält als Pocket Cards A♣-9♣ und der Flop kommt mit Q♣-Q♥-10♣. Ein Gegenspieler in früher Position setzt, drei weitere gehen mit und der Spieler erhöht. Alle weiteren Gegenspieler passen, bis auf die, die bereits gezahlt hatten und nun die Erhöhung mitgehen. Auf dem Turn kommt A♦ und alle Spieler checken. Auf dem River kommt 8♣, was den Flush des Spielers komplett macht. Alle Gegenspieler checken, der Spieler setzt und nur der Gegenspieler, der zuerst gesetzt hatte geht mit und deckt K♥-Q♦ auf. Der Flush des Spielers gewinnt gegen die drei Damen. Der Spieler hat durch seine Erhöhung geblufft, da er zu diesem Zeitpunkt nichts auf der Hand hatte. Allerdings war es in Anbetracht seiner guten drawing Hand nur ein Semi-Bluff. Durch die Erhöhung hat sich der Spieler eine freie Riverkarte erkauft. Der Gegenspieler mit dem Damen-Drilling hat aus Angst vor einer erneuten Erhöhung auf dem Turn nicht mehr geboten. Da sich ab dem Turn die Einsätze verdoppeln, hat die Erhöhung des Spielers vor dem Turn nur die Hälfte von dem gekostet, was er für das Mitgehen nach dem Turn hätte zahlen müssen. Außerdem hat der Bluff des Spielers Informationen über die Hand des Gegners geliefert. Es hätte durchaus sein können, dass der Gegenspieler ein Full-House hält, da zwei Damen im Flop lagen. Der Spieler wäre somit Drawing Dead gewesen, d. h. selbst wenn er seinen Flush Draw vervollständigt 30 2.3. TAKTIK hätte, wäre er der Verlierer. Allerdings hätte sich sein Gegenspieler dann anders verhalten, er hätte entweder die Erhöhung am Flop noch mal erhöht, auf Turn oder River geboten oder den Einsatz am River erhöht [Bra03]. Beispiel 2: In mittlerer Position hat ein Spieler K♣-Q♦. Im Flop kommt J♣10♥-7♠ und alle vorhergehenden Gegenspieler checken. Der Spieler bietet, obwohl er nur einen Open Ended Straight Draw hält. Der nächste Gegenspieler erhöht, ein weiterer geht mit, alle anderen passen und der Spieler geht ebenfalls mit. Als Turnkarte wird 9♠ ausgeteilt, was dem Spieler die bestmögliche Straße gibt. Der Spieler ist an der Reihe und checkt, um Angst vor der möglichen Straße vorzutäuschen. Der Gegenspieler, der zuvor erhöht hat, setzt, der zweite Gegenspieler und der Spieler selbst gehen mit. Auf dem River wird 3♣ ausgeteilt, so dass der Spieler die bestmögliche Hand hält. Der Spieler checkt erneut, der erste Gegenspieler setzt und der zweite passt. Nun erhöht der Spieler und der Gegenspieler, der J♥-J♣ hält, geht mit. Die irreführende Spielweise des Spielers hat ihm eine Menge Geld eingebracht. Hätte er mit dem Straight Draw gecheckt und geboten, als die Straßenmöglichkeit gegeben war, wäre der Gegner mit dem Drilling am Ende vorsichtiger gewesen. Durch die umgekehrte Spielweise konnte der Gegener dazu gebracht werden, für den Spieler zu bieten. Außerdem wird der Gegenspieler in Zukunft ein Checken des Spielers nicht mehr unbedingt als Zeichen einer schwachen Hand ansehen. Auch wenn diese Spielweise in dem Beispiel funktioniert hat, ist es nicht immer angebracht, einen Draw auf diese Weise zu spielen. Meistens ist es besser mit einem Draw zu checken und zu bieten, wenn er vervollständigt wurde. Allerdings ist die irreführende Spielweise eine Möglichkeit das eigene Spiel zu variieren, um undurchschaubar für die Gegener zu bleiben. Sollten sich aber viele Gegenspieler am Tisch befinden, die die ganze Zeit mitgehen, ist es nicht sinnvoll eine irreführende Spielweise zu betreiben, weil sie es nicht einmal merken würden [Bra03]. 31 KAPITEL 3. UMSETZUNG 3. Umsetzung Dieses Kapitel behandelt den Entwurf des Client-/Serversystems, sowie der Pokerbots. Die grundlegende Architektur des Systems ist in Abbildung 3.1 dargestellt. Als Programmiersprache für die Implementierung wurde Java gewählt, da es eine schnelle, weitgehend plattformunabhängige Programmentwicklung erlaubt. Für die Umsetzung des Clients werden Java Applets benutzt, wodurch der Client in fast jedem Webbrowser lauffähig ist. Die Verbindung zwischen Server und Client erfolgt durch Sockets und die Kommunikation verläuft mit Hilfe von XML-Nachrichten. Dadurch ist eine spätere Entwicklung eines Clients in einer anderen Programmiersprache denkbar. Abbildung 3.1.: Architektur des Client-/Serversystems 32 3.1. SERVER 3.1. Server 3.1.1. Anforderungen Der Pokerserver regelt die Spielsteuerung, die Verwaltung der Spielerdaten und die Verbindung und Kommunikation mit den Pokerclients. 3.1.2. Entwurf Da der Pokerserver mehrere Funktionen übernimmt, werden diese in unterschiedliche Pakete gegliedert. Paket: de.aufjeden.poker.server 1.1, server PokerServer Thread PokerServerThread -PORT:int -ss:ServerSocket +main:void -server:PokerServer -socket:Socket -clientNachricht:Nachricht +PokerServer -listen:void +entferneVerbindung:void +addVerbindung:void +sendeXMLanAlle:void -sql:SQLSpielerVerbindung -name:String +sendeXMLzuSocket:void +addSpielerSocket:void +entferneSpielerSocket:void +sendeXMLzuSpieler:void +addTischSocket:void -verarbeiteLoginNachricht:LoginNachricht -verarbeiteRegistrierenNachricht:RegistrierenNachricht -verarbeiteTischBetretenNachricht:TischBetretenNachricht -verarbeiteSpielerAktionNachricht:SpielDatenNachricht +PokerServerThread +run:void +entferneTischSocket:void +sendeXMLzuTisch:void +getSpielerSocket:Socket +updateTischDaten:void +shutdown:void +updateVerlassenSpieler:void shutdown:boolean Abbildung 3.2.: Klassendiagramm: Server (de.aufjeden.poker.server) Im Paket Server befinden sich die Klassen des Pokerservers, die für den Auf- und Abbau der Client-/Serververbindung, Organisation der Kommunikation zwischen Pokerspiel und Server sowie Vermittlung der Anfragen von Clients bzw. Antworten an Clients zuständig sind. 33 KAPITEL 3. UMSETZUNG Klasse PokerServer: Diese Klasse hat die Aufgabe auf einem bestimmten Port auf Clientverbindungen zu warten. Wenn sich ein Client verbindet wird für ihn ein PokerServerThread Objekt erstellt und ein PrintStream/Socket Paar in einer Hashmap gespeichert, damit später eine Verbindung zum Client über den Socket ermöglicht wird. Des Weiteren ist diese Klasse für die Zuordnung von Socket zu Spieler und Socket zu Pokertisch zuständig, so dass eine gezielte Verbindung zum Client eines bestimmten Spielers oder zu den Clients eines bestimmten Tisches ermöglicht wird. Für die Verbindung zu den Clients stellt die Klasse PokerServer die Methoden sendeXMLzuSocket(String, Socket), sendeXMLzuSpieler(String, String), sendeXMLzuTisch(String, int) und sendeXMLanAlle(String) zur Verfügung. Für die Manipulation der Zuordnungslisten werden diverse Methoden zum Hinzufügen und Entfernen von Sockets bereitgestellt. Klasse PokerServerThread: Für jeden verbundenen Client wird ein PokerServerThread erstellt, der die Anfragen seines Clients entgegennimmt und dementsprechend reagiert. Grundlegende Funktionen wie Login, Registrierung sowie die Kreditfunktion, werden von der Klasse selbst realisiert. Anfragen, die ein Pokerspiel betreffen, wie z. B. einem Tisch beitreten oder Spielaktionen werden an das entsprechende Spiel weitergeleitet. Paket: de.aufjeden.poker.spiel Das Paket Spiel beinhaltet die Klassen, die für die Spielsimulation zuständig sind. Klasse Karte: Diese Klasse repräsentiert eine Karte des Kartenspiels. Eine Karte besteht aus einer von vier Farben (z. B. Farbe.PIK) und kann einen Wert von 2 (Wert.ZWEI) bis Ass Wert.ASS annehmen. Die Klasse implementiert die Schnittstelle Comparable, so dass es möglich ist zwei Kartenobjekte anhand ihrer Wertigkeit zu vergleichen. Die Methode toInt() liefert eine Ganzzahldarstellung der Karte, wobei 2♣ der Null, 2♦ der Eins, 2♥ der Zwei, 2♠ der Drei, 3♣ der Vier, . . . und A♠ der 51 entspricht. Klasse Kartespiel: Das Kartenspiel, das aus 52 Karten besteht, wird durch diese Klasse repräsentiert. Es wird eine Methode mischen() zur Verfügung gestellt, um das Kartenspiel zu durchmischen. Des Weiteren gibt es die Methoden gibKarte() und gibKarten(int), die eine bzw. eine bestimmte Anzahl von Karten zurückliefern und mit Hilfe der Methode entferneKarte() bzw. entferneKarten(int) vom Kartenstapel entfernen. Klasse Tisch: Durch die Klasse Tisch wird ein Pokertisch, der aus Tischname, Tischnummer, Höhe des Big Blinds und Anzahl der Spieler besteht, repräsentiert. Es werden die Methoden getTischElement(Document), die das XML Element des entsprechenden Tischobjekts zurückliefert, und parseTischNodeList(NodeList), die ein Tischobjekt aus einer Nodelist erstellt, zur Verfügung gestellt. Über verschiedene Getter und Setter kann auf die Tischattribute zugegriffen werden. 34 3.1. SERVER 1.1, spiel Spiel -bigBlind:int -dealer:int -kartenspiel:Kartenspiel TimerTask Runnable SpielTimerTask +compareTo:int -ermittleEinstufung:void +toString:String -spiel:Spiel -letzterSpieler:int -maximalerEinsatz:int -aktion:int -multiplikator:int -runde:int -spielLaeuft:boolean -timer:Timer -aktionTimer:Timer -sql:SQLSpielerVerbindung -bigBlindNr:int -allinSpieler:int SpielTimerTask +run:void -maxZeit:int +Spiel +addSpieler:int +aktionChecken:SpielDaten -starteTimer:void -stoppeTimer:void +aktionErhoehen:SpielDaten +aktionMitgehen:SpielDaten +aktionPassen:SpielDaten KartenEinstufung klasse:Klassen Blatt SpielDaten +SpielDaten +SpielDaten +parseSpielDatenNodeList:void +getSpielDatenElement:Element +getSpieler:SpielerSpielDaten +setSpieler:void +addPot:void +addFlop:void +resetKarten:void +getSpielerNummer:int +aktionSetzen:SpielDaten gewinnerInfo:String +aktionTeilnehmen:SpielDaten +aktionVerlassen:SpielDaten -verlassenSpieler:void pot:int river:Karte +aktionAussetzen:SpielDaten status:SpielStatus +aktionClientVerlassen:SpielDaten -einstiegSpieler:void +ermittleGewinner:void -getKE:KartenEinstufung statusInfo:String turn:Karte dealer:int Pot spieler:SpielerSpielDaten[] +Pot +addiereGeld:void +addBerechtigt:void +toString:String +removeBerechtigt:void -getNaechsterAktiverSpieler:int -istAktiv:boolean -loesche:void +anzahlKarten:int +entferneKarte:void +enthaeltDrilling:boolean +enthaeltFlush:boolean +enthaeltPaar:boolean +enthaeltStrasse:boolean +enthaeltVierling:boolean +holeHoheKarte:Karte +sortieren:void +weitereKarte:void geld:int Karte Tisch -resetSpieler:void -naechsteAktion:void +naechsteWettrunde:void -setzeAktiv:void -setzeSpielerVerlassen:void +Karte +Karte +compareTo:int -setzePassiv:void +toInt:int -resetTisch:void +spielLaeuft:boolean +beendeSpielRunde:void +toString:String -starteSpiel:void farbe:Farbe wert:Wert -zuruecksetzen:void -berechnePots:void +spielBeenden:void Kartenspiel +Tisch +Tisch +getTischElement:Element +parseTischNodeList:void bigblind:int name:String nummer:int anzahlSpieler:int anzahlAktiverSpieler:int anzahlSpieler:int ssk:SpielServerKommunikation spieldaten:SpielDaten tischNummer:int amzug:int +Kartenspiel +entferneKarte:void +entferneKarten:void +gibKarte:Karte +mischen:void +toString:String Abbildung 3.3.: Klassendiagramm: Spiel (de.aufjeden.poker.spiel) 1.1, spiel 35 KAPITEL 3. UMSETZUNG Klasse Pot: Diese Klasse repräsentiert einen Pot bestehend aus der Menge Geld, die sich in ihm befindet, und einer Liste von berechtigten Spielern. Klasse Spiel: Die eigentliche Spielsimulation erfolgt mit Hilfe dieser Klasse. Für die Durchführung der möglichen Spieleraktionen werden die Methoden aktionChecken(String), aktionSetzen(String), aktionMitgehen(String), aktionErhoehen(String) und aktionPassen(String) zur Verfügung gestellt. Weitere Aktionen, die ein Spieler innerhalb des Spiels ausführen kann, sind teilnehmen, aussetzen und das Spiel verlassen. Diese Aktionen werden durch die Methoden aktionTeilnehmen(String), aktionAussetzen(String) und aktionVerlassen(String), ausgeführt, sofern in es diesem Moment möglich ist. Sollte der aktuelle Spielzeitpunkt die sofortige Ausführung der Aktionen nicht erlauben, wird das Spielaktionattribut des entsprechenden Spielers eingestellt und die Aktion zum passenden Zeitpunkt, z. B. nach einer Spielrunde durch die Methoden einstigSpieler(), setzePassiv() und verlassenSpieler() umgesetzt. Im folgenden werden die zur Spielsteuerung notwendigen Methoden näher erläutert. Die Methode starteSpiel() wird entweder aufgerufen, sobald der zweite Spieler dem Spiel beitritt oder eine Spielrunde durch die Methode beendeSpielRunde() beendet wurde und sich noch genügend Spieler am Tisch befinden. Durch die starteSpiel() Methode werden alle nötigen Einstellungen wie Position des Dealers und der Blinds, Verteilen der Pocket Cards an die aktiven Spieler und Bestimmen des Spielers, der die nächste Runde beginnt, vorgenommen. Außerdem wird die Methode starteTimer() aufgerufen, die den Aktionstimer startet, der nach einer vorgegebenen Zeit, in der keine Clientreaktion erfolgt, automatisch für den entsprechenden Spieler checkt oder passt. Dadurch wird vermieden, dass sich das Spiel aufhängt, wenn keine Clientreaktion erfolgt. Alle Spieldaten werden in einem SpielDaten Objekt zusammengefasst und an den Client übertragen. Ist eine Wettrunde beendet, wird die Methode naechsteWettrunde() aufgerufen. Diese Methode gibt, abhängig von der aktuellen Runde, entweder den Flop, die Turnkarte oder die Riverkarte aus und bestimmt den Spieler, der als nächstes an der Reihe ist. Weiterhin wird der Aktionstimer gestartet und das Versenden der aktualisierten Spieldaten an die Clients veranlasst. Sobald die letzte Bietrunde beendet ist, wird die Methode ermittleGewinner() aufgerufen und mit Hilfe der Klasse KartenEinstufung die beste Pokerhand ermittelt. Sollten ein oder mehrere Spieler gleichwertige Hände halten, wird der Pot geteilt. Außerdem werden etwaige Splitpots berücksichtigt, so dass nur Spieler den Pot gewinnen können, die auch dazu berechtigt sind. Die Spieldaten werden wiederum aktualisiert und an die Clients übertragen. Danach wird zeitverzögert eine neue Spielrunde gestartet. Klasse Blatt: Durch diese Klasse wird ein Blatt Karten bestehend aus einer oder mehreren Karten repräsentiert. Die Klasse bietet die Methoden enthaeltPaar(), enthaeltDrilling(), enthaeltVierling(), enthaeltStrasse() und enthaeltFlush(), um die entsprechenden Pokerklassifizierungen zu identifizieren. Diese Methoden geben true zurück, wenn ein entsprechende Klasse 36 3.1. SERVER gefunden wurde und legen die dazugehörigen Karten im gleichnamigen Attribut ab. Darüber hinaus bietet diese Klasse die Methoden holeHoheKarten() und holeHoheKarten(int) an, die die höchste oder eine gewisse Anzahl von hohen Karten zurückgeben. Dazu werden die übergebenen Karten mit Hilfe der Methode sortieren() in absteigende Reihenfolge gebracht. Klasse KartenEinstufung: Diese Klasse bestimmt aus einer Menge von mindestens fünf Karten die besten fünf und deren Rang durch Anwendung der Methoden der Klasse Blatt. Die Objekte dieser Klasse können miteinander verglichen werden, um die beste Pokerhand zu ermitteln. Klasse SpielDaten: Die gesamten Spieldaten des Pokerspiels werden in dieser Klasse zusammengefasst. Dazu gehören die Spieler, dessen Daten in Form von SpielerSpielDaten-Objekten erfasst werden, die Karten des Flops, die Turn- und Riverkarte, der Pot, die Spielernummer des Dealers, die Gewinnerkarten und der Spielstatus. Der Spielstatus gibt an, welche Spieleraktionen als nächstes möglich sind: checken oder setzen (SpielStatus.CHECKENSETZEN), mitgehen oder erhöhen (SpielStatus.MITGEHENERHOEHEN) oder nur mitgehen (SpielStatus.MITGEHEN), wobei passen immer möglich ist. Paket: de.aufjeden.poker.spieler Im Paket Spieler befinden sich die Klassen, die die Spielerdaten repräsentieren. Klasse Spieler: Diese Klasse beschreibt einen Spieler mit seinem Namen und seiner Menge an Geld. Die Klasse bietet mit Hilfe der Methoden parseSpielerNodeList(NodeList) und getSpielerElement(Document) die Möglichkeit, eine Nodelist, die die Daten eines Spielerobjekts beinhalten, zu parsen oder ein XML Element eines Spielerobjekts zu erzeugen. Außerdem werden Getterund Settermethoden angeboten, um auf die Attribute zuzugreifen. Die Klasse Spieler dient als Oberklasse und wird von folgenden Klassen, die sie um weitere Attribute ergänzen, implementiert. Klasse SpielerDaten: Durch diese Klasse werden die allgemeinen Daten eines Spielers repräsentiert. Neben dem Namen und der Geldmenge, die durch die Oberklasse geerbt werden, kommt noch ein Attribut für die Höhe des Kredits des Spielers hinzu. Die Methoden parseSpielerNodeList(NodeList) und getSpielerElement(Document) werden dahingehend erweitert, dass das neue Attribut ebenfalls berücksichtigt wird. Klasse SpielerSpielDaten: Befindet sich ein Spieler im Spiel, werden seine Daten durch diese Klasse dargestellt. Die Grundattribute für den Namen und das Geld werden von der Oberklasse geerbt und es kommen weitere, spielrelevante hinzu. So werden nun auch der Einsatz des Spielers, die Spieleraktion, der Spielerstatus und die Spielaktion erfasst. Die Spieleraktion gibt die letzte Handlung an, die ein Spieler 37 KAPITEL 3. UMSETZUNG 1.1, spieler Spieler +Spieler +Spieler +getSpielerElement:Element +parseSpielerNodeList:void +addGeld:void geld:int name:String SpielerSpielDaten SpielerDaten +SpielerSpielDaten +SpielerDaten +SpielerSpielDaten +getSpielerElement:Element +parseSpielerNodeList:void +resetHand:void +setKarte:void +SpielerDaten +getSpielerElement:Element +parseSpielerNodeList:void kredit:int +addEinsatz:void +subEinsatz:void aktion:SpielerAktion einsatz:int status:SpielerStatus spielAktion:SpielAktion zeigen:boolean Abbildung 3.4.: Klassendiagramm: Spieler (de.aufjeden.poker.spieler) ausgeführt hat. Es werden die Aktionen passen (SpielerAktion.PASSEN), checken, setzen, mitgehen, erhöhen, keine und all in (SpielerAktion.ALLIN) unterschieden. Im Attribut status wird der aktuelle Spielerstatus des Spielers gespeichert. Es werden frei (SpielerStatus.FREI), passiv, aktiv, am Zug (SpielerStatus.AMZUG) und passen unterschieden. Wobei frei einen freien Platz kennzeichnet, passiv einen Spieler anzeigt, der zwar am Tisch sitzt, aber nicht mitspielt, aktiv einen sich aktiv im Spiel befindlichen Spieler markiert, am Zug den aktiven Spieler anzeigt, der an der 1.1, spieler Reihe ist und passen einen aktiven Spieler kennzeichnet, der aber in dieser Runde bereits gepasst hat. 38 3.2. CLIENT 3.2. Client 3.2.1. Anforderungen Auf der Clientseite sollen Klassen und Methoden zur Verfügung gestellt werden, die die Verbindung zum Server realisieren und eine einfache Entwicklung von Clients und Bots ermöglichen. Des Weiteren soll ein grafischer Client bereitgestellt werden, der die Funktionen des Pokerservers umsetzt und somit das Pokerspielen auf dem Server ermöglicht. 3.2.2. Entwurf Im Paket Client befindet sich die Schnittstelle, die von allen Clients und Bots implementiert werden muss, eine Klasse für die Verbindung und Kommunkikation mit dem Pokerserver, ein Administrationsclient und der grafische Pokerclient in Form eines Applets. Eine Abbildung der Oberfläche des Clients findet sich im Anhang A.1. Klasse PokerClientInterface: Diese Schnittstelle muss von allen Clients und Bots implementiert werden, die die PokerServerVerbindung Klasse nutzen wollen. Dadurch wird sichergestellt, dass der Client oder Bot die benötigten Methoden zur Verarbeitung der vom Pokerserver verschickten Daten zur Verfügung stellt. Klasse PokerServerVerbindung: Diese Klasse regelt die Verbindung zum Pokerserver, sowie den Datenaustausch zwischen Pokerserver und Client. Sobald eine Verbindung zum Server hergestellt ist, werden die vom Pokerserver gesendeten Nachrichten entgegen genommen und je nach Nachrichtenart an die entsprechenden Methoden des Clients weitergeleitet. Klasse PokerClient: Der Pokerclient stellt mit Hilfe der PokerServerVerbindung die Funktionen des Pokerservers zur Verfügung. Es handelt sich hierbei um eine grafische Benutzungsschnittstelle in Form eines Applets. Klasse PokerServerAdmin: Die Klasse PokerServerAdmin ermöglicht administrative Zugriffe, wie das Herunterfahren des Pokerservers über das Internet. 3.3. Bots 3.3.1. Anforderungen Die Bots sollen selbstständig Limited Texas Hold’em spielen können. Zu diesem Zweck sollen sie in der Lage sein, ihre Starthand, sowie in den folgenden Spielrunden ihre aktuelle Hand zu bewerten. Des Weiteren soll es möglich sein, die Bots auf eine der in Abschnitt 2.3.1 aufgezeigten Spielweisen einzustellen. Damit das Spiel der Bots nicht zu 39 KAPITEL 3. UMSETZUNG 1.1, client JApplet ActionListener Thread PokerServerVerbindung PokerClient PokerServerAdmin -psv:PokerServerVerbindung -PORT:int -HOST:String +PokerClient -in:BufferedReader -login:boolean -out:PrintStream +actionPerformed:void +destroy:void -enableButtons:void -erstelleNachricht:void +hideButtons:void -pci:PokerClientInterface -socket:Socket -spieldaten:SpielDaten -thread:Thread -verbindung:boolean +main:void +PokerServerAdmin +betrittTisch:void +verarbeiteChatNachricht:void +verarbeiteFehlerNachricht:void +init:void -initKartenIcons:void -initSpielerPanel:void +verarbeiteLogin:void +verarbeiteSpieldaten:void -amzug:boolean -spielerNummer:int -serverNachricht:Nachricht -spielerName:String -tischnummer:int +verarbeiteSpieldaten:void +verarbeiteSpielerDaten:void +verbindungHergestellt:void +verbindungNichtHergestellt:void +verbindungVerloren:void +verbindungHergestellt:void +verbindungNichtHergestellt:void +verbindungVerloren:void +verarbeiteChatNachricht:void +createStyles:void +PokerServerVerbindung +run:void +sendeNachricht:void +betrittTisch:void +verlaesstTisch:void +verarbeiteSpielerDaten:void +verarbeiteFehlerNachricht:void +verarbeiteShutdown:void +verlaesstTisch:void +verarbeiteLogin:void +verarbeiteShutdown:void interface PokerClientInterface +verarbeiteLogin:void +verarbeiteSpieldaten:void +verarbeiteChatNachricht:void +betrittTisch:void +verlaesstTisch:void +verarbeiteSpielerDaten:void +verbindungHergestellt:void +verbindungNichtHergestellt:void +verbindungVerloren:void +verarbeiteFehlerNachricht:void +verarbeiteShutdown:void Abbildung 3.5.: Klassendiagramm: Client (de.aufjeden.poker.client) vorhersehbar wird, sollen ihre Spielaktionen nicht nach einem festgelegten Muster erfolgen, sondern aufgrund von gewichteten Wahrscheinlichkeiten. Dadurch wird ein Bot in derselben Spielsituation nicht unbedingt immer dasselbe Verhalten zeigen. 3.3.2. Entwurf Im Paket Bot befinden sich die für die Spielsteuerung der Bots notwendigen Klassen. 1.1, client Klasse Bot: Diese Klasse repräsentiert einen Pokerbot, d. h. einen bestimmten computergesteuerten Gegner. Durch diese Klasse werden alle grund- 40 3.3. BOTS 1.1, bot PokerClientInterface Bot -HOST:String -PORT:int -spielernummer:int -name:String -passwort:String -tischnummer:int -bigblind:int -psv:PokerServerVerbindung -spielDaten:SpielDaten -headsupLA:boolean -verzoegert:boolean -random:boolean +main:void +Bot +verarbeiteChatNachricht:void +verarbeiteFehler:void +verarbeiteLogin:void +verarbeiteRegistrierung:void +verarbeiteShutdown:void +verarbeiteSpielDaten:void +verarbeiteSpielerDaten:void +verarbeiteTischBetretenNachricht +verbindungHergestellt:void +verbindungNichtHergestellt:void +verbindungVerloren:void +verlaesstTisch:void Blatt PotOdds BotBlatt +enthaeltFlushDraw:boolean +enthaeltStraightDraw:boolean +enthaeltTischflushdraw:boolean +enthaeltTischstraightdraw:boolean openEnded:boolean -outs:int -pot:int -einsatz:int -turn:boolean +PotOdds +berechnen:void +mitgehen:boolean potOdds:double KartenEinstufung BotKartenEinstufung Wahl -botBlatt:BotBlatt -tischBlatt:BotBlatt -debug:boolean -wahrscheinlichkeit:double[] +zaehleOvercards:int +zaehlePocketGenutzt:int +getWert:int -normkumsum:void +toString:String +addWahl:void +setWahl:void +setDefault:void kicker:Karte +Wahl +Wahl +reset:void Hutchison zufallsWahl:int -position:SpielPosition +berechne:void typ:SpielTyp zahlenwert:int Abbildung 3.6.: Klassendiagramm: Bot (de.aufjeden.poker.bot) legenden Funktionen des Bots gesteuert, wie das Einloggen und Betreten eines Tisches. Außerdem werden die Spieleraktionen des Bots abhängig von der aktuellen Spielsituation gesteuert. Je nach eingestelltem Spieltyp, SpielTyp.LOOSEPASSIVE, SpielTyp.LOOSEAGGRESSIVE, SpielTyp.TIGHTPASSIVE oder SpielTyp.TIGHTAGGRESSIVE, variiert die Entscheidung des Bots, so dass loose eingestellte Bots z. B. mehr Hände spielen, als tight eingestellte. Klasse Hutchison: Mit Hilfe dieser Klasse lässt sich anhand des in Abschnitt 2.3.1 dargestellten Hutchinson-Punktesystems einer Starthand ein Zahlenwert zuordnen, der als Entscheidungshilfe für die Aktion eines Bots vor dem Flop dient. Dazu kann die Starthand als Liste und die Spielpostion (SpielPosition.FRUEH, oder SpielPosition.SPAET) übergeben und der entspre1.1,SpielPosition.MITTEL bot chend berechnete Zahlenwert durch die Methode getZahlenwert() abgefragt werden. 41 KAPITEL 3. UMSETZUNG Klasse Wahl: Die Klasse Wahl beschreibt eine bestimmte Anzahl von gewichteten Wahlmöglichkeiten. Mit Hilfe dieser Klasse kann eine dieser Wahlmöglichkeit zufällig ausgewählt werden. Ein Objekt dieser Klasse wird entweder, durch eine Anzahl von Wahlmöglichkeiten oder ein Array, das die Gewichtung jeder Wahl enthält, erzeugt. Die Methoden setWahl(int, double) bzw. addWahl(int, double) stellen die Gewichtung der entsprechenden Wahlmöglichkeit ein bzw. erhöhen oder erniedrigen diese. Die Methode getZufallsWahl() liefert die Nummer, der zufällig bestimmten Wahlmöglichkeit, wobei höher gewichtete mit einer größeren Wahrscheinlichkeit gewählt werden, als niedrig gewichtete. Wahlmöglichkeiten mit einer Gewichtung von Null werden niemals gewählt. Klasse PotOdds: In dieser Klasse können die in Abschnitt 2.3.1 vorgestellten Pot Odds berechnet werden. Dazu wird die Klasse mit der Anzahl der Outs, der Potgröße, des zu leistenden Einsatzes und einem Wert, der anzeigt, ob sich die Turnkarte bereits ausgeteilt wurde, aufgerufen. Als Ergebnis liefert die Klasse mit Hilfe der Methode getPotOdds() den Betrag, den der Spieler maximal mitgehen sollte. Außerdem ist es möglich durch die Methode mitgehen() direkt einen Boolean-Wert abzufragen, der anzeigt, ob der Spieler weiter mitgehen sollte oder nicht. Klasse BotBlatt: Die Klasse BotBlatt erweitert die Klasse Blatt um die Methoden enthaeltFlushDraw() und enthaeltStraightDraw(), um das übergebene Blatt auf einen Flush bzw. Straight Draw zu testen. Die Methode enthaeltStraightDraw() testet zusätzlich auf einen Open Ended Straight Draw und speichert das Ergebnis in der Variable openEnded. Die Methoden enthaeltTischstraightdraw() und enthaeltTischflushdraw() testen, ob die Community Cards die Bildung einer Straße oder eines Flushs ermöglichen. Klasse BotKartenEinstufung: Diese Klasse ist von der Klasse KartenEinstufung abgeleitet und erweitert die Oberklasse um die Methoden zaehleOverCards(), die bei einem Paar die Anzahl der Höheren Karten auf dem Tisch zurückgibt und zaehlePocketGenutzt(), die die Anzahl der Pocket Cards zurückgibt, die z. B.zur Bildung eines Drillings genutzt werden. Die Methode getWert() gibt einen der Stärke der Hand entsprechenden Zahlenwert zurück. Wie sich dieser Wert zusammensetzt, wird im Folgenden näher betrachtet. 3.3.3. Kartenbewertung Zur Bewertung der aktuell gehaltenen Hand dient ein Punktesystem, das den Bot bei der Wahl seiner nächsten Spielaktion unterstützt. Die Bestimmung des Handwerts erfolgt durch folgende Schritte: 1. Bestimmung des Grundwerts der Hand mit Hilfe der in Tabelle 3.1 aufgelisteten Zahlenwerte. 2. Einbeziehung der bisherigen Erhöhungen: 42 3.3. BOTS • Eine: -4 • Zwei: -10 • Drei: -15 • Vier: -20 3. Berücksichtigung der genutzten Pocket Cards: • Keine: -80 % • Eine: -15 % (außer bei einem Paar) • Zwei: keine Veränderung 4. Wenn kein Flush oder besser gehalten wird, die Riverkarte noch nicht ausgeteilt wurde und der bisherige Kartenwert kleiner als 25 ist, werden evtl. gehaltene Draws nach dem Schema in Abbildung 3.7 bewertet. 5. Wenn kein Flush oder besser gehalten wird oder vor dem River kein Flush Draw gehalten wird, werden mögliche Straight oder Flush Draws nach dem Schema in Abbildung 3.8 berücksichtigt. Der ermittelte Wert der Hand bestimmt die Gewichtung der Spielaktion des Bots. Je nach Spielweise des Bots unterscheidet sich die Verarbeitung des Werts (siehe Tabelle 3.2). Beispiel 1: Der Bot hält als Starthand A♣-9♣ und im Flop kommt A♣-4♥-10♣. Ein Gegenspieler setzt. Der Grundwert der Hand errechnet sich laut Tabelle 3.1 aus einem Paar ohne Overcards zu 45. Da es eine Erhöhung gab, wird der Wert um 4 auf 41 erniedrigt. Der Flushdraw des Bots wird nicht berücksichtigt, da der Handwert über 25 liegt. Die Community Cards erlauben weder die Bildung einer Straße, noch eines Flushs, so dass dies ebenfalls nicht berücksichtigt werden muss. Der Handwert ergibt sich also zu 41. Je nach Spielweise des Bots ergibt sich die Gewichtung der Spielaktion daher folgendermaßen. Ein loose-passiver oder tight-passiver Bot würde mit hoher Wahrscheinlichkeit mitgehen, während ein loose-agressiver oder tight-agressiver Bot mit hoher Wahrscheinlichkeit erhöhen würde. Beispiel 2: Der Bot hält als Starthand A♠-K♣ und im Flop kommt K♦-J♥-10♣. Es wurde bereits einmal gesetzt. Der Grundwert der Hand ergibt sich zu 50, da es keine Overcards gibt und der Bot ein Ass als Kicker hält. Es gab eine Erhöhung, so dass sich der Wert auf 46 erniedrigt. Der Straight Draw des Bots wird nicht berücksichtigt. Da die Community Cards eine Straße mit Hilfe von zwei weiteren Karten ermöglicht reduziert sich der Handwert um acht auf 38. Ein loose-agressiver Bot würde mit hoher Wahrscheinlichkeit erhöhen, während Bots anderer Spieltypen höchstwahrscheinlich nur mitgehen würden. 43 KAPITEL 3. UMSETZUNG Hand Zusatz Paar Anzahl Overcards 0 1 >2 Kicker A. . . J 5. . . 2 Zwei Paare inkl. Pocket Paar eine Pocket Card genutzt zwei Pocket Cards genutzt Wert +45 +25 +15 +5 -10 +35 +30 +50 Drilling +55 Straße Pocket Card = höchste Karte Pocket Card = niedrigste Karte +60 +10 -10 Pocket Card = höchste Karte Pocket Card = niedrigste Karte +65 +10 -10 Flush > Flush +80 Tabelle 3.1.: Bewertungsystem der aktuell gehaltenen Hand. 3.3.4. Implementierung eines Bots In diesem Abschnitt soll an einem einfachen Beispiel die Implemetierung eines Bots mit Hilfe des PokerClientInterface und der PokerServerVerbindung aufgezeigt werden. Der Bot wählt seine Spielaktionen zufällig; es erfolgt keine Einschätzung des gehaltenen Blattes. Der vollständige Quelltext befindet sich im Anhang (A.1). Login Zu Beginn loggt sich der Bot beim Pokerserver ein, indem er eine LoginNachricht mit Name und Passwort über die PokerServerVerbindung an den Server übermittelt: 45 t h i s . psv . s e n d e N a c h r i c h t (new L o g i n N a c h r i c h t ( name , p a s s w o r t ) ) ; 44 3.3. BOTS Spielweise Checken oder Passen Loose-passive Loose-agressive Tight-passive Tight-agressive ≤ 10 ≤ 10 ≤ 20 ≤ 20 Mitgehen Setzen oder Erhöhen 11. . . 50 11. . . 34 21. . . 50 21. . . 40 ≥ 51 ≥ 35 ≥ 51 ≥ 41 Tabelle 3.2.: Spieleraktion anhand des ermittelten Handwerts. Abbildung 3.7.: Bewertung einer drawing Hand. Auswerten des Loginstatus und Betreten des Tisches Der Server schickt seine Antwort an die PokerServerVerbindung, die den Loginstatus an den Bot übermittelt, indem die Methode verarbeiteLogin(LoginStatus status) aufgerufen wird. War das Einloggen erfolgreich (LoginStatus.ERFOLGREICH), kann der Bot einen Tisch betreten. Dazu erzeugt er eine TischBetretenNachricht und verschickt sie an den Server: 139 140 t h i s . psv . s e n d e N a c h r i c h t (new T i s c h B e t r e t e n N a c h r i c h t ( tischnummer , T i s c h B e t r e t e n S t a t u s . SPIELEN ) ) ; 45 KAPITEL 3. UMSETZUNG Abbildung 3.8.: Einbeziehung möglicher Straßen oder Flushs Auswerten des Tischstatus und am Spiel teilnehmen Als Reaktion auf die versendete TischBetretenNachricht schickt der Server ebenfalls eine TischBetretenNachricht zurück, die von der PokerServerVerbindung an die Methode verarbeiteTischBetretenNachricht(TischBetretenNachricht tbn) des Bots weitergeleitet wird. Wenn das Betreten des Tisches erfolgreich war (TischBetretenStatus.ERFOLGREICH), speichert der Bot die zugewiesene Spielernummer im entsprechenden Attribut: 116 t h i s . s p i e l e r n u m m e r = tbn . getSpielerNummer ( ) ; Nun kann der Bot am Spiel teilnehmen. Hierfür schickt er eine entsprechende SpielerAktionNachricht über die PokerServerVerbindung an den Server: 117 t h i s . psv . s e n d e N a c h r i c h t (new S p i e l e r A k t i o n N a c h r i c h t ( S p i e l e r A k t i o n .TEILNEHMEN ) ) ; 46 3.4. KOMMUNIKATION Verarbeiten der Spieldaten und Spielersimulation Nachdem der Bot dem Spiel beigetreten ist, werden die SpielDaten vom Server verschickt, sobald sich die Spielsituation verändert. Die PokerServerVerbindung leitet die SpielDaten an die Methode verarbeiteSpieldaten(SpielDaten spielDaten) des Bots weiter. Wenn der Bot an der Reihe ist, erfolgt eine an den aktuellen Spielstatus angepasste Reaktion. Die Abfrage, ob der Spieler an der Reihe ist, wird durch folgende Zeile realisiert: 63 64 i f ( spielDaten . g e t S p i e l e r ( this . spielernummer ) . getStatus ( ) == S p i e l e r S t a t u s .AMZUG) Je nach Spielstatus erfolgt eine zufällige, d. h. eine von den Karten des Bots unabhängige, Reaktion: • SpielStatus.CHECKENSETZEN: Der Bot checkt (SpielerAktion.CHECKEN) mit einer Wahrscheinlichkeit von 60 % und setzt ansonsten (SpielerAktion.SETZEN). • SpielStatus.MITGEHENERHOEHEN: Der Bot passt mit einer Wahrscheinlichkeit von 10 %, erhöht den Einsatz mit einer Wahrscheinlichkeit von 20 % und geht ansonsten mit. • SpielStatus.MITGEHEN: Der Bot passt mit einer Wahrscheinlichkeit von 10 % und geht ansonsten mit. Die gewählte SpielAktion schickt der Bot nach einer zufälligen Wartezeit über die PokerServerVerbindung an den Server: 91 try { 92 Thread . s l e e p (new Double ( Math . random ( ) ∗ 5 0 0 0 ) . i n t V a l u e ( ) ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { e . printStackTrace ( ) ; } t h i s . psv . s e n d e N a c h r i c h t ( s p i e l e r A k t i o n ) ; 93 94 95 96 3.4. Kommunikation 3.4.1. Anforderungen Die Kommunikation zwischen Client und Server soll mit Hilfe von XML-Nachrichten erfolgen. Hierfür sollen Klassen und Methoden zur Verfügung gestellt werden, um auf einfache Weise Nachrichtenobjekte zu erstellen und in XML-Strings umzuwandeln, sowie übertragene XML-Strings wieder in die entsprechenden Nachrichtenobjekte umzuwandeln. 3.4.2. Entwurf Das Paket Kommunikation beinhaltet alle Klassen, die die Kommunikationsdaten für den Austausch von Daten zwischen Client und Server repräsentieren. 47 KAPITEL 3. UMSETZUNG 1.1, kommunikation ShutdownNachricht SpielerDatenNachricht SpielDatenNachricht +ShutdownNachricht +ShutdownNachricht +getNachrichtElement:Element +SpielerDatenNachricht +SpielerDatenNachricht +getNachrichtElement:Element +SpielDatenNachricht +SpielDatenNachricht +getNachrichtElement:Element +parseNachrichtNodeList:void +parseNachrichtNodeList:void +parseNachrichtNodeList:void status:ShutdownStatus spielerDaten:SpielerDaten spielDaten:SpielDaten SpielerAktionNachricht TischBetretenNachricht Nachricht -attribute1:int +SpielerAktionNachricht +SpielerAktionNachricht +SpielerAktionNachricht +Nachricht +Nachricht +toXMLString:String +TischBetretenNachricht +TischBetretenNachricht +TischBetretenNachricht +getNachrichtElement:Element +parseNachrichtNodeList:void +parseNachrichtNodeList:void +parseXMLString:void +getNachrichtElement:Element +kodiereSonderzeichen:String +dekodiereSonderzeichen:String spielerNummer:int status:TischBetretenStatus typ:Typ name:String tischNummer:int TischeNachricht +getNachrichtElement:Element +parseNachrichtNodeList:void aktion:SpielerAktion ChatNachricht +ChatNachricht +ChatNachricht +getNachrichtElement:Element +TischeNachricht +getNachrichtElement:Element +parseNachrichtNodeList:void +parseNachrichtNodeList:void text:String LoginNachricht RegistrierenNachricht +LoginNachricht +LoginNachricht +LoginNachricht +RegistrierenNachricht +RegistrierenNachricht +RegistrierenNachricht +getNachrichtElement:Element +parseNachrichtNodeList:void +getNachrichtElement:Element +parseNachrichtNodeList:void passwort:String status:LoginStatus passwort:String status:RegistrierenStatus Abbildung 3.9.: Klassendiagramm: Kommunikation (de.aufjeden.poker.kommunikation) Klasse Nachricht: Diese Klasse ist die Oberklasse für alle Nachrichten, die zwischen 1.1, kommunikation Server und Client ausgetauscht werden. Von ihr werden alle weiteren speziellen Nachrichten abgeleitet. Eine Nachricht besteht aus dem Namen des Spielers, der Tischnummer und dem 48 3.4. KOMMUNIKATION Nachrichttyp. Anhand des Nachrichttyps kann der Empfänger ermitteln, wie die enthaltenen Daten weiter zu verarbeiten sind. Die Klasse Nachricht stellt Methoden zum Erzeugen eines XML-Strings sowie zum Parsen eines XML-Strings, der die Daten der Nachricht enthält, zur Verfügung. Klasse LoginNachricht: Durch diese Klasse wird die Oberklasse Nachricht um ein Passwort und den Loginstatus erweitert. Der Status zeigt entweder an, ob das Einloggen erfolgreich war oder gibt an, wo ein Fehler aufgetreten ist. Klasse RegistrierenNachricht: Durch diese Klasse kann eine Nachricht zum Registrieren eines Spielers erzeugt werden. Sie erweitert die Oberklasse um ein Passwort und den Status der Registrierung, der anzeigt ob der Vorgang erfolgreich abgeschlossen wurde oder ein Fehler aufgetreten ist. Klasse SpielerDatenNachricht: Diese Klasse erweitert die Oberklasse durch ein Objekt der Klasse SpielerDaten. Klasse TischeNachricht: Durch diese Klasse wird die Oberklasse um eine Liste von Tisch Objekten erweitert. Klasse TischBetretenNachricht: Diese Klasse erweitert die Oberklasse Nachricht um die Spielernummer des Spielers am Tisch und einen Status. Der Status gibt an, ob der Spieler mitspielen oder zuschauen möchte, wenn die Nachricht vom Client versendet wird und ob das Betreten des Tisches erfolgreich war oder der Tisch bereits voll ist, wenn die Nachricht vom Server versendet wird. Klasse SpielDatenNachricht: Diese Klasse wird benutzt um ein SpielDaten Objekt zu verschicken. Dazu wird die Oberklasse um ein solches Objekt erweitert. Ein Beispiel für eine XML-Struktur dieses Nachrichtentyps findet sich im Anhang A.2. Klasse SpielerAktionNachricht: Mit Hilfe dieser Klasse können Spieleraktionen des Clients übermittelt werden. Dazu wird die Oberklasse um eine Aktion (z. B.: checken, passen oder mitgehen) und die Höhe des Einsatzes erweitert. Klasse ChatNachricht: Durch diese Klasse wird die Oberklasse um das Attribut text erweitert, das den Text des Chats enthält. Klasse ShutdownNachricht: Diese Klasse erweitert die Oberklasse um einen Status, der den aktuellen Shutdown Status anzeigt. Dadurch können einzelne Clients über einen Shutdown informiert oder beendet werden. 49 KAPITEL 4. BOT STATISTIK 4. Bot Statistik In diesem Kapitel sollen die verschiedenen Spielweisen (siehe Abschnitt 2.3.1) der Bots statistisch ausgewertet werden. Es werden jeweils zwei loose-agressive (LA), loose-passive (LP), tight-aggressive (TA) und tight-passive (TP) Bots eingesetzt. Zusätzlich dazu werden zwei Bots eingesetzt, die zufällig zwischen den vier verschiedenen Spielweisen wechseln (ZU). Im ersten Teil wird ein kurzer Spielzeitraum von 500 Runden betrachtet; im zweiten Teil wird der Erfolg der Bots auf längere Sicht, d. h. über 20000 Spielrunden, ausgewertet. Abschließend spielen die Bots im dritten Teil ein Turnier, das erst endet, wenn ein Bot sämtliche Chips gewonnen hat. Die verschiedenen Testszenarien wurden mehrmals wiederholt, wobei sich jeweils ähnliche Ergebnisse zeigten, wie in den nachfolgend aufgeführten Beispielen. Abweichende Ergebnisse werden in Abschnitt 4.4 näher betrachtet. 4.1. Kurzer Spielzeitraum In dieser Testumgebung spielen die Bots 500 Runden fixed Limit Poker. Die Blinds liegen bei 5/10 und bleiben über die gesamte Spieldauer unverändert. Zu Beginn des Spiels erhält jeder der zehn Bots ein Startkapital von 2500 Chips. Die Ergebnisse sind in Tabelle 4.1 und Abbildung 4.1 zusammengefasst und dienen als Grundlage für die nachfolgenden Betrachtungen. 4.1.1. Beschreibung Loose-aggressive Bots Nach 128 Spielrunden scheidet LA 1 aus. Er spielte ca. 84 % der Spiele und gewann ca. 13 % dieser. LA 2 spielte 88 % der Spiele, schied im Gegensatz zu LA 1 nicht aus, sondern hatte am Ende der 500sten Runde die drittmeisten Chips. Er gewann ca. 25 % seiner Spiele. Am Verlauf der Chipsanzahl lässt sich erkennen, dass LA 2 zu Beginn des Spiels, bis zur etwa 70sten Runde, große Menge an Chips gewann und kurzzeitig die Führung übernahm. Ab der 220sten Runde lässt sich ein leichter Abwärtstrend erkennen. 50 4.1. KURZER SPIELZEITRAUM Spieltyp Rundenanzahl gespielt gewonnen %-gespielt %-gewonnen LA 1 LA 2 LP 1 LP 2 ZU 1 ZU 2 TA 1 TA 2 TP 1 TP 2 128 500 384 293 500 500 500 500 500 500 108 440 330 258 314 336 187 176 171 165 14 112 56 39 71 75 49 36 35 32 84,38 88 85,94 88,05 62,8 67,2 37,4 35,2 34,2 33 12,96 25,45 16,97 15,12 22,61 22,32 26,2 20,45 20,47 19,39 Tabelle 4.1.: Spielverlauf (500 Spielrunden) 8000 7000 6000 LA_1 LA_2 LP_1 LP_2 ZU_1 ZU_2 TA_1 TA_2 TP_1 TP_2 Chips 5000 4000 3000 2000 1000 0 0 100 200 300 400 500 Runde Abbildung 4.1.: Spielverlauf (500 Spielrunden) Loose-passive Bots Beide loose-passiven Bots sind vor Ende der 500 Runden ausgeschieden. Der Bot LP 1 spielte 86 % der Runden und gewann ca. 16,97 %. Der zweite Bot LP 2 hat mit 88 % gespielten und 15 % gewonnenen Spielen ähnliche Werte. Anhand des Chipverlaufs lässt sich erkennen, dass beide Bots fast ausschließlich Verluste machten. 51 KAPITEL 4. BOT STATISTIK Tight-aggressive Bots Der erste tight-aggressive Bot (TA 1) belegte am Ende der Spielzeit den zweiten Platz. Er hat 37 % der Spiele gespielt und 26 % dieser Spiele gewonnen. Es ist fast ausschließlich ein Aufwärtstrend in der Chipsmenge zu erkennen. Ähnliches lässt sich bei TA 2 erkennen, der am Ende den vierten Platz belegt. Tight-passive Bots Die Chipsmenge der tight-passiven Bots blieb über die gesamte Spieldauer relativ konstant. Beide Bots spielten ca. 35 % der Spiele und gewannen etwa 20 %. Am Ende der Spielzeit liegt TP 1 auf dem fünften Platz, während TP 2 mit den wenigsten Chips auf dem siebenten Platz liegt. Bots mit zufälliger Spielweise Am Ende der 500sten Spielrunde liegt ZU 1 auf dem vorletzten Platz, während ZU 2 mit deutlichem Abstand auf dem ersten Platz liegt. Beide Bots spielten etwa 65 % der Spiele und gewannen etwa 22 % davon. Zwischen Spielrunde 60 und 140 konnte ZU 2 sein Startkapital fast verdreifachen. 4.1.2. Interpretation Loose-aggressive Bots Die loose-aggressiven Bots sind stark abhängig von den Karten, die sie bekommen, da sie fast alle Hände spielen. Sie erhöhen auch mit schlechteren Händen, so dass sie schnell viel Geld gewinnen, aber auch schnell viel Geld verlieren können. Dadurch lässt sich das unterschiedliche Abschneiden der Bots erklären. Der erste losse-aggressive Bot LA 1 gewann kaum ein Spiel, während LA 2 gerade in der Anfangsphase viele Spiele gewinnen konnte. Loose-passive Bots Beide Bots haben über die gesamte Spieldauer fast keine Gewinne gemacht. Das liegt vor allem daran, dass sie selbst wenn sie starke Hände halten, selten setzen oder erhöhen. Wie die losse-aggressiven Bots sind sie stark abhängig von guten Karten, da sie fast alle Hände spielen. 52 4.2. LANGER SPIELZEITRAUM Tight-aggressive Bots Die tight-aggressiven Bots spielen nur starke Starthände und setzen und erhöhen aggressiv, wenn sie eine starke Hand halten. Dadurch können sie aus einer guten Hand viel Profit schlagen. Bei schlechteren Händen gehen die tight eingestellten Bots fast nie eine Erhöhung mit, außer die Pot Odds sind günstig. Durch dieses Vorgehen werden Verluste, wie bei loose eingestellten Bots, minimiert. Das erklärt den fast ausschließlichen Aufwärtstrend der Chipsmenge. Tight-passive Bots Die tight-passiven Bots gewinnen über die gesamte Spieldauer nicht viel, verlieren aber auch nicht viel. Sie spielen, wie die tight-aggressiven Bots auch, nur starke Starthände, setzen oder erhöhen im Gegensatz dazu aber selten, selbst wenn sie starke Hände halten. Daher machen sie wenig Gewinn, auch wenn sie relativ viele Spiele gewinnen. Bots mit zufälliger Spielweise Die zufalläg spielenden Bots spielten und gewannen etwa gleich viele Runden. Trotzdem liegt am Ende der Simulation der erste der Bots auf dem vorletzten Platz, während der zweite mit großem Abstand auf dem ersten Platz liegt. Das hängt vor allem damit zusammen, dass ZU 2 am Anfang sehr viel gewonnen hat und dann die Chipsmenge relativ konstant halten konnte, während ZU 1 anfangs viel verlor und dann seine Chipsmenge ebenfalls konstant halten konnte. 4.2. Langer Spielzeitraum In diesem Abschnitt werden die Bots über einen längeren Zeitraum von 20000 Spielrunden betrachtet. Die Grundvoraussetzungen bleiben dieselben, d. h. die Bots spielen mit einem Startkapital von 2500 Chips und einem fixed Limit von 5/10, das sich über die gesamte Spieldauer nicht verändert. Die Ergebnisse sind in Tabelle 4.2 und Abbildung 4.2 zusammengefasst. 4.2.1. Beschreibung Loose-aggressive Bots Der erste loose-aggressive Bot (LA 1) scheidet nach 175 Runden aus, während LA 2 nach 1320 Runden ausscheidet. Der Bot LA 1 spielte 85 % der Runden und gewann ca. 15 % der gespielten Runden. Im Gegensatz dazu gewann LA 2 ca. 23 % der 89 % gespielten Runden. 53 KAPITEL 4. BOT STATISTIK Spieltyp Rundenanzahl gespielt gewonnen %-gespielt %-gewonnen LA 1 LA 2 LP 1 LP 2 ZU 1 ZU 2 TA 1 TA 2 TP 1 TP 2 175 1320 267 3174 18386 10209 20000 20000 12056 4644 149 1176 217 2833 13637 7122 9370 9451 4770 1693 22 270 36 715 6007 2486 4463 4504 1623 429 85,14 89,09 81,27 89,26 74,17 69,76 46,85 47,26 39,57 36,46 14,77 22,96 16,59 25,24 44,05 34,91 47,63 47,66 34,03 25,34 Tabelle 4.2.: Spielverlauf (20000 Spielrunden) 16000 14000 12000 LA_1 LA_2 LP_1 LP_2 ZU_1 ZU_2 TA_1 TA_2 TP_1 TP_2 Chips 10000 8000 6000 4000 2000 0 10 00 20 00 30 00 40 00 50 00 60 00 70 00 80 00 90 0 10 0 00 11 0 00 12 0 00 13 0 00 14 0 00 15 0 00 16 0 00 17 0 00 18 0 00 19 0 00 20 0 00 0 0 Runde Abbildung 4.2.: Spielverlauf (20000 Spielrunden) Loose-passive Bots Der erste loose-passive Bot (LP 1) hat nach 267 Runden seine gesamten Chips verspielt. Der zweite Bot (LP 2) konnte zwischenzeitlich über 6000 Chips gewinnen, verspielte den Gewinn aber wieder und beendete das Spiel nach der 3174sten Runde. Die Bots spielten 81 % bzw. 89 % der Runden und konnten 17 % bzw. 25 % der Spiele für sich entscheiden. 54 4.2. LANGER SPIELZEITRAUM Tight-aggressive Bots Anfangs mussten die tight-aggressiven Bots einige Verluste hinnehmen, aber etwa ab der 5000sten Runde stellte sich bis auf kleinere Schwankungen ein deutlicher Aufwärtstrend ein. Am Ende der Spielzeit waren nur noch diese beiden Bots im Spiel. Beide Bots spielten etwa 47 % der Spiele und gewannen ca. 48 % der gespielten Spiele. Tight-passive Bots Der erste tight-passive Bot (TP 1) gewann anfangs einige Spiele und konnte dann seine Chipsmenge relativ konstant halten. Ab etwa der 10000sten Spielrunde verlor er aber immer mehr Chips und schied in der 12056sten Runde aus. Der zweite Bot (TP 2) schied bereits nach 4644 Runden aus. Der Bot TP 1 spielte etwa 40 % der Runden und gewann ca. 34 %, während TP 2 von den ca. 36 % gespielten Runden etwa 25 % gewinnen konnte. Bots mit zufälliger Spielweise Die zufällig spielenden Bots gewannen anfangs viele Runden und konnten die Führung übernehmen. Allerdings konnten sie diesen Vorsprung nicht auf Dauer halten. So beendete ZU 1 das Spiel in der 18386sten Runde auf dem dritten Platz, wärend ZU 2 bereits in der 10209sten Runde auf Platz fünf ausschied. Der erste Bot ZU 1 konnte etwa 35 % von den 74 % gespielten Runden gewinnen. Der zweite Bot ZU 2 spielte 70 % der Runden, konnte aber nur etwa 35 % davon für sich entscheiden. 4.2.2. Interpretation Loose-aggressive Bots Die loose-aggressiven Bots schnitten auf lange Sicht nicht gut ab. Ihre Spielweise erzeugt zu starke Schwankungen zwischen Gewinnen und Verlusten, die nur durch ein großes Chippolster aufgefangen werden können. Das Problem der loosen Spielweise, dass zu viele Runden auch mit schlechteren Starthänden gespielt werden, zeigte sich in diesem Testszenario ziemlich deutlich. Loose-passive Bots Die loose-passiven Bots sind auf lange Sicht ebenfalls nicht sehr erfolgreich. Der erste Bot hat nach 267 Runden seine gesamten Chips verspielt. Der zweite Bot konnte zwar zwischenzeitlich über 6000 Chips gewinnen, aber verspielte den Gewinn durch die loose Spielweise wieder und beendete das Spiel nach der 3174sten Runde. 55 KAPITEL 4. BOT STATISTIK Tight-aggressive Bots Am Ende der 20000 Runden waren nur noch die Bots mit tight-aggressiver Spielweise im Spiel; auf lange Sicht setzte sich diese Spielweise am besten durch. Wie sich schon bei der Betrachtung des Erfolgs der Bots auf kurze Sicht zu erkennen war, stellte sich mit der Zeit ein deutlicher Aufwärtstrend in der Chipsmenge ein, da die tight-aggressiven Bots durch ihre Spielweise nur starke und aussichtsreiche Hände spielen. Tight-passive Bots Auch auf lange Sicht zeigt sich das Problem der rein passiven Spielweise, so konnte weder TP 1, noch TP 2 trotz einiger Gewinne genügend Kapital aus guten Händen schlagen. Zwar gelang es TP 1 über lange Zeit seine Chipsanzahl konstant zu halten, aber ein Aufwärtstrend zeichnete sich zu keiner Zeit ab. Bots mit zufälliger Spielweise Die zufällig spielenden Bots, konnten ihre anfängliche Führung auf Dauer nicht verteidigen. Sie spielten insgesamt nicht so viele Hände, wie die loose spielenden, aber mehr als die tight spielenden Bots. Das kam ihnen anfangs zugute, da sich viele unterschiedlich spielende Bots am Tisch befanden. Später, als nur noch tight spielende Bots im Spiel waren, wurde es jedoch zum Nachteil und beide Bots schieden aus. 4.3. Turnier In dieser Testumgebung spielen die Bots ein Turnier. Jeder Bot erhält 1500 Chips Startkapital und es wird fixed Limit Poker gespielt. Die Blinds liegen anfangs bei 10/20 und werden alle zehn Runden erhöht. Es wird so lange gespielt, bis ein Bot sämtliche Chips gewonnen hat. Die Ergebnisse dieser Testumgebung sind in Diagramm 4.3 und Abbildung 4.3 zusammengefasst. 4.3.1. Beschreibung Loose-aggressive Bots Der zweite Bot LA 2 scheidet bereits nach 31 Runden aus. Er gewann drei von seinen 26 gespielten Runden. Im Gegensatz dazu, gewann der erste Bot (LA 1) das Turnier. Er spielte 91 % der Runden und konnte 50 % davon gewinnen. Gleich zu Beginn übernahm LA 1 die Führung, musste sie aber ab der 50sten Runde wieder abgeben. Ab etwa der 175sten Runde hatte LA 1 wieder die meisten Chips und gewann trotz einiger größerer Schwankungen in der Chipsmenge letztendlich das Turnier. 56 4.3. TURNIER Spieltyp Rundenanzahl gespielt gewonnen %-gespielt %-gewonnen LA 1 LA 2 LP 1 LP 2 ZU 1 ZU 2 TA 1 TA 2 TP 1 TP 2 375 31 42 211 108 57 375 276 65 156 342 26 33 188 72 37 183 114 21 62 171 3 3 59 12 6 74 38 2 14 91,2 83,87 78,57 89,1 66,67 64,91 48,8 41,3 32,31 39,74 50 11,54 9,09 31,38 16,67 16,22 40,44 33,33 9,52 22,58 Tabelle 4.3.: Spielverlauf (Turnier) 16000 14000 12000 LA_1 LA_2 LP_1 LP_2 ZU_1 ZU_2 TA_1 TA_2 TP_1 TP_2 Chips 10000 8000 6000 4000 2000 0 0 50 100 150 200 250 300 350 -2000 Runde Abbildung 4.3.: Spielverlauf (Turnier) Loose-passive Bots Der erste loose-passive Bot (LP 1) schied bereits nach 42 Runden aus; er gewann drei der 33 gespielten Runden. Damit spielte LP 1 etwa 79 % der Runden, konnte aber nur 9 % für sich entscheiden. Der zweite Bot (LP 2) beendete das Turnier nach 211 Runden auf dem vierten Platz. Von den 89 % gespielten Runden, konnte LP 2 31 % gewinnen. 57 KAPITEL 4. BOT STATISTIK Tight-aggressive Bots Der Bot TA 1 gewann anfangs viele Spiele und konnte ab etwa der 50sten Runde die Führung übernehmen. Nachfolgend hielt TA 1 seine Chipsanzahl relativ konstant, bis sich nur noch LA 2 im Spiel befand. Ab der ca. 300sten Runde machte TA 1 fast nur noch Verlust und beendete das Turnier nach 375 Runden auf dem zweiten Rang. Er spielte 49 % der Runden und gewann etwa 40 % dieser Runden. Der zweite tight-aggressive Bot (TA 2) konnte 33 % der 41 % gespielten Runden für sich entscheiden. Anfangs hielt er seine Chipsmenge konstant, verlor dann bis zur 200sten Runde fast alle Chips, gewann danach noch einmal eine größere Menge an Chips und schied letztendlich in Runde 276 auf dem dritten Platz aus. Tight-passive Bots Die tight-passiven Bots schieden nach 65 bzw. 156 Runden aus. Der erste Bot TP 1 spielte 32 % der Runden und konnte 10 % davon gewinnen. Der zweite Bot TP 2 gewann 23 % der 62 gespielten Runden. Bots mit zufälliger Spielweise Der erste Bot ZU 1 schied in der 108ten Runde aus und konnte von den 67 % gespielten Runden 17 % für sich entscheiden. Der zweite Bot ZU 2 schied nach 57 Runden aus und hatte mit 65 % gespielten und 16 % gewonnenen Runden ähnliche Werte wie ZU 1. 4.3.2. Interpretation Loose-aggressive Bots Der Bot LA 2 konnte durch seine loose-aggressive Spielweise die Anfangsphase nicht überstehen, da er nur drei Spiele gewinnen konnte, was den Verlust durch die vielen gespielten Runden nicht ausgleichen konnte. Der erste Bot LA 1 überstand die ersten Runden trotz derselben Spielweise, weil er zu Beginn des Turniers viele Runden für sich entscheiden konnte und so ein kleines Polster an Chips gewann. Durch dieses Polster konnte er spätere Schwankungen von Gewinnen und Verlusten abfangen und sogar die Führung übernehmen. Ab etwa der 175sten Runde übernahm LA 2 die Führung und ab der 211ten Runde waren nur noch tight spielende Bots im Spiel. Da die Blinds zu diesem Zeitpunkt relativ hoch waren, wurde jede nicht gespielte Hand zum Nachteil. Daher war der loose-aggressive Bot am Ende im Vorteil, da er ca. 91% seiner Hände spielte. 58 4.4. ABWEICHUNGEN Loose-passive Bots Der erste loose-passive Bot schied bereits nach 42 Runden aus, da er nur drei Runden gewinnen konnte. Der zweite Bot beendete das Turnier nach 211 Runden auf dem vierten Platz. Er hatte zwar bessere Hände, als der erste Bot, konnte aber bedingt durch seine passive Spielweise nicht genügend Gewinn daraus schlagen. Tight-aggressive Bots Die tight-aggressive Strategie der Bots zahlte sich am Anfang des Turniers aus, allerdings wurde sie, je länger das Turnier dauerte, mehr und mehr zu Hindernis, da die Blinds immer weiter erhöht wurden und daher jede nicht gespielte Hand immer teurer wurde. Deshalb schied der zweite Bot nach 276 Runden auf dem dritten Platz aus, während der erste Bot das Turnier als zweiter beendete. Tight-passive Bots Die tight-passiven Bots schieden nach 65 bzw. 156 Runden aus und waren damit nicht sehr erfolgreich im Turnier. Der zweite Bot konnte zwar noch relativ lange mithalten, aber machte im Endeffekt durch seine passive Spielweise zu wenig Gewinn, um wirklich eine Chance zu haben, da die Blinds auf Dauer zu hoch für ihn waren. Bots mit zufälliger Spielweise Die Bots, die ihre Spielweise zufällig wählten, sind in diesem Turnier nicht sehr weit gekommen und schieden in der 108ten bzw. 57ten Runde aus. Der erste Bot konnte anfangs ganz gut mithalten, verlor dann aber ab ca. der 80sten Runde zu viele Spiele. 4.4. Abweichungen Abweichungen von den Ergebnissen der vorherigen Beispiele kamen zustande, wenn bestimmte Bots die Anfangsphase nicht überstanden. Gerade loose spielende Bots sind anfangs sehr abhängig von guten Karten, da sie fast jede Runde spielen. Dieser Umstand lässt sich auch im unterschiedlichen Abschneiden der gleich spielenden Bots erkennen. So scheidet im Beispiel des langen Spielzeitraums der erste loose-aggressive Bot nach 175 Runden aus, während der zweite erst nach 1320 Runden sein gesamtes Kapital verspielt hat. Aber auch bei Turnieren spielt die Anfangsphase eine große Rolle. Wenn ein looseaggressiver Bot diese Phase überstand, gewann er auch fast immer das Turnier, schieden aber beide loose-aggressiven Bots aus, zeigten sich zu den Beispielen abweichende Ergebnisse. Dann gewannen meist die zufällig spielenden Bots. Bei den Tests über eine langen Zeitraum, waren die tight-aggressiv spielenden Bots meist 59 KAPITEL 4. BOT STATISTIK erfolgreich. Abweichungen davon ergaben sich nur, wenn beide Bots in der Anfangsphase nicht genügend Spiele gewinnen konnten und ausschieden. Da sie aber nicht so viele Runden spielen, wie loose eingestellte Bots, war ein frühes Ausscheiden der tighten Bots deutlich seltener, als bei loosen. Daher kam diese Art der Abweichung auch seltener vor, als die Abweichung bei Turnierspielen. Zusammenfassend sind die Abweichungen vor allem durch Glück bzw. Pech zu erklären. 4.5. Fazit 4.5.1. Fixed Limit Poker Auf lange Sicht setzten sich die tight-aggressiven Bots am besten durch. Die zufällig spielenden Bots waren ebenfalls recht erfolgreich, solange Bots mit verschiedenen Spielweisen am Tisch waren. Eine passive Spielweise brachte auf Dauer nicht genügend Gewinn ein, um die Verluste aufzuwiegen. Loose-aggressiv spielende Bots waren zu abhängig vom Glück und verloren auf Dauer zu viel, um es durch die ebenfalls hohen Gewinne wieder ausgleichen zu könnnen. 4.5.2. Poker Turnier Bei den Turniersimulationen hing der Erfolg eines Bots stark von der Anfangsphase des Turniers ab. Wenn ein loose-aggressiver Bot diese Phase überstand, gewann er fast immer das Turnier. Am zweiterfolgreichsten waren bei vielen Wiederholungen die zufällig spielenden Bots, solange die loose-aggressiven vorher ausgeschieden waren. Eine rein passive Spielweise zahlte sich weder für die tight, noch für die loose spielenden Bots aus. Die tight-aggressiven Bots schafften es fast immer auf die vorderen Plätze, konnte aber gegen Ende des Turniers, wenn die Blinds hoch waren, nicht mehr mithalten. Deshalb wäre es am besten, wenn ein Turnierbot tight-aggressiv beginnt, später aber loose-aggressiv weiterspielt, um das Turnier zu gewinnen. 60 5. Ausblick 5.1. Client/Server 5.1.1. Nutzerkonto Die Benutzerverwaltung bietet noch Verbesserungspotential. So gibt es im Augenblick für die Anwender keine Möglichkeit ihr Passwort zu ändern oder ein vergessenes Passwort zurückzusetzen. Es wäre auch gut, eine Funktion zum Löschen eines bestehenden Nutzerkontos zur Verfügung zu stellen. Die Daten des Anwenders könnten noch um Statistiken erweitert werden, um den Erfolg des eigenen Spiels besser beurteilen zu können. Denkbar wären hierbei grundlegende Statistiken wie z. B. in Tabelle 4.1. 5.1.2. Tischverwaltung Das Anlegen, Ändern oder Löschen eines Tisches ist im Moment nur dem Administrator über den Client möglich. Es wäre denkbar, dass es dem normalen Anwender auch ermöglicht wird, private Tische anzulegen und zu verwalten. Zusätzlich wäre es gut, dass Tische mit Passwörtern versehen werden könnten, damit z. B. auch private Turniere unter Ausschluss von Zuschauern veranstaltet werden können. Zur Umsetzung von privaten Tischen müsste die Tischverwaltung noch dahingehend angepasst werden, dass Änderungen sofort und nicht nach einem Neustart erfolgen. Dazu müsste ein gerade laufendes Spiel an einem zu ändernden Tisch sauber beendet werden, um unerwünschte Effekte zu vermeiden. 5.1.3. Lehrsystem Um den Einstieg in die Pokerwelt zu erleichtern, ist es denkbar, den Pokerclient um ein Lehrsystem zu erweitern. Ein solches System sollte einen Anfänger in mehreren Lektionen an das Pokerspiel heranführen. Es könnten im ersten Teil die grundlegenden Spielregeln (vgl. Abschnitt 2.1) erklärt und anhand von Spielsituationen visualisiert werden. Im späteren Verlauf der Lektionen könnte ein Assistent den Spieler bei seinen ersten Spielversuchen beratend zur Seite stehen. Dazu könnten die Methoden der Bots genutzt werden, um den Spieler z. B. bei der Wahl seiner Starthand zu beraten oder im weiteren Verlauf auf mögliche Straßen oder Flushs oder eigene Draws hinzuweisen. Des Weiteren 61 KAPITEL 5. AUSBLICK ist denkbar, dass dem Spieler der berechnete Wert seiner Hand mit näheren Erklärungen angezeigt und eine Empfehlung für die nächste Aktion geben wird. Dadurch wäre es dem Spieler möglich, nach und nach die Stärke seiner Hand besser einschätzen zu können. 5.2. Bots 5.2.1. Punktesystem Zur Bewertung der Hand wird ein Punktesystem zur Kartenbewertung (siehe Abschnitt 3.3.3) benutzt. Dieses System könnte noch weiter verfeinert werden, um z. B. neben Straight und Flush Draws auch Full House Draws oder kombinierte Draws zu berücksichtigen. Außerdem wäre es wünschenswert, wenn das Punktesystem die möglichen Hände der Gegner besser berücksichtigt, da im Moment nur auf mögliche Straßen oder Flushs geprüft wird. Diese Prüfung könnte auch mit einer Wahrscheinlichkeitsanalyse kombiniert werden, damit unwahrscheinliche Hände die Spielweise des Bots nicht zu sehr beeinflussen und er nicht trotz einer guten Hand zu vorsichtig spielt. Das Punktesystem sollte zudem mit Hilfe eines längeren Tests, in dem Bots gegen reale Gegner spielen, analysiert werden. Dadurch könnten fehlerhafte Bewertungen aufgedeckt werden, die beim Spielen der Bots untereinander nicht ersichtlich waren. 5.2.2. Anpassung an den Gegner Das Spiel der Bots ist im Moment nicht sehr flexibel. Sie halten sich strikt an ihre eingestellte Spielweise. Es ist daher wünschenswert, dass die Bots um die Möglichkeit erweitert werden, die Spielweise eines anderen Spielers zu erkennen und ihr Verhalten dementsprechend anzupassen. Gleichzeitig müssten die Spielweisen stufenlos verstellbar sein, so dass ein fließender Übergang ermöglicht wird. Dadurch könnte sich ein tight-aggressiver Bot, der gegen einen starr tight-aggressiven Gegner spielt, mit der Zeit anpassen und seine Aktionen in Richtung der loosen Spielweise verändern, indem die aktuell statitischen Aktionswerte (siehe Tabelle 3.2) dynamisch angepasst werden. Zum Erkennen der Spielweise eines Gegners wäre eine Datenbank denkbar, in der jeder Bot die Daten seiner Gegenspieler sammeln kann. Darin könnte ein Bot grundlegende Informationen speichern, wie das Verhältnis der gespielten Spiele zur Anzahl der Spielrunden und die Anzahl der gewonnenen Spiele. Dadurch wäre ein erster Ansatzpunkt gegeben, um die Spielweise des Gegners einschätzen zu können. Zur Erweiterung eines solchen Datenbanksystems, könnten auch gesamte Spielverläufe gespeichert und analysiert werden. Der Bot hätte so die Möglichkeit die Spielweise des Gegeners in bestimmten Spielsituationen detailiert zu analysieren und eventuelle Regelmäßigkeiten aufzudecken. Eine typische Spielsituation wäre z. B. das Halten eines Straight Draws oder das Halten eines hohen Paares, während ein Flush durch die Community Cards ermöglicht wird. 62 5.2. BOTS 5.2.3. Bluffen Das Bluffen erfolgt zur Zeit nur zufällig bei der Wahl der nächsten Spielaktion. Es wäre daher gut, wenn bestimmte Situationen, in denen Bluffen eine gute Alternative ist (siehe Abschnitt 2.3.2), besser genutzt würden. Dazu wäre ein System zur Erkennung solcher Bluff-Situationen denkbar, das in Verbindung mit einer verbesserten Erkennung der Spielweise der Gegener eingesetzt werden könnte. Dadurch wäre es z. B. möglich einen als tight spielend indentifizierten Gegner zu bluffen, wenn eine passenden Situation wie ein Flush Draw erkannt wurde. 63 ANHANG A. ANHANG A. Anhang Clientoberfläche Abbildung A.1.: Clientoberfläche Quelltext eines einfachen Bots 64 Listing A.1: Einfacher Pokerbot 1 package de . a u f j e d e n . p o k e r . bot ; 2 3 4 5 6 import import import import java . java . java . java . import import import import import import import import import import import import import import import import de . de . de . de . de . de . de . de . de . de . de . de . de . de . de . de . i o . BufferedReader ; i o . IOException ; i o . InputStreamReader ; util . List ; 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden aufjeden . poker . c l i e n t . P o k e r C l i e n t I n t e r f a c e ; . poker . c l i e n t . PokerServerVerbindung ; . p o k e r . kommunikation . C h a t N a c h r i c h t ; . p o k e r . kommunikation . L o g i n N a c h r i c h t ; . p o k e r . kommunikation . ShutdownNachricht ; . p o k e r . kommunikation . S p i e l e r A k t i o n N a c h r i c h t ; . p o k e r . kommunikation . T i s c h B e t r e t e n N a c h r i c h t ; . p o k e r . kommunikation . L o g i n N a c h r i c h t . L o g i n S t a t u s ; . p o k e r . kommunikation . R e g i s t r i e r e n N a c h r i c h t . R e g i s t r i e r e n S t a t u s ; . p o k e r . kommunikation . ShutdownNachricht . ShutdownStatus ; . p o k e r . kommunikation . S p i e l e r A k t i o n N a c h r i c h t . S p i e l e r A k t i o n ; . p o k e r . kommunikation . T i s c h B e t r e t e n N a c h r i c h t . T i s c h B e t r e t e n S t a t u s ; . poker . s p i e l . SpielDaten ; . poker . s p i e l . Tisch ; . poker . s p i e l e r . SpielerDaten ; . poker . s p i e l e r . S p i e l e r S p i e l D a t e n . S p i e l e r S t a t u s ; 24 25 public c l a s s T e x t B o t C l i e n t implements P o k e r C l i e n t I n t e r f a c e { 26 27 28 29 public s t a t i c void main ( S t r i n g [ ] a r g s ) { new T e x t B o t C l i e n t ( a r g s [ 0 ] , a r g s [ 1 ] , new I n t e g e r ( a r g s [ 2 ] ) ) ; } 30 31 private f i n a l S t r i n g HOST = ” l y r a . i n f o r m a t i k . uni−o l d e n b u r g . de ” ; 32 33 private f i n a l i n t PORT = 5 5 5 3 5 ; 34 35 private P o k e r S e r v e r V e r b i n d u n g psv ; 36 37 private i n t s p i e l e r n u m m e r ; 38 39 private i n t tischnummer ; 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 public T e x t B o t C l i e n t ( S t r i n g name , S t r i n g p a s s w o r t , i n t tischnummer ) { t h i s . psv = new P o k e r S e r v e r V e r b i n d u n g ( this , HOST, PORT) ; t h i s . s p i e l e r n u m m e r = −1; t h i s . tischnummer = tischnummer ; t h i s . psv . s e n d e N a c h r i c h t (new L o g i n N a c h r i c h t ( name , p a s s w o r t ) ) ; B u f f e r e d R e a d e r i n p u t = new B u f f e r e d R e a d e r (new InputStreamReader ( System . i n ) ) ; try { input . readLine ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } t h i s . psv . s e n d e N a c h r i c h t (new S p i e l e r A k t i o n N a c h r i c h t ( S p i e l e r A k t i o n .VERLASSEN ) ) ; } 56 57 58 59 public P o k e r S e r v e r V e r b i n d u n g g e t P s v ( ) { return psv ; } 60 61 62 63 64 65 66 public void v e r a r b e i t e S p i e l d a t e n ( S p i e l D a t e n s p i e l D a t e n ) { S p i e l e r A k t i o n N a c h r i c h t s p i e l e r A k t i o n = new S p i e l e r A k t i o n N a c h r i c h t ( ) ; i f ( spielDaten . g e t S p i e l e r ( this . spielernummer ) . getStatus ( ) == S p i e l e r S t a t u s .AMZUG) { double random = Math . random ( ) ; switch ( s p i e l D a t e n . g e t S t a t u s ( ) ) { 65 ANHANG A. ANHANG case CHECKENSETZEN: i f ( random < 0 . 6 ) { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n .CHECKEN) ; } else { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n . SETZEN ) ; } break ; case MITGEHENERHOEHEN: i f ( random < 0 . 1 ) { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n . PASSEN ) ; } e l s e i f ( random < 0 . 3 ) { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n .ERHOEHEN) ; } else { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n .MITGEHEN) ; } break ; default : i f ( random < 0 . 1 ) { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n . PASSEN ) ; } else { s p i e l e r A k t i o n . s e t A k t i o n ( S p i e l e r A k t i o n .MITGEHEN) ; } break ; } try { Thread . s l e e p (new Double ( Math . random ( ) ∗ 5 0 0 0 ) . i n t V a l u e ( ) ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { e . printStackTrace ( ) ; } t h i s . psv . s e n d e N a c h r i c h t ( s p i e l e r A k t i o n ) ; 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 } 97 } 98 99 public void v e r b i n d u n g H e r g e s t e l l t ( ) { } 100 101 102 public void v e r b i n d u n g N i c h t H e r g e s t e l l t ( ) { System . out . p r i n t l n ( ” S e r v e r n i c h t e r r e i c h b a r ” ) ; System . e x i t ( 1 ) ; } 103 104 105 106 107 public void v e r b i n d u n g V e r l o r e n ( ) { } 108 109 110 public void v e r a r b e i t e C h a t N a c h r i c h t ( C h a t N a c h r i c h t c h a t N a c h r i c h t ) { } 111 112 113 public void v e r a r b e i t e T i s c h B e t r e t e n N a c h r i c h t ( T i s c h B e t r e t e n N a c h r i c h t tbn ) { i f ( tbn . g e t S t a t u s ( ) == T i s c h B e t r e t e n S t a t u s .ERFOLGREICH) { t h i s . s p i e l e r n u m m e r = tbn . getSpielerNummer ( ) ; t h i s . psv . s e n d e N a c h r i c h t (new S p i e l e r A k t i o n N a c h r i c h t ( S p i e l e r A k t i o n .TEILNEHMEN ) ) ; } else { System . out . p r i n t l n ( ” T i s c h v o l l ” ) ; } } 114 115 116 117 118 119 120 121 122 123 public void v e r l a e s s t T i s c h ( ) { System . e x i t ( 0 ) ; } 124 125 126 127 public void v e r a r b e i t e S p i e l e r D a t e n ( S p i e l e r D a t e n s p i e l e r ) { } 128 129 130 public void v e r a r b e i t e F e h l e r N a c h r i c h t ( ) { } 131 132 133 public void v e r a r b e i t e T i s c h D a t e n ( L i s t <Tisch> t i s c h e ) { 134 66 } 135 136 public void v e r a r b e i t e L o g i n ( L o g i n S t a t u s s t a t u s ) { i f ( s t a t u s == L o g i n S t a t u s .ERFOLGREICH) { t h i s . psv . s e n d e N a c h r i c h t (new T i s c h B e t r e t e n N a c h r i c h t ( tischnummer , T i s c h B e t r e t e n S t a t u s . SPIELEN ) ) ; } else { System . out . p r i n t l n ( ” L o g i n f e h l e r : ” + s t a t u s . t o S t r i n g ( ) ) ; } } 137 138 139 140 141 142 143 144 145 public void v e r a r b e i t e S h u t d o w n ( ShutdownStatus s t a t u s ) { i f ( s t a t u s == ShutdownNachricht . ShutdownStatus . CLIENT) { System . e x i t ( 0 ) ; } } 146 147 148 149 150 151 public void v e r a r b e i t e R e g i s t r i e r u n g ( R e g i s t r i e r e n S t a t u s s t a t u s ) { } 152 153 154 } XML-Struktur einer SpielDatenNachricht Listing A.2: SpielDatenNachricht 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 <?xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8”?> <N a c h r i c h t name=” ” tischnummer=”−1” typ=” 1 ”> <S p i e l d a t e n runde=” 0 ” s t a t u s=” 2 ”> < S p i e l e r nr=” 0 ”> <Name>C h a r l i e </Name> <Geld >2480</Geld> <E i n s a t z >20</ E i n s a t z > <Karte nr=” 0 ”>25</Karte> <Karte nr=” 1 ”>36</Karte> <S p i e l e r A k t i o n >5</ S p i e l e r A k t i o n > <S p i e l e r S t a t u s >2</ S p i e l e r S t a t u s > <S p i e l A k t i o n >0</S p i e l A k t i o n > <Z e i g e n >f a l s e </Z e i g e n > </ S p i e l e r > < S p i e l e r nr=” 1 ”> <Name>O l i v i a </Name> <Geld >2490</Geld> <E i n s a t z >10</ E i n s a t z > <Karte nr=” 0 ”>42</Karte> <Karte nr=” 1 ”>44</Karte> <S p i e l e r A k t i o n >0</ S p i e l e r A k t i o n > <S p i e l e r S t a t u s >3</ S p i e l e r S t a t u s > <S p i e l A k t i o n >0</S p i e l A k t i o n > <Z e i g e n >f a l s e </Z e i g e n > </ S p i e l e r > < S p i e l e r nr=” 2 ”> <Name/> <Geld>0</Geld> <E i n s a t z >0</E i n s a t z > <Karte nr=” 0 ”>null </Karte> <Karte nr=” 1 ”>null </Karte> <S p i e l e r A k t i o n >0</ S p i e l e r A k t i o n > <S p i e l e r S t a t u s >0</ S p i e l e r S t a t u s > <S p i e l A k t i o n >0</S p i e l A k t i o n > <Z e i g e n >f a l s e </Z e i g e n > </ S p i e l e r ><S p i e l e r nr=” 3 ”> <Name/> <Geld>0</Geld> <E i n s a t z >0</E i n s a t z > <Karte nr=” 0 ”>null </Karte> 67 ANHANG A. ANHANG 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 <Karte nr=” 1 ”>null </Karte> <S p i e l e r A k t i o n >0</ S p i e l e r A k t i o n > <S p i e l e r S t a t u s >0</ S p i e l e r S t a t u s > <S p i e l A k t i o n >0</S p i e l A k t i o n > <Z e i g e n >f a l s e </Z e i g e n > </ S p i e l e r > . . . < S p i e l e r nr=” 9 ”> <Name/> <Geld>0</Geld> <E i n s a t z >0</E i n s a t z > <Karte nr=” 0 ”>null </Karte> <Karte nr=” 1 ”>null </Karte> <S p i e l e r A k t i o n >0</ S p i e l e r A k t i o n > <S p i e l e r S t a t u s >0</ S p i e l e r S t a t u s > <S p i e l A k t i o n >0</S p i e l A k t i o n > <Z e i g e n >f a l s e </Z e i g e n > </ S p i e l e r > <Pot>30</Pot> <Flop> <Karte nr=” 0 ”>null </Karte> <Karte nr=” 1 ”>null </Karte> <Karte nr=” 2 ”>null </Karte> </Flop> <Turn> <Karte>null </Karte> </Turn> <River> <Karte>null </Karte> </River> <S t a t u s >C h a r l i e e r h o e h t . </ S t a t u s > <Gewinner/> <D e a l e r >1</D e a l e r > <MinErhoehung >10</MinErhoehung> <MaxEinsatz >20</MaxEinsatz> <B i g B l i n d >10</B i g B l i n d > <G e w i n n e r k a r t e n/> <L a e u f t >true</L a e u f t > </ S p i e l d a t e n > </N a c h r i c h t > 68 Abbildungsverzeichnis Abbildungsverzeichnis 2.1. Pokertisch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2. Bietstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 3.9. Architektur des Client-/Serversystems . . . . . . . . . . . . . . . . . . Klassendiagramm: Server (de.aufjeden.poker.server) . . . . . . . . . . . Klassendiagramm: Spiel (de.aufjeden.poker.spiel) . . . . . . . . . . . . Klassendiagramm: Spieler (de.aufjeden.poker.spieler) . . . . . . . . . . Klassendiagramm: Client (de.aufjeden.poker.client) . . . . . . . . . . . Klassendiagramm: Bot (de.aufjeden.poker.bot) . . . . . . . . . . . . . . Bewertung einer drawing Hand. . . . . . . . . . . . . . . . . . . . . . . Einbeziehung möglicher Straßen oder Flushs . . . . . . . . . . . . . . . Klassendiagramm: Kommunikation (de.aufjeden.poker.kommunikation) . . . . . . . . . . . . . . . . . . 32 33 35 38 40 41 45 46 48 4.1. Spielverlauf (500 Spielrunden) . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2. Spielverlauf (20000 Spielrunden) . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3. Spielverlauf (Turnier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 A.1. Clientoberfläche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 69 Tabellenverzeichnis Tabellenverzeichnis 2.1. Rangordnung der Pokerhände . . . . . . . . . . . . . . . . . . . . 2.2. Mögliche Spieleraktionen . . . . . . . . . . . . . . . . . . . . . . . 2.3. Wahrscheinlichkeit mit einem Pocketpaar auf ein höheres Paar zu für einen bis neun Gegner . . . . . . . . . . . . . . . . . . . . . . 2.4. Wahrscheinlichkeiten die Starthand auf dem Flop zu verbessern . 2.5. Wahrscheinlichkeiten, die Hand nach dem Flop zu verbessern . . . 2.6. Gruppeneinteilung von Starthänden . . . . . . . . . . . . . . . . . 2.7. Positionsempfehlungen für Starthände . . . . . . . . . . . . . . . 2.8. Vergleich der Wahrscheinlichkeiten (in %) . . . . . . . . . . . . . . . . . . . . . treffen . . . . . . . . . . . . . . . . . . . . . . . . . 8 . 11 . . . . . . 15 18 19 20 21 24 3.1. Bewertungsystem der aktuell gehaltenen Hand. . . . . . . . . . . . . . . . 44 3.2. Spieleraktion anhand des ermittelten Handwerts. . . . . . . . . . . . . . . . 45 4.1. Spielverlauf (500 Spielrunden) . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2. Spielverlauf (20000 Spielrunden) . . . . . . . . . . . . . . . . . . . . . . . . 54 4.3. Spielverlauf (Turnier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 70 Literaturverzeichnis [Als04] Brian Alspach. Enumerating Starting Poker http://www.math.sfu.ca/˜alspach/comp42.pdf, January 2004. Hands. [Bra03] Sam Braids. The Intelligent Guide to Texas Hold’em Poker. Intelligent Games Publishing Towson, Maryland, 2003. [HK00] Richard D. Harroch and Lou Krieger. Poker for Dummies. Wiley Publishing, Inc., 2000. [Inf] Infarom ePublishing, http://probability.infarom.ro/holdempoker.html. Hold’em Poker – Probability. Letzter Zugriff: 2007-02-23. Texas [Kri04] Lou Krieger. Pot Odds Made Easy. http://www.cardplayer.com/magazine/article/13913, March 2004. Letzter Zugriff: 2007-02-24. [PI06a] Poker-Institut.org. Das Hutchison-Punktesystem für Texas http://www.poker-institut.org/texas-holdem-hutchison.html, 2006. Zugriff: 2007-02-25. Hold’em. Letzter [PI06b] Poker-Institut.org. Texas Hold’em Wahrscheinlichkeiten. http://www.pokerinstitut.org/texas-holdem-wahrscheinlichkeiten.html, 2006. Letzter Zugriff: 200702-22. 71 Glossar Glossar All in Der Spieler setzt alle seine verbleibenden Chips, 8 Bad Beat Eine gute Hand wird durch viel Glück des Gegners geschlagen, 28 Big Blind Mindesteinsatz, der vom Spieler an der zweiten Position nach dem Button geleistet werden muss; entspricht dem doppelten Small Blind, 7 Blind Zu leistender Mindesteinsatz, 7 Button Zeigt die Position des Dealers und, relativ dazu, die der Blinds an, 7 Community Cards Für alle Spieler gültige, öffentliche Karten, 4 Dealer Der (fiktive) Kartengeber, 7 Draw Eine verbesserungswürdige Hand, der z. B. eine Karte zum Flush oder Straight fehlt, 16 Drawing Dead Eine drawing Hand, die selbst wenn sie komplettiert wird, nicht gewinnen kann, 29 Flop Die ersten drei Community Cards, die gleichzeitig aufgedeckt werden; bezeichnet auch die zweite Bietrunde, 9 Hand Die besten fünf Karten aus den Pocket Cards und den Community Cards, 6 Hole Cards Siehe Pocket Cards, 9 Inside Straight Draw Siehe Straight Draw , 18 Kicker Die Beikarte, die zur Pokerhand zählt, 7 Nuts Die (aktuell) bestmögliche Hand, 26 Open Ended Straight Draw Siehe Straight Draw , 16 Outs Anzahl der Karten, die die Karten des Spielers zu einer starken Pokerhand komplettieren würden, 16 72 Glossar Pocket Cards (auch Hole Cards) Die zwei verdeckten Startkarten des Spielers; bilden die Starthand, 9 Pokerhand Siehe Hand, 6 Pot Das Geld oder die Chips in der Tischmitte, die die Spieler zu gewinnen versuchen, 7 Pot Odds Geben an, bis zu welchem Betrag es sich lohnt mitzugehen, weil die Chancen in Relation zur Potgröße stimmen, 22 River Die fünfte und letzte öffentliche Karte; bezeichnet auch die vierte Bietrunde, 10 Scare Cards Höhere Karten, als die eigenen, (im Flop) wie A, K, Q und J oder Karten, die eine bessere Hand als die eigene ermöglichen, 25 Semi Bluff Ein Bluff mit einer guten drawing Hand, 29 Showdown Das Ende einer Spielrunde; die Spieler zeigen ihre Karten und die beste Hand gewinnt den Pot, 10 Small Blind Mindesteinsatz, der vom Spieler an der ersten Position nach dem Button geleistet werden muss, 7 Straight Draw Dem Spieler fehlt noch eine Karte zur vollständigen Straße. Man unterscheidet Open Ended, d. h. es fehlt die höchste oder niedrigste Karte zur Straße und Inside Straight Draw, d. h. es fehlt eine Karte innerhalb der Straße, 16 Turn Die vierte öffentliche Karte; bezeichnet auch die dritte Bietrunde, 9 73 Erklärung Hiermit versichere ich, dass ich diese Arbeit selbstständig verfasst und keine anderen als die angegebenen Hilfsmittel und Quellen benutzt habe. (Tim Suchner) Oldenburg, 11. Juli 2007