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
相关产品推荐
相关产品推荐

