Ich habe ein Texas Hold'Em-Spiel als Teil einer Bewertung durchgeführt und darüber nachgedacht, wie ich die 7 verfügbaren Karten untersuchen und feststellen kann, ob noch Hände vorhanden sind.
Die einzig mögliche Methode, die ich mir vorstellen kann, ist, die Karten numerisch zu sortieren, dann jede mögliche Gruppe von 5 Karten zu untersuchen und zu überprüfen, ob sie mit einer Liste jeder einzelnen möglichen Hand übereinstimmen. Das würde viel Zeit in Anspruch nehmen und wäre nur für die Paarermittlung sinnvoll, da der Anzug keine Rolle spielt.
Bei den Karten handelt es sich jeweils um Zeichenfolgen, die aus einer Zahl / a / j / q / k und einer Farbe (char)3
(die ein kleines Pik-Symbol darstellt) bestehen.
Hat jemand Vorschläge, Formeln oder Links, die ich zur Erstellung eines Handanalysesystems verwenden könnte?
Machen Sie sich noch keine Sorgen, dass Sie Ihre Hände gegeneinander antreten, das ist ein anderer Fischkessel.
Antworten:
Ich denke, Sie können die Mehrheit der Pokerhände finden, indem Sie einfach ein paar Tische aus der Anzahl der Karten in der Hand machen, die für jeden Rang und jede Farbe vorhanden sind.
Mit anderen Worten, erstellen Sie ein Array, das die Kartenreihen (Zahlen und A / J / Q / K) mit der Anzahl der Karten dieses Ranges in Ihrer Hand verknüpft. Wenn der Spieler ein Paar oder einen Drilling hat, gibt es ein Element in diesem Array, das 2 oder 3 usw. entspricht. Sie haben ein volles Haus, wenn es ein Element gibt, das 2 ist, und ein anderes, das 3 ist, und eine Straße wenn es in diesem Array fünf aufeinanderfolgende Elemente gibt, die gleich 1 sind.
Ebenso können Sie eine ähnliche Anordnung der Kartenzahl jeder Farbe erstellen und sie zum Erkennen von Flushes verwenden.
Sobald Sie das Vorhandensein einer bestimmten Hand erkannt haben, ist es ziemlich einfach, zurück zu gehen und die bestimmten Karten in der Hand zu finden, um sie in der Benutzeroberfläche hervorzuheben oder was auch immer Sie tun müssen.
Im Pseudocode:
quelle
Es ist etwas knifflig, weil es so viele Kombinationen gibt. Zum Glück haben Sie einen Prozessor, der in kürzester Zeit eine Vielzahl von Kombinationen prüfen kann.
Sie benötigen ein paar verschiedene Strategien, um verschiedene Arten von Händen zu erkennen. Glücklicherweise können einige der verschiedenen Typen Strategien überlappen. Ich würde suchen, um nach Rang der Hand.
2
,3
,6
,7
,8
Sind alle einfachen Zählen. Platzieren Sie mithilfe einer Kartenliste Ace to King einfach die Nummer jedes Werts in der Liste und erhöhen Sie sie für jede weitere gefundene Karte. Dann überprüfe die Liste für 4s. Wenn es keine 4s gibt, hast du keine 4 of a kind. Überprüfe es für 3s. Wenn es keine 3s gibt, hast du keinen 3er. Wenn Sie eine 3 haben, suchen Sie nach einer 2 (was bedeutet, dass das Haus voll ist). Und so weiter...Für
1
,5
können Sie die gleiche Liste verwenden und für Sequenzen suchen , wo alle Karten einen oder mehr Einträge in der Liste für eine Folge von 5 Karten haben. Wenn sie auch den gleichen Anzug haben, ist es ein Straight Flush.4
kann die gleiche Liste haben, aber diesmal zählst du den Anzug. Achten Sie auf Zahlen von 5 oder höher.Schließlich haben
9
Sie die höchste Karte, was eine einfache Sache sein sollte, den letzten höchsten Wert aus einer Ihrer obigen Listen zu betrachten.Sie können ausbrechen, sobald Sie eine Übereinstimmung gefunden haben, wenn Sie nacheinander suchen. Es wäre jedoch trivial, die Suche fortzusetzen und alle Übereinstimmungen zu finden, wenn Sie dem Benutzer alle diese Informationen zur Verfügung stellen möchten.
Im Wesentlichen füllen Sie Eimer. Überprüfen Sie dann die Eimer auf Kombinationen. Um zu veranschaulichen:
Beginnen Sie mit einem Array und einem Bucket für jede Karte, durchlaufen Sie die Karten und zählen Sie die Instanz jeder Karte. Anschließend können Sie das Array einfach durchlaufen und nach bestimmten Kombinationen suchen. In diesem Beispiel ist klar, dass es sich um einen Vierling handelt, da in einem der Eimer vier Elemente enthalten sind.
quelle
Ich bin einmal auf diesen Algorithmus gestoßen. Es multipliziert Primzahlen, um Hände zu bestimmen und ist eine sehr interessante Lesart. Cactus Kevs Pokerhand-Bewerter
quelle
Als Ergänzung zu den hervorragenden Antworten, die diese Frage bereits erhalten hat, hielt ich es für hilfreich, eine der einfachsten Möglichkeiten zum Vergleichen von Händen anzubieten, sobald die grundlegende Klassifizierungstechnik vorhanden ist. Zunächst möchten Sie die Hände mit ihrer Klasse kennzeichnen , wie zahlreiche Antworten gezeigt haben - die meisten Ihrer Vergleiche mit "Ist Hand X besser als Hand Y?" Sie können dann einfach die Klassen der beiden Hände vergleichen und herausfinden, welche Klasse besser ist. Im Übrigen müssen Sie tatsächlich Karten für Karten vergleichen, und es stellt sich heraus, dass ein bisschen mehr Arbeit bei der Klassifizierung dies einfacher macht.
Betrachten Sie als Grundfall die Situation, in der beide Hände 'High Card'-Hände sind. In diesem Fall würden Sie zuerst die beiden höchsten Karten vergleichen, dann (wenn sie übereinstimmen) die beiden nächsten Karten usw. Wenn Sie annehmen, dass jede Eingabekarte von der höchsten zur niedrigsten Karte sortiert ist, führt dieser Ansatz zu einem Code, der aussieht Dies:
Nun die gute Nachricht: Es stellt sich heraus, dass diese lexikografische Anordnung , die in geeigneter Weise optimiert wurde, zum Vergleichen von zwei Händen dient jeder dientder Klassen, solange ihre Klasse gleich ist. Da der Vergleich von Paaren beispielsweise darin besteht, zuerst die Paare und dann die anderen drei Karten zu vergleichen, können Sie Ihre Hand so sortieren, dass das Paar an erster Stelle steht (oder sogar eine Karte des Paares an erster Stelle!) Und denselben Vergleich durchführen. (So würde beispielsweise eine Hand wie A9772 entweder als 77A92 oder, noch besser, als 7A927 gespeichert. Die Hand A9972 würde als 9A729 gespeichert und Sie würden mit dem obigen Code vergleichen, indem Sie 7 gegen 9 spielen und das herausfinden A9972 gewonnen). Eine Hand mit zwei Paaren würde zuerst mit dem höheren der beiden Paare gespeichert, dann mit dem niedrigeren und dann mit dem 'Kicker' (so würde zB A9977 als 97A97 speichern); Drei Gleiche werden mit einer der drei Karten zuerst gespeichert, dann mit den Kickern und dann mit den anderen Karten (z. B. A7772 wäre 7A277). ein volles Haus würde mit einem seiner drei und dann einem seiner zwei gespeichert werden (z. B. würde 99777 als 79779 gespeichert werden); und Straights und Flushes können beide in "direkter lexikografischer" Reihenfolge gespeichert werden, da beide wie High-Card-Hände verglichen werden. Dies führt zu einer einfachen äußeren Komparatorfunktion, die für alle Zeigerklassen mit der bereits gegebenen Funktion funktioniert:
Hoffentlich hilft das!
quelle
Mit geeigneten Kartendarstellungen und Bit-Twiddling sind einige Parallelisierungen möglich. Beispielsweise wertet dieser Java-Code 7-Karten-Festplatten aus, die eine Ganzzahl zurückgeben, die zum Vergleichen von zwei Händen verwendet werden kann. Es könnte angepasst werden, um die Art der Hand benutzerfreundlicher zu melden. Die Kernideen stammen von Cactus Kevs Seite, auf die in einer früheren Antwort verwiesen wurde.
Wenn Sie nur an möglichen Implementierungen für die Benennung der Hand in verschiedenen Sprachen interessiert sind, anstatt an Effizienz und Code-Klarheit, können Sie sich auch die Herausforderung Name the Poker Hand auf codegolf.SE ansehen.
quelle
Zunächst müssen Sie den Rang und die Farbe aller Karten kennen. trivial aber notwendig.
Dann drehen Sie sich durch diese 7 Karten und erstellen Sie zwei Histogramme; eine nach Rang (unter Verwendung eines Arrays mit 13 Indizes, alle auf Null initialisiert und um 1 erhöht, wenn eine Karte in der Hand mit diesem Rang gefunden wird) und eine nach Farbe (unter Verwendung eines Arrays mit vier Elementen, die ähnlich wie für Rang aufgebaut sind) . Dies sind lineare Operationen, und Sie können beide Operationen für jede Karte nur für einen Satz von Durchläufen ausführen.
Sie können dann feststellen, ob eine der folgenden Hände vorhanden ist, indem Sie einfach jedes Histogramm auf Buckets untersuchen, die den Kriterien entsprechen, und / oder einen einfachen Folgetest durchführen:
Sie können natürlich mehrere dieser Prüfungen kombinieren:
Wenn die Antworten auf diese Fragen eine Hand ergeben, setzen Sie den resultierenden Wert für "Handstärke" auf die Stärke der gefundenen Hand, sofern der Wert nicht bereits höher ist. Wenn Sie zum Beispiel ein volles Haus haben, Stärke 7 von 9, dann haben Sie auch einen Drilling, Stärke 4, und ein Paar, Stärke 2.
Es gibt ein paar Abkürzungen und schnelle Outs, aber insgesamt ist es wirklich nicht , dass teuer, nur laufen alle Prüfungen.
quelle
Mit einem einfachen iterativen Ansatz können Sie relativ einfach Pokerhände spielen.
Überprüfen Sie für jede Karte, ob es eine oder zwei oder drei andere mit dem gleichen Gesicht gibt, um ein Paar oder drei / vier Gleiche zu finden.
Volle Häuser sind ähnlich. Oder wenn Sie sowohl ein Paar als auch drei Gleiche finden, die nicht dasselbe Gesicht haben, markieren Sie ein volles Haus als gefunden.
Überprüfen Sie bei Flushs jeden Anzug, um festzustellen, ob es fünf gleiche Anzüge gibt.
Gerade zu prüfen ist einfach, auch wenn unsortiert. Überprüfen Sie für jede Karte, ob es eine höhere gibt, und wiederholen Sie den Vorgang, bis fünf aufeinanderfolgende Karten gefunden wurden oder nicht.
Royal Flushes und Straight Flushes sind ähnlich wie Straight Flushes zu finden. Royal Flushes haben einige zusätzliche Bedingungen, so dass Karten mit niedrigerem Wert ignoriert werden können.
Ja, dieser Ansatz ist ineffizient, aber für die meisten Pokerspiele ist das irrelevant. Sie überprüfen jede halbe Minute eine winzige Handvoll Spieler und nicht Tausende von Händen pro Sekunde.
Es gibt bessere Methoden, aber das Codieren kann mehr Zeit in Anspruch nehmen, und Sie müssen wahrscheinlich mehr Zeit / Geld für ein besseres Spiel aus der Sicht der Spieler aufwenden, abgesehen von der Klugheit und Effizienz eines Algorithmus.
quelle
Ein einfacher Weg, um Paare, Doppelpaare, Toaks, Full Houses, Poker usw. zu finden, ist der folgende:
vergleiche jede Karte miteinander in einer verschachtelten Schleife wie dieser:
Die Matches haben folgende Gültigkeit :
2 für ein Paar
4 für zwei Paare
6 für Token
8 für ein Fullhouse
12 für ein Poker
um dies zu beschleunigen, muss die j-loop nicht bis zu 5 ausgeführt werden, sondern kann bis zu i-1 ausgeführt werden. der Vergleich "i! = j" kann dann entfernt werden, die Werte für die Übereinstimmung werden dann halbiert (1 = Paar, 2 = 2 Paare usw.)
quelle