# Algorithmus für Poker-Hände



## Localtime (13. Aug 2009)

Hi,

ich schreibe an einem Poker-Statistik-Programm (Hold'em).
Nun bin ich an einem Punkt angekommen, an dem mir nichts zu einfällt, wie ich das lösen soll. Gefragt sind mathematische Kenntnisse zur Berechnung der besseren Hand.

die Derby-Tabellen(unwichtige Spalten lasse ich weg):

```
card
card_id  card_name  card_value
  1           2            1
  2           3            2
[...]
  13          A            12


color
color_id  color_shortcut
  1               s
  2               c
  3               h
  4               d


hand
myHoleCardId1, myHoleCardColorId1, myHoleCardId2, myHoleCardColorId2,
winnerHoleCardId1, winnerHoleCardColorId1, winnerHoleCardId2, winnerHoleCardColorId2,
flopCardId1, flopCardColorId1,  flopCardId2, flopCardColorId2 [...] riverCardColorId
```

Nun gehen wir mal davon aus, dass ein anderer gewonnen hat. ;(

Ich will nun Folgendes berechnen:

1.) wer hat die bessere Start-Hand mit Chance (Beispiel: ich 60/40)
2.) wer hat die besseren Karten nach dem Flop (mit Chance)
3.) ... nach dem Turn

Es geht mir hauptsächlich darum herauszufinden, wer nach Flop und Turn die besseren 5 Karten hatte und mit wieviel % er vorne liegt ohne 12 Millionen if's.

Über einen Schubbs in die richtige Richtung wäre ich dankbar.


Grüße aus Essen

Henning


----------



## Painii (13. Aug 2009)

Naja prinzipiell würd ich mir vorstellen:

Ich bekomme 2 Karten, der Gegner 2 -> Jetzt hab ich ein ganzes Poker-Deck wo diese 4 Karten fehlen und nehme daraus jede Kombination aus 5 Karten.
Wenn die Kombination für den Gegner spricht bekommt er 1 Punkt gut geschrieben, wenn für mich dann bekomm ich 1 Punkt, wenns für beide spricht dann bekommt keiner einen Punkt (oder jeder einen).
Zum Schluss schreib ich dann einfach Punkte/alleMöglichkeiten und hab die Prozente.
Wenn jetzt eine Karte aufgedeckt wird zähl ich einfach die Karte auf die Hand von beiden Spielern und mache die Prozedur oben nur mit 4 Karten.

edit: Das wär so mein Vorgehen, wieweit das mit der Laufzeit passt weiss ich nicht.
Du musst ja 205476480 Kombinationen überprüfen (48 Karten sind übrig, 5 auswählen, Variation ohne Wiederholung -> 48!/(48-5)!). Da es aber ein Statistik-Programm ist und du nicht live die % anzeigen willst kann das Programm ja auch etwas rechnen... musst du dann schauen


----------



## Dissi (13. Aug 2009)

Ich würde von jeder Hand die outs/odds ausrechnen und dann die Werte vergleichen. Natürlich musst du beachten, wenn schon jemand was getroffen hat. Würde mir hierzu mal googlen, wie genau outs/odds berechnet werden.

Hilft vllt:
Outs und Pot Odds ganz einfach berechnen


----------



## Localtime (13. Aug 2009)

Hi,

Painii:

dazu bräuchte ich 1 Zillion Vergleiche was ich vermeiden will.
Es gibt ja auch Full House, Flush u. Straight, wo der Kartenwert meistens erst an 2. Stelle kommt.


Dissi:

Das mit den outs hatte ich mir auch schon überlegt. Bringt mir nur nichts da angenommen:

HandA: 5,7
HandB: 5,6

Flop: 3,4

HandB hat zwar den oe str8 draw, liegt aber erstmal hinten und braucht Hilfe.

Ich hatte da mal so eine tolle Tabelle gesehen, wo die Wahrscheinlichkeiten der Start-Hände aufgelistet waren (A,Q off  vs K,10 suited) ... nur finde ich die nicht mehr.
Und rechnerisch richtig kompliziert wird's dann nach dem Flop / Turn


Aber erstmal Danke Euch beiden.


----------



## Painii (13. Aug 2009)

Localtime hat gesagt.:


> Hi,
> 
> Painii:
> 
> dazu bräuchte ich 1 Zillion Vergleiche was ich vermeiden will.


 205 Millionen.



> Es gibt ja auch Full House, Flush u. Straight, wo der Kartenwert meistens erst an 2. Stelle kommt.



Ich hätte mir vorgestellt:

```
int besteHand(Karten[] handKarten, Karten[] offeneKarten){
  //hier jetzt mit if zurückgeben was für ein wert ist -> kann auch irgendwie anders gelöst werden
 if(besteKarte==3)return KARTEN_WERT_3;
 if(besteKarte==paarZweien)return KARTEN_WERT_2ER_PAAR;
}
for(alle möglichen Kombinationen){
 meineBesteMöglichkeit = besteHand(meineHand,aktuelle Kombination) //(z.b. Paar)
 gegnerBesteMöglichkeit = besteHand(gegnerHand,aktuelle Kombination) //(z.b. High Card King)
 if(meineBesteMöglichkeit>gegnerBesteMöglichkeit)meinePunkte++;
 if(meine BesteMöglichkeit<gegnerBesteMöglichkeit)gegnerPunkte++;
 if(meineBesteMöglichkeit==gegnerBesteMöglichkeit); //tue nichts oder gib beiden Punkte, wie auch immer
}
```

Grad mal geschaut, mein Rechner braucht mit einer for-schleife bis 205476480 ca. 700 milisekunden... wie es aussieht wenn du mit Objekten arbeitest mit der Laufzeit weiss ich nicht, ist aber sicher um einiges langsamer.


----------



## Localtime (14. Aug 2009)

Hi,

um erstmal zu gucken welche Hand besser ist, denke ich mir Folgendes:

ich nehme mir holeCardsA, holeCardsB und die Karten auf dem Board
dann gucke ich:

holeCardsA hast du ein Royal Flush mit den Karten vom Board?
holeCardsB hast du ein Royal Flush ... ?

holeCardsA hast du ein Str8 Flush mit den Karten vom Board?
holeCardsB hast du ein Str8 Flush ... ?
wenn beides true:
holeCardsA was ist deine höchste Karte
holeCardsB was ist deine höchste Karte
wenn wieder gleich:
nächst höhere Karte vergleichen

... usw. nach "unten"

Für den Vergleich sollte ich so mit relativ wenig Code auskommen.


Für die Chancen-Ausrechnung durchwühle ich nochmal das Internet um rauszufinden wie z.B. die Chancen sind: fertige Hand vs viele outs


P.S.: für die Starthand habe ich eine schöne Tabelle gefunden, in der für jede mögliche Kombination der 2 Karten gegen 1-9 unbekannte Gegner die Chancen in % stehen


----------



## ARadauer (14. Aug 2009)

hab mir das jetzt nicht durchgelesen aber alle die was mit poker machen sollen sich das mal anschaun....

zum evaluieren der Hand http://spaz.ca/poker/UofAHandEval.zip und hier gibts die Doku dazu Generated Documentation (Untitled)


----------



## Localtime (14. Aug 2009)

Hi,
@ARadauer ... super ... Danke!

Ich werde den Code mal durcharbeiten, da ich zwar das tolle Java-Certifikat habe, aber in Java noch Übung brauche (C# + PHP Coder bin). :rtfm:

Für mich ist das Thema --> erledigt !

Danke für Eure Hilfe. Ein tolles Forum. Ich habe hier schon viel gelernt und "geklaut".


----------

