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

Python OOP卡牌游戏无输出及类型错误排查求助

Python OOP卡牌游戏问题修复与完整实现

问题背景

开发一款基于OOP的卡牌游戏,核心规则:

  • 玩家选择红组(Hearts、Diamonds)或黑组(Clubs、Spades)
  • 初始分数1000,抽到同组花色卡牌加分,不同组扣分
  • 运行时遇到两个问题:无法显示抽到的卡牌,且出现TypeError: 'str' object is not callable错误

错误原因分析

  1. 变量名冲突:代码中存在将字符串类型变量后续赋值为Game实例的情况,若同名变量被当作函数调用,会触发类型错误
  2. Card类参数顺序错误:Deck构建卡牌时传入的参数顺序与Card类的__init__方法定义不符,导致花色和数值颠倒
  3. 未执行抽牌操作:创建Game实例后,未调用抽牌方法从卡组中获取卡牌,导致手牌为空
  4. 方法调用错误:调用showHand时未加括号,未实际执行显示手牌的方法

修复后的完整代码(带规则注释)

import random

class Card:
    def __init__(self, value, suit):
        # 卡牌数值与花色
        self.value = value
        self.suit = suit
        # 将数值转换为卡牌名称(J/Q/K/A)
        self.name = self._get_card_name()

    def _get_card_name(self):
        """转换数值为卡牌名称"""
        if self.value == 1:
            return "Ace"
        elif self.value == 11:
            return "Jack"
        elif self.value == 12:
            return "Queen"
        elif self.value == 13:
            return "King"
        else:
            return str(self.value)

    def show(self):
        """显示卡牌信息"""
        print(f"{self.name} of {self.suit}")

class Deck:
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        """构建标准52张卡牌"""
        suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
        for suit in suits:
            for value in range(1, 14):
                self.cards.append(Card(value, suit))

    def shuffle(self):
        """洗牌"""
        random.shuffle(self.cards)

    def draw_card(self):
        """从卡组顶部抽一张牌"""
        return self.cards.pop() if self.cards else None

class Game:
    def __init__(self, player_name, initial_score=1000):
        self.player_name = player_name
        self.score = initial_score
        self.hand = []
        # 玩家选择的组别(红/黑)
        self.team = None

    def set_team(self, team):
        """设置玩家组别"""
        self.team = team.lower()

    def draw(self, deck):
        """从卡组抽一张牌到手牌"""
        card = deck.draw_card()
        if card:
            self.hand.append(card)
        return self

    def show_hand(self):
        """显示当前手牌"""
        if not self.hand:
            print("你还没有抽到卡牌!")
            return
        print(f"\n{self.player_name}的手牌:")
        for card in self.hand:
            card.show()

    def calculate_score(self):
        """根据当前手牌计算分数变化"""
        if not self.hand:
            return
        card = self.hand[-1]
        # 定义红组和黑组花色
        red_suits = ['Hearts', 'Diamonds']
        black_suits = ['Clubs', 'Spades']

        # 根据组别判断分数变化
        if self.team == 'red':
            if card.suit in red_suits:
                self.score += 100
                print(f"抽到红组卡牌,加100分!当前分数:{self.score}")
            else:
                self.score -= 50
                print(f"抽到黑组卡牌,扣50分!当前分数:{self.score}")
        elif self.team == 'black':
            if card.suit in black_suits:
                self.score += 100
                print(f"抽到黑组卡牌,加100分!当前分数:{self.score}")
            else:
                self.score -= 50
                print(f"抽到红组卡牌,扣50分!当前分数:{self.score}")
        # 清空手牌准备下一轮
        self.hand.clear()

# 游戏主流程
print("=== 欢迎来到红黑卡牌游戏 ===")
player_name = input("请输入你的名字:")
print(f"{player_name},你的初始分数为1000分!")

# 选择组别
while True:
    team = input("请选择你的组别(RED/BLACK):").strip()
    if team.lower() in ['red', 'black']:
        break
    print("输入无效,请输入RED或BLACK!")

# 初始化游戏
game = Game(player_name)
game.set_team(team)

# 游戏循环
while True:
    print("\n--------------------------")
    play_input = input("按ENTER开始本轮游戏,输入'quit'退出:").strip()
    if play_input.lower() == 'quit':
        print(f"游戏结束!最终分数:{game.score}")
        break
    if not play_input:
        # 初始化卡组并洗牌
        deck = Deck()
        deck.shuffle()
        print("卡组已洗牌完成!")

        # 抽牌
        input("按ENTER抽取卡牌:")
        game.draw(deck)

        # 显示卡牌并计算分数
        game.show_hand()
        game.calculate_score()

关键修复与优化点

  • 修正参数顺序:Card类的__init__调整为value, suit,Deck构建卡牌时对应传入,确保卡牌信息正确
  • 避免变量冲突:将玩家名字变量改为player_name,Game实例用game,防止字符串变量与实例变量混淆
  • 完善抽牌逻辑:Deck类新增draw_card()方法,Game类通过draw()方法从卡组抽牌,确保手牌有内容
  • 方法正确调用:调用show_hand()时添加括号,执行显示操作
  • 补充规则逻辑:新增分数计算逻辑,根据所选组别判断加分/扣分,完善游戏流程
  • 代码可读性:添加注释说明各方法功能,优化变量命名,提升代码维护性

内容的提问来源于stack exchange,提问作者Yoshith Kotla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:45:10