Python扑克牌代码疑问:卡牌创建方式及符号调用报错排查
扑克牌代码问题解答
原代码
import random, time from enum import Enum class CardSuits(Enum): Hearts = "Hearts" Diamonds = "Diamonds" Clubs = "Clubs" Spades = "Spades" class CardValues(Enum): Two = 2 Three = 3 Four = 4 Five = 5 Six = 6 Seven = 7 Eight = 8 Nine = 9 Ten = 10 Jack = "J" Queen = "Q" King = "K" Ace = "A" class Card: _symbols = {"Hearts": "♥️", "Diamonds": "♦️", "Clubs": "♣️", "Spades": "♠"} def __init__(self, suit: CardSuits, value: CardValues) -> None: self.suit = suit self.value = value def __str__(self) -> str: return f"{self.value.name}{self._symbols[self.suit.name]}" def __repr__(self) -> str: return f"{self.value.name}{self._symbols[self.suit.name]}" def start(): play = input("You wanna play? ") if play.lower() in ("yes", "sure", "yeah"): unique_cards = set() while len(unique_cards) < 5: unique_cards.add(Card(random.choice(list(CardValues)), random.choice(list(CardSuits)))) cards = list(unique_cards) print("Your cards are:", ", ", cards) time.sleep(4)
单张卡牌创建示例
card = Card(CardSuits.Clubs, CardValues.Ace)
疑问解答
1. 示例的作用
这个示例只是单张卡牌创建的参考,不需要手动创建一副牌的每一张。如果要生成完整的一副牌,建议用循环遍历所有花色和点数的组合,比如:
def create_deck(): deck = [] for suit in CardSuits: for value in CardValues: deck.append(Card(suit, value)) return deck
2. {self._symbols[self.suit.name]}报错的解决方法
报错核心原因是**start函数中创建Card实例时参数顺序颠倒**:Card类的__init__要求第一个参数是花色(CardSuits),第二个是点数(CardValues),但原代码把点数传成了花色,导致self.suit是CardValues实例,self.suit.name是点数名称(比如"Ace"),而_symbols字典里没有这些键,触发KeyError。
修复方案:
- 调整
Card实例的参数顺序; - 给
Card类添加相等判断和哈希方法,确保set能正确识别重复卡牌:
class Card: _symbols = {"Hearts": "♥️", "Diamonds": "♦️", "Clubs": "♣️", "Spades": "♠"} def __init__(self, suit: CardSuits, value: CardValues) -> None: self.suit = suit self.value = value def __str__(self) -> str: return f"{self.value.name}{self._symbols[self.suit.name]}" def __repr__(self) -> str: return f"{self.value.name}{self._symbols[self.suit.name]}" # 添加相等判断逻辑 def __eq__(self, other): if not isinstance(other, Card): return False return self.suit == other.suit and self.value == other.value # 添加哈希方法,让Card实例可以存入set def __hash__(self): return hash((self.suit, self.value)) def start(): play = input("You wanna play? ") if play.lower() in ("yes", "sure", "yeah"): unique_cards = set() while len(unique_cards) < 5: # 修正参数顺序:先花色,后点数 unique_cards.add(Card(random.choice(list(CardSuits)), random.choice(list(CardValues)))) cards = list(unique_cards) # 优化打印格式 print("Your cards are:", ", ".join(map(str, cards))) time.sleep(4)
3. 当前代码的可行性
原代码不可行,存在两个关键问题:
- 参数顺序颠倒导致的
KeyError; Card类未实现__eq__和__hash__,set无法正确判断卡牌是否重复,会出现同一卡牌多次加入的情况。
按照上述方法修正后,代码可以正常运行,能生成5张不重复的卡牌并正确显示符号,后续可以基于修正后的代码继续开发剩余功能。
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

