Poker

Poker hat mehrere Spielvarianten. Bei einer Variante hat jeder Spieler zwei verdeckte eigene Karten und es gibt fünf Gemeinschaftskarten, die nacheinander aufgedeckt werden. Es gewinnt der Spieler, der aus seinen zwei Karten und den Gemeinschaftskarten die beste Hand aus fünf Karten bilden kann.

Für die Bewertung einer Hand wird zuerst deren Kategorie herangezogen:

- Straight Flush: ein Straight, bei dem alle Karten die gleiche Farbe haben
- Four of a Kind: vier Karten mit gleichem Wert (z.B. vier Könige)
- Full House: drei Karten mit gleichem Wert und zwei Karten mit gleichem Wert
- Flush: fünf Karten der gleichen Farbe
- Straight: fünf Karten mit aufeinanderfolgenden Werten
- Three of a Kind: drei Karten mit gleichem Wert
- Two Pairs: zwei Paare mit Karten mit gleichem Wert
- One Pair: ein Paar Karten mit gleichem Wert
- High Card: es zählt die höchste Karte

Beim Straight ist zu beachten, dass ein Ass als höchste oder niedrigste Karte verwendet werden kann aber nicht innerhalb der Folge.

Die Aufgabenstellung besteht nun darin,

- oft sieben zufällige Karten zu ziehen,
- die bestmögliche Kategorie für fünf der sieben Karten zu bestimmen und dann
- die Häufigkeiten der Kategorien zu bestimmen.

Gelöst wird die Aufgabe durch drei Klassen und einige Ausdrücke für die statistische Auswertung.

Die Klasse card (siehe Karte) repräsentiert Spielkarten. Karten haben einen Wert (rank) und eine Farbe (suit). Die Klasse deck (siehe Kartenstapel) repräsentiert einen Stapel aus 52 Spielkarten, eine Karte für jede Kombination aus Wert und Farbe. Die Klasse hat eine Methode, die den Kartenstapel mischt (shuffle) und dann sieben Karten zieht (get-hands). Die Klasse hand (siehe Hand) speichert intern sieben Karten und kann die beste Kategorie für fünf der sieben Karten bestimmen (get-category).

Im Kalkulationsblatt enthält die Zelle A2 einen Kartenstapel:

(new deck)

Die Zelle B2 gibt die Zahl der Zufallsexperimente an. Die Zelle C2 enthält die Liste der zufälligen Hände. Diese wird durch eine Scheife erzeugt:

(let
  ((hands nil)
   (count @b!2!))
  (dotimes (i count hands)
    (push
      (first (get-hands @a!2! 1))
      hands)))

Die Liste der Kategorien der Hände befindet sich in der Zelle E2. Sie wird durch Anwenden von get-category auf die Hände aus C2 ermittelt:

(map-with get-category @c2)

Die Auswertung der Ergebnisse erfolgt durch Auszählen der Kategorien. Die Namen der Kategorien befinden sich im Bereich E3:E11. Die absoluten Häufigkeiten befinden sich in den Zellen F3:F11. Sie werden mit count-if ermittelt:

(count-if (curry (equal? @e3 _)) @e!2!)

Das Kalkulationsblatt ist unten verlinkt. Es kann mit dem Programm Calc ausgeführt werden.


poker.sheet.xml