我正在尝试用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))


如果是直线和/或皇家同花顺,则需要分类并返回

最佳答案

不幸的是,ace值可以高也可以低,这取决于产生更好牌的方法。最初,我将它们的值为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)


现在,处理直道。首先,我们检查一下是否有一张A(由于该牌的总值为14,所以它始终是最后一手牌)。如果有一张王牌,而手牌中最低(第一张,排序时)的牌是两张,则我们假设该王牌是低牌(因为这是构造直线的唯一方法),并检查剩余的牌是否完整直行。否则,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))


现在我们已经完成了艰苦的工作,接下来继续进行皇家同花顺。皇家同花顺既是同花顺又是同花顺,其中最高的牌是ace:

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

关于python - 在python中如何排序一手扑克(列表)并检测出是同花顺还是同花顺,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36525890/

10-09 18:33