from functools import total_ordering from enum import Enum from typing import List, Tuple, Optional class Suit(Enum): SPADES = 's' # 黑桃 HEARTS = 'h' # 红桃 DIAMONDS = 'd' # 方块 CLUBS = 'c' # 梅花 def __str__(self): return self.value class Rank(Enum): TWO = (2, '2') THREE = (3, '3') FOUR = (4, '4') FIVE = (5, '5') SIX = (6, '6') SEVEN = (7, '7') EIGHT = (8, '8') NINE = (9, '9') TEN = (10, 'T') JACK = (11, 'J') QUEEN = (12, 'Q') KING = (13, 'K') ACE = (14, 'A') def __new__(cls, value, symbol): obj = object.__new__(cls) obj._value_ = value obj.numeric_value = value obj.symbol = symbol return obj def __str__(self): return self.symbol def __eq__(self, other): if isinstance(other, Rank): return self.numeric_value == other.numeric_value return NotImplemented def __lt__(self, other): if isinstance(other, Rank): return self.numeric_value < other.numeric_value return NotImplemented def __hash__(self): return hash(self.numeric_value) @total_ordering class Card: def __init__(self, rank: Rank, suit: Suit): self.rank = rank self.suit = suit def __str__(self): return f"{self.rank}{self.suit}" def __eq__(self, other): if isinstance(other, Card): return self.rank == other.rank and self.suit == other.suit return NotImplemented def __lt__(self, other): if isinstance(other, Card): if self.rank != other.rank: return self.rank < other.rank return self.suit.value < other.suit.value return NotImplemented @classmethod def createCard(cls, card_str) -> 'Card': if len(card_str) != 2: raise ValueError(f"Invalid card string: {card_str}") rank_char = card_str[0] suit_char = card_str[1].lower() # 查找rank rank = None for r in Rank: if r.symbol == rank_char: rank = r break if rank is None: raise ValueError(f"Invalid rank: {rank_char}") # 查找suit suit = None for s in Suit: if s.value == suit_char: suit = s break if suit is None: raise ValueError(f"Invalid suit: {suit_char}") return cls(rank, suit) @classmethod def parseCards(cls, cards_str) -> List['Card']: """ 从字符串拆解多张牌, "AsKs AhAdAc6s7s" """ cards_str = cards_str.strip() if not cards_str: return [] # 将字符串分割成单独的牌 card_strings = [] i = 0 while i < len(cards_str): if cards_str[i].isspace(): i += 1 continue if i + 1 < len(cards_str): card_str = cards_str[i:i+2] card_strings.append(card_str) i += 2 else: raise ValueError(f"Invalid card format at position {i}") return [cls.createCard(card_str) for card_str in card_strings]