在python中,如何对一手扑克(列表)进行排序并检测它是直牌还是皇室同花顺牌

在python中,如何对一手扑克(列表)进行排序并检测它是直牌还是皇室同花顺牌,python,list,sorting,poker,Python,List,Sorting,Poker,我正在尝试用python创建一个扑克程序,在那里我得到了一只手,就像下面的一只。我要做的是对手进行排序,如果为真,则返回真。我需要知道它是否是直的,如果它是皇家同花顺的 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]&g

我正在尝试用python创建一个扑克程序,在那里我得到了一只手,就像下面的一只。我要做的是对手进行排序,如果为真,则返回真。我需要知道它是否是直的,如果它是皇家同花顺的

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分,但当我拿到直道时,我会处理低分的问题。首先,一个将卡片转换为数字的函数。我使用
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)
现在,来对付直人。首先,我们检查是否有一张王牌(因为它的值为14,所以总是排序手的最后一张牌)。如果有一张a牌,手牌中最低的(第一张,排序时)牌是2,我们假设a牌是低牌(因为这是唯一可能构造直牌的方法),并检查其余牌是否完成直牌。否则,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))
既然我们已经完成了最难的部分,我们就开始与皇室同花顺。皇家同花顺既是直牌又是同花顺牌,最高的牌是A:

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

你怎么能有一张4张牌的直牌?@Signal:这是一张l̶a̶m̶e̶非扑克玩家的直牌。当你尝试检测手牌时,你会发现,字符串是表示牌的可怕方式。考虑到这一点,“isStraight()”函数必须首先对手进行排序…并以“J”>“T”、“Q”>“J”等方式进行排序。然后,还必须对车轮(2345A)进行特殊处理。