2016-04-10 9 views
0

Ich versuche ein Poker-Programm mit Python zu erstellen, wo ich eine Hand wie die unten bekomme. Was ich tun möchte ist, die Hand zu sortieren und dann wahr zurückzugeben, wenn es wahr ist. Ich muss wissen, ob es auch ein Straight ist, wenn es ein Royal Flush ist.In Python wie kann man eine Hand von Poker (Liste) sortieren und erkennen, ob es ein Straight oder ein Royal Flush ist

hand=['Jc','2h','6d','Th','Kd'] 

def has_straight(hand): 

    if hand[4][0] >hand[3][0] and hand[3][0]>hand[2][0] and hand[2][0]>hand[1][0] and hand[1][0]>hand[0][0]: 
     return True 
    else: 
     return False 

hand.sort() 

print (has_straight(hand)) 

Bedarf sortiert und Rückkehr werden, wenn es sich um eine gerade und/oder ist

+1

Wie kann man eine Straight mit 4 Karten haben? – Signal

+1

@Signal: Es ist ein l̶a̶m̶e̶ Nicht-Pokerspieler Straight. – zondo

+0

Strings sind eine schreckliche Art, Karten darzustellen, wie Sie sehen werden, wenn Sie versuchen, Hände zu erkennen. Vorausgesetzt, dass die "isStraight()" - Funktion zuerst die Hand sortieren muss ... und so, dass "J"> "T", "Q"> "J" und so weiter. Dann müssen Sie auch das Rad (2345A) Sonderfall. –

Antwort

2

Leider ein Royal Flush ist, Asse können hoch oder niedrig sein, je nachdem, was eine bessere Hand produziert. Ich werde sie anfangs als 14 bewerten, aber mit niedrigen Assen umgehen, wenn ich auf Geraden komme. Erstens, eine Funktion, um eine Karte in eine Zahl umzuwandeln. Ich benutze einen dict den Wert der Bildkarten zu sehen:

FACE_CARDS = {'T': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14} 
def to_number(card): 
    if card[0].isnumeric(): 
     return int(card[0]) 
    else: 
     return FACE_CARDS[card[0]] 

eine Hand Sortierung ist nun einfach:

hand=['Jc','2h','6d','Th'] 
hand.sort(key=to_number) 
print(hand) 
# prints ['2h','6d','Th','Jc'] 

für einen Flush Überprüfung so einfach ist, den Anzug aller anderen Karten wie dafür, dass Passen Sie den Anzug der ersten Karte:

def is_flush(hand): 
    test_suit = hand[0][1] 
    return all(card[1] == test_suit for card in hand) 

Nun, mit Geraden zu tun haben. Zuerst überprüfen wir, ob es ein Ass gibt (immer die letzte Karte einer sortierten Hand, da es Wert 14 ist). Wenn es ein Ass gibt und die niedrigste (zuerst, wenn sortiert) Karte der Hand eine Zwei ist, nehmen wir an, dass das Ass niedrig ist (da dies die einzige Möglichkeit ist, eine Straße zu konstruieren) und prüfen, ob die restlichen Karten die Karte vervollständigen Gerade. Ansonsten ist das Ass automatisch hoch, so prüfen wir, dass der Wert jedes Karte ist eine höher als die vorherige:

def is_straight(hand): 
    hand = sorted(hand, key=to_number) 
    if hand[-1][0] == "A" and hand[0][0] == "2": 
     # Check that the remaining cards complete the straight 
     return list(map(to_number, hand[1:-1])) == list(range(3, len(hand)+1)) 
     # You can skip conversion to lists for Python 2 
    else: 
     return all(to_number(hand[i])+1 == to_number(hand[i+1]) for i in range(len(hand)-1)) 

Nun, da wir das harte Teil getan haben, wir auf der der Royal Flush zu bewegen. Ein Royal Flush ist sowohl ein Straight als auch ein Flush, wobei die höchste Karte ein Ass ist: