在python中你怎么能对扑克牌(列表)进行排序并检测它是直接还是皇家同花顺

时间:2016-04-10 04:44:42

标签: python list sorting poker

我正在尝试用python创建一个扑克程序,我得到一个像下面那样的牌。我想要做的是对手进行排序,然后如果为True则返回true。如果它是皇家同花顺,我需要知道它是否也是直的。

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))

需要进行排序并返回,如果它是直的和/或是皇家同花顺

1 个答案:

答案 0 :(得分:2)

不幸的是,Aces可以高或低,这取决于什么产生更好的牌。我最初会把它们评价为14,但是当我到达直道时我会处理低的A值。首先,将卡转换为数字的功能。我使用dict来查找面部卡的值:

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]]

现在对手进行排序很简单:

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

检查同花顺就像确保所有其他牌的套装与第一张牌的套装相匹配一样简单:

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

现在,要处理直道。首先,我们检查是否有ace(总是排序手的最后一张牌,因为它是值14)。如果有一个ace并且手牌的最低(第一个,当排序时)牌是2,我们假设ace很低(因为这是你可能构建直线的唯一方法)并检查剩下的牌是否完成直行。否则,ace会自动为高,所以我们检查每张卡的值是否高于前一个:

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))

现在我们已经完成了艰难的任务,我们继续进行皇家同花顺。皇家同花顺既是直接的也是同花顺的,其中最高牌是王牌:

def is_royal_flush(hand):
    hand = sorted(hand, key=to_number)
    return hand[-1][0] == 'A' and is_straight(hand) and is_flush(hand)