Entwicklung und Implementierung eines Pokerclients mit Pokerbots

Werbung
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
Herunterladen