Python中扑克的直接同花顺和皇家同花顺



这是我迄今为止为扑克游戏准备的一些代码,我得到了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

确保低值手不会短路较高值的手

如果你重新排列手牌条件的顺序,把更高值的测试放在第一位,你会先抓住更具体的情况,你不会意外地过早返回。

你可以认为手有两种非排他性类型:基于西装和基于面部。西装条件为"齐平"或"非齐平",因此最好提前标记这一点。 然后你有一个面部组合,其中一些与flush_flag"相交"以增加它们的价值。

或者......你可以按照你的方式保持你的手牌测试的顺序,它可能更理想,因为你正在更早地测试更频繁的手牌。如果这样做,请确保条件是"完整的"。也就是说,如果手是两双手,您还必须确保它不是两双手或任何其他包含两双手的手。你正在用你的faces.count(2( == 1和faces.count(1( == 3来做这件事。您需要遵循与直线和同花顺相同的"完整性"。

最新更新