编写带积分统计的Python石头剪刀布游戏时积分重置为0的问题排查求助
石头剪刀布游戏积分重置问题的解决办法
嘿,我来帮你搞定这个积分总是重置的问题!你的代码里主要有两个核心问题导致积分无法正确累加,咱们一步步拆解:
问题1:函数参数传递的坑
Python里整数属于不可变类型,当你把points和oppoints作为参数传给result函数时,函数内部修改的只是这两个变量的局部副本,根本不会影响外部定义的全局变量。也就是说,你在函数里points +=1的时候,改的只是函数内部的临时变量,外面的points还是原来的值,看起来就像是每次都重置成0了。
问题2:重复调用result函数的逻辑错误
不管玩家选了石头、布还是剪刀,你每次都调用三次result函数:
result("rock","scissors","papper",points,oppoints) result("papper","rock","scissors",points,oppoints) result("scissors","papper","rock",points,oppoints)
这会导致同一个回合里重复判断三次,逻辑完全混乱,就算参数传递没问题,积分也会算错。
修正后的代码
我把这两个问题都修复了,还修正了拼写错误("papper"改成了正确的"paper"),你可以直接用:
import random points = 0 oppoints = 0 opt = ["rock", "paper", "scissors"] ans = "yes" # 修改函数,让它返回更新后的积分 def result(name, win, loose, current_points, current_oppoints, cho, opp): if cho == name: if opp == win: current_points += 1 print("congrats you got a point") elif opp == loose: current_oppoints += 1 print("you lost the point") else : print("its a tie no one gets a point") return current_points, current_oppoints # 返回更新后的积分 while ans == "yes" : # 先重置积分,准备新一局 points = 0 oppoints = 0 while points < 2 and oppoints < 2 : # 改成and,一方到2分就结束对局 cho = input("rock paper scissors: ").lower() # 转小写避免大小写问题 # 验证输入是否合法 while cho not in opt: print("Invalid input! Please enter rock, paper, or scissors.") cho = input("rock paper scissors: ").lower() opp = random.choice(opt) print("opponent: " + opp) # 根据玩家选择,只调用对应的判断函数 if cho == "rock": points, oppoints = result("rock", "scissors", "paper", points, oppoints, cho, opp) elif cho == "paper": points, oppoints = result("paper", "rock", "scissors", points, oppoints, cho, opp) elif cho == "scissors": points, oppoints = result("scissors", "paper", "rock", points, oppoints, cho, opp) print("Your points:", points) print("Opponent's points:", oppoints) if points > oppoints : print("you win!!") else: print("you lost :(") ans = input("wanna play again?? ").lower() print("good bye")
额外优化点说明
- 把循环条件从
points < 2 or oppoints < 2改成了points < 2 and oppoints < 2,这样只要有一方先拿到2分,就结束当前对局,更符合常规规则。 - 增加了输入验证,避免玩家输入错误的内容导致逻辑出错。
- 把输入转成小写,玩家输入Rock、PAPER这类大小写混合的内容也能正常识别。
内容的提问来源于stack exchange,提问作者Dimitris Malkotsis
相关产品推荐
相关产品推荐

