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

Python类对象使用故障:程序未正确输出玩家获胜结果求助

问题排查与修复方案

你的代码出现平局的核心原因是两处细节错误,导致分数计算完全失效,以下是具体问题和修复方法:

1. 方法调用未加括号,拿不到实际值

在CalculateValue函数里,你直接引用了GetColour和GetNumber方法本身,而不是调用它们获取返回值:

Colour = Player_Hand.GetColour  # 这里存的是方法对象,不是颜色字符串
Numbers = Player_Hand.GetNumber  # 这里存的是方法对象,不是数字

后续的数值/字符串比较永远不成立,所有卡片的数字分和颜色分都没加上,最终两人分数都是0,自然显示平局。

修复: 给方法加括号,调用后获取实际值:

Colour = Player_Hand.GetColour()
Numbers = Player_Hand.GetNumber()

2. 颜色字符串大小写不匹配

创建黄色卡片时用的是小写"yellow"(比如IYellow = Card(1, "yellow")),但计算分数时判断的是大写首字母"Yellow":

if Colour == "Yellow":  # 大小写不匹配,永远触发不了
    Score = Score + 15

黄色卡片的颜色分完全没加上,进一步导致分数计算错误。

修复: 把判断条件改成小写的"yellow":

if Colour == "yellow":
    Score += 15

修复后的完整代码

#Part A i:
class Card:
    # __Number as Integer
    # __Colour as String
    def __init__(self, Number, Colour):
        self.Number = Number
        self.Colour = Colour
    # 补充__str__/__repr__,让打印卡片更直观
    def __str__(self):
        return f"Card({self.Number}, '{self.Colour}')"
    def __repr__(self):
        return self.__str__()

#Part A ii:
    def GetNumber(self):
        return self.Number
    def GetColour(self):
        return self.Colour

#Part A iii:
IRed = Card(1, "red")
IIRed = Card(2, "red")
IIIRed = Card(3, "red")
IVRed = Card(4, "red")
VRed = Card(5, "red")
IBlue = Card(1, "blue")
IIBlue = Card(2, "blue")
IIIBlue = Card(3, "blue")
IVBlue = Card(4, "blue")
VBlue = Card(5, "blue")
IYellow = Card(1, "yellow")
IIYellow = Card(2, "yellow")
IIIYellow = Card(3, "yellow")
IVYellow = Card(4, "yellow")
VYellow = Card(5, "yellow")

#Part B i:
class Hand:
      # __Cards as Array of Card
      # __FirstCard as Integer
      # __NumberCards as Integer
      def __init__(self, ICard, IICard, IIICard, IVCard, VCard):
        self.Cards = []
        self.Cards.append(ICard)
        self.Cards.append(IICard)
        self.Cards.append(IIICard)
        self.Cards.append(IVCard)
        self.Cards.append(VCard)
        self.FirstCard = 0
        self.NumberCards = 5

#Part b ii:
      def GetCard(self, index):
            return self.Cards[index]

#Part b iii:
Player_1 = Hand(IRed, IIRed, IIIRed, IVRed, IYellow)
Player_2 = Hand(IIYellow, IIIYellow, IVYellow, VYellow, IBlue)

#Part c i:
def CalculateValue(Player):
    Score = 0
    for index in range(0, 5):
        Player_Hand = Player.GetCard(index)
        Colour = Player_Hand.GetColour()  # 修复:调用方法拿颜色
        Numbers = Player_Hand.GetNumber()  # 修复:调用方法拿数字
        # 简化数字加分逻辑,替代一堆if判断
        Score += Numbers
        if Colour == "red":
            Score += 5
        elif Colour == "blue":
            Score += 10
        elif Colour == "yellow":  # 修复:大小写匹配
            Score += 15
    return Score

#Part c ii:
Player_1Score = CalculateValue(Player_1)
Player_2Score = CalculateValue(Player_2)
# 可选:打印分数方便调试
print(f"Player 1 Score: {Player_1Score}, Player 2 Score: {Player_2Score}")
if Player_1Score > Player_2Score:
          print("Player 1 Won!")
elif Player_1Score < Player_2Score:
          print("Player 2 Won!")
else:
          print("Draw")

额外优化说明

  • 补充了Card类的__str__和__repr__方法,打印卡片对象时会显示Card(数字, '颜色')的清晰格式,解决你之前打印对象显示内存地址的问题。
  • 把数字加分的多个if判断简化为Score += Numbers,逻辑更简洁,结果和原代码一致。

运行修复后的代码,会正确计算出:

  • Player 1得分:(1+2+3+4+1) + (5*4 +15) = 46
  • Player 2得分:(2+3+4+5+1) + (15*4 +10) = 85
    最终输出Player 2 Won!,符合预期。

内容的提问来源于stack exchange,提问作者mahir ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:10:21