from enum import Enum from typing import List, Tuple from .card import Card, Rank class HandType(Enum): # 短牌规则:同花 > 葫芦 HIGH_CARD = (1, "High Card") ONE_PAIR = (2, "Pair") TWO_PAIR = (3, "Two Pair") THREE_OF_A_KIND = (4, "Three of a Kind") STRAIGHT = (5, "Straight") FULL_HOUSE = (6, "Full House") FLUSH = (7, "Flush") FOUR_OF_A_KIND = (8, "Four of a Kind") STRAIGHT_FLUSH = (9, "Straight Flush") ROYAL_FLUSH = (10, "Royal Flush") def __new__(cls, strength, name): obj = object.__new__(cls) obj._value_ = strength obj.strength = strength obj.type_name = name return obj class HandRanking: def __init__(self, hand_type: HandType, key_ranks: List[Rank], cards: List[Card]): self.hand_type = hand_type self.key_ranks = key_ranks # 用于比较的关键点数 self.cards = cards # 组成这个ranking的5张牌 def __str__(self): if self.hand_type == HandType.FOUR_OF_A_KIND: return f"Quad({self.key_ranks[0].symbol})" elif self.hand_type == HandType.FULL_HOUSE: return f"Full House({self.key_ranks[0].symbol} over {self.key_ranks[1].symbol})" elif self.hand_type == HandType.FLUSH: return f"Flush({self.key_ranks[0].symbol} high)" elif self.hand_type == HandType.STRAIGHT: return f"Straight({self.key_ranks[0].symbol} high)" elif self.hand_type == HandType.STRAIGHT_FLUSH: if self.key_ranks[0] == Rank.ACE: return "Royal Flush" else: return f"Straight Flush({self.key_ranks[0].symbol} high)" elif self.hand_type == HandType.ROYAL_FLUSH: return "Royal Flush" elif self.hand_type == HandType.THREE_OF_A_KIND: return f"Three of a Kind({self.key_ranks[0].symbol})" elif self.hand_type == HandType.TWO_PAIR: return f"Two Pair({self.key_ranks[0].symbol} and {self.key_ranks[1].symbol})" elif self.hand_type == HandType.ONE_PAIR: return f"Pair({self.key_ranks[0].symbol})" else: return f"High Card({self.key_ranks[0].symbol})" def __lt__(self, other): """比较牌力,用于排序""" if not isinstance(other, HandRanking): return NotImplemented if self.hand_type.strength != other.hand_type.strength: return self.hand_type.strength < other.hand_type.strength for my_rank, other_rank in zip(self.key_ranks, other.key_ranks): if my_rank.numeric_value != other_rank.numeric_value: return my_rank.numeric_value < other_rank.numeric_value return False def get_strength(self) -> int: # 返回牌力 还是 牌型+点数 # 基础强度 = 牌型强度 * 1000000 strength = self.hand_type.strength * 1000000 for i, rank in enumerate(self.key_ranks): strength += rank.numeric_value * (100 ** (4 - i)) return strength