You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:07:42