2016-03-22 3 views
2

Ich brauche das Verfahren mit einer Zeile wie folgt zu starten: public static Hand chooseBestHand(ArrayList<Hand> hands) throws handException {Wie sollte ich eine Methode entwickeln, die Hände eines Pokerspiels vergleicht und das Beste zurückgibt?

ich einige Hinweise nur brauchen. edit: Der Grund, warum ich eine Ausnahme habe, ist für das Ereignis, dass zwei Hände gebunden sind.

+2

Mein Tipp ist, stattdessen einen 'Comparator ' zu schreiben. –

+1

Werfen Sie keine Ausnahme, wenn zwei Hände gebunden sind. Machen Sie sie vergleichbar und geben Sie 0 zurück. –

+0

@ cricket_007 das macht nicht viel Sinn. Die Methode ist kein Komparator. Es verwendet einen Komparator, um die beste Hand zurückzugeben. Es kann sinnvoll sein, null oder Optional.empty() zurückzugeben, wenn es nicht die beste Hand gibt, aber es ist nicht sinnvoll, eine 0 zurückzugeben, wenn Sie eine Liste vergleichen. – sprinter

Antwort

0

Sie haben nach Hinweisen gefragt, also werde ich keinen Code vorschlagen.

  • allererst Sie Suit, Card und Hand Klassen definieren müssen.
  • Dann benötigen Sie eine Klasse (im Idealfall eine Enumeration), die alle Arten von Poker-Hände mit Methoden listet sie zu identifizieren und zu zwei Händen des gleichen Typs
  • Sie können zu vergleichen, dann eine Comparator definieren, die zwei Hände vergleicht durch den Vergleich ihre Typen oder, wenn sie vom selben Typ sind, Aufruf der Methode für diesen Typ, um die beiden Hände zu vergleichen.
  • Ihre chooseBestHand wird ziemlich trivial: Sortieren Sie mit dem definierten Komparator und nehmen Sie dann die erste. Wenn es im Vergleich zum zweiten 0 zurückgibt, dann werfen Sie Ihre Ausnahme.
0

So wie ich es nähern würde, ist eine Reihe von Klassifizierungsmethoden zu schreiben: isStraightFlush (Hand h) gibt true zurück, wenn die Hand ein Straight Flush ist, isFourOfAKind (Hand h) liefert true, wenn die Hand zu viert eine Art, usw. runter bis isPair (Hand h).

Dann würde ich eine Reihe von Vergleichsmethoden schreiben: compareStraightFlushs (ArrayList Hände) vergleicht eine Liste von Händen, die bereits als Straight Flushs identifiziert wurden, vergleichenFourOfAKinds (ArrayList Hände) vergleicht eine Liste von Händen, die bereits identifiziert wurden Vier von einer Art, etc. Vergessen Sie nicht, dass Sie in Ihren Methoden compareTwoPairs, comparePair und compareHighCard auch 1, 3 und 4 "Kicker" -Karten betrachten müssen. (Beachten Sie, dass Sie keine Kicker in compareThreeOfAKind suchen müssen, obwohl es zwei "unbenutzte" Karten in der Hand gibt.)

Ich würde wahrscheinlich auch eine Hilfsmethode findHighCard (Hand h, Boolean isStraight) schreiben gibt den Wert der höchsten Karte in der Hand zurück, aber wenn das Argument isStraight wahr ist und die Hand ein Ass enthält, muss überprüft werden, ob die Hand auch einen König enthält, um zu bestimmen, ob das Ass als hoch oder niedrig verwendet wird.

Natürlich gibt es weitere Details zu beachten, aber sobald Sie Ihren Klassifikator und die Vergleichsmethoden installiert haben, müssen Sie nur noch für jede Hand isStraightFlush aufrufen und sehen, wie viele Treffer Sie erhalten. Wenn eine Hand wahr ist, ist das dein Gewinner. Wenn zwei oder mehr true zurückgeben, müssen Sie compareStraightFlushs (ArrayList-Hände) aufrufen, und derjenige, den es zurückgibt, ist der Gewinner. Wenn für isStaightFlush keine Hände den Wert true zurückgibt, werden Sie mit dem Aufruf von isFourOfAKind für jede Hand fortfahren. Sie werden auf diese Weise fortfahren und die Klassifizierermethoden in absteigender Reihenfolge aufrufen, bis Sie mindestens einen Treffer erhalten und die Vergleichsmethoden aufgerufen haben wenn du mehr als eins bekommst.

Verwandte Themen