python - python 扑克中的同花顺和皇家同花顺

标签 python poker

这是我迄今为止的扑克游戏代码,我得到了 def main 来显示一些手牌,但我无法弄清楚如何获得同花顺和皇家同花顺。另外我该如何做高卡?

卡号值 0-12 是一套,13-25 是下一套,26-38 和 39-51。

此外,如果有人可以告诉我如何将这个 PokerHand 类实现到另一个 def 主窗口中。

class PokerHand:

"""class for representing a poker hand"""

# Poker value of hands in increasing order so they can be compared
HIGH_CARD = 0
TWO_OF_A_KIND = 1
TWO_PAIRS = 2
THREE_OF_A_KIND = 3
STRAIGHT = 4
FLUSH = 5
FULL_HOUSE = 6
FOUR_OF_A_KIND = 7
STRAIGHT_FLUSH = 8

# hand names for printing the card names
HAND_NAMES = ('High Card', 'Two of a Kind', 'Two Pairs', 'Three of a Kind',
             'Straight', 'Flush', 'Full House', 'Four of a Kind',
             'Straight Flush')


#------------------------------------------------------------------

def __init__(self):

    """initialize empty hand"""

    self.cards = []

#------------------------------------------------------------------

def addCard(self, cardNumber):

    """add cardNumber to the hand"""

    self.cards.append(cardNumber)

#------------------------------------------------------------------

def evalHand(self):

    """determine the value of the hand and return a tuple; the
    first value in the tuple is an integer corresponding to the
    hand value using the constants HIGH_CARD, TWO_OF_A_KIND, etc.;
    the remaining values in the tuple depend on the type of hand
    and are described below to break ties based on the face values
    of the cards

    for HIGH_CARD, it is five values: the face values sorted in
    descending order

    for TWO_OF_A_KIND, it is four values: the face value for the
    pair, followed by the face values of the other cards in
    descending order

    for TWO_PAIRS, it is three values: the face value of the
    higher pair, the face value of the lower pair, followed by the
    face value of the other card

    for THREE_OF_A_KIND, it is three values: the face value of the
    three of a kind, followed by the face value of the other two
    cards in descending order

    for STRAIGHT, it is one value: the face value of the lowest
    card in the straight

    for FLUSH, it is five values: the face values sorted in
    descending order

    for FULL_HOUSE, it is two values: the face value of the three
    of a kind, followed by the face value of the pair

    for FOUR_OF_A_KIND, it is two values: the face value that
    there are four of followed by the face value that there is one
    of

    for STRAIGHT_FLUSH, it is one value: the face value of the
    lowest card in the straight"""

    faces = [0,0,0,0,0,0,0,0,0,0,0,0,0]
    for value in self.cards:
        face = value % 13
        faces[face] += 1

    suits = [0,0,0,0]
    for value in self.cards:
        suit = value // 13
        suits[suit] += 1

    if faces.count(2) == 1 and faces.count(1) == 3:
        return self.TWO_OF_A_KIND
    elif faces.count(2) == 2 and faces.count(1) == 1:
        return self.TWO_PAIRS
    elif faces.count(3) == 1 and faces.count(1) == 2:
        return self.THREE_OF_A_KIND
    elif faces.count(3) == 1 and faces.count(2) == 1:
        return self.FULL_HOUSE
    elif faces.count(4) == 1 and faces.count(1) == 1:
        return self.FOUR_OF_A_KIND
    elif faces.count(1) == 5:
        pos = faces.index(1)
        if faces[pos:pos+5] == [1,1,1,1,1] or faces[pos:pos+13] == [1,0,0,0,0,0,0,0,0,1,1,1,1]:
            return self.STRAIGHT
    if suits.count(5) == 1 and suits.count(1) == 0:
        return self.FLUSH
    if suits.count(5) == 1 and faces.count(1) == 5:
        pos = faces.index(1)
        if faces[pos:pos + 5] == [1, 1, 1, 1, 1] or faces[pos:pos + 13] == [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]:
            return self.STRAIGHT_FLUSH
    return self.STRAIGHT_FLUSH

#----------------------------------------------------------------------

def main():
   hand = PokerHand()
   hand.addCard(9)
   hand.addCard(10)
   hand.addCard(8)
   hand.addCard(11)
   hand.addCard(7)

   r = hand.evalHand()
   print(r)
   print(PokerHand.HAND_NAMES[r])


if __name__ == '__main__':
  main()

最佳答案

考虑将手部条件语句放入函数中

这将提高代码的可读性并使其更易于测试。 例如

def is_flush(suits):
    return suits.count(5) == 1

确保较低值(value)的牌不会与较高值(value)的牌短路

如果您重新排列手牌条件的顺序,首先放置更高值的测试,您将首先捕获更具体的情况,并且您不会意外地过早返回。

您可以将手视为两种非专有类型:基于套装和基于面。套装条件是“同花”或“非同花”,因此提前标记这一点可能会很好读。 然后你就有了一个面部组合,其中一些与flush_flag“相交”以增加它们的值。

或者...您可以按照现有的方式保持您的牌局测试顺序,这可能会更理想,因为您正在更早地测试更频繁的牌局。如果您这样做,请确保您的条件是“完整的”。 IE。如果这手牌是二同牌,您还必须确保它不是两对或任何其他包含二同牌的牌。您正在使用 faces.count(2) == 1 和 faces.count(1) == 3 执行此操作。您需要遵循 STRAIGHT 和 FLUSH 相同的“完整性”。

关于python - python 扑克中的同花顺和皇家同花顺,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59025431/

相关文章:

python - docker "ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network"

python - 如何根据列表中的某个值将列表中的值相加?

c++ - 使用 pokerstove 库提高性能

ios - 适用于iOS的交叉编译库(poker-eval)

c# - 设计模式 : Parsing similar, 但文本文件中的模式不同

data-mining - sharkscope或PTR数据究竟如何挖掘所有这些手?

python - 基于python中嵌套列表中的列表之一进行排序

Python tkinter 将 Canvas 保存为 postscript 并添加到 pdf

javascript - 扑克牌生成器和评估器

python - 加入所有 PostgreSQL 表并制作一个 Python 字典