Python Rock, Paper, Scissors游戏出现结果重复打印问题
石头剪刀布游戏重复打印结果问题修复
问题原因
determine_winner内同层级的选择判断使用了连续if而非elif,触发平局递归后,旧栈帧仍会继续执行后续判断。- 全局变量存储对局选择,递归的新对局会覆盖全局值,导致旧栈帧执行后续判断时读到新对局的变量,触发重复打印。
修复方案
- 调整
determine_winner的判断结构,将同层级的if改为if-elif,匹配到对应分支后不再执行后续同层级判断。 - 给
user_choice内无效输入的递归调用加return,终止当前栈帧的残留执行。
核心修改代码
def user_choice(): choice = input("Please choose - Rock, Paper, or Scissors? ") global choice_int choice_int = int() if choice == "Rock" or choice == "rock": choice_int = 1 elif choice == "Paper" or choice == "paper": choice_int = 2 elif choice == "Scissors" or choice == "scissors": choice_int = 3 else: print("That is not a valid choice.") # 加return确保递归返回后当前栈帧直接退出 return user_choice() def determine_winner(): if choice_int == 1: if choice == 1: Tied() # 后续if改为elif elif choice == 2: print(PaperVRock(), Loser()) elif choice == 3: print(RockVScissors(), Winner()) if choice_int == 2: if choice == 1: print(PaperVRock(), Winner()) elif choice == 2: Tied() elif choice == 3: print(ScissorsVPaper(), Loser()) if choice_int == 3: if choice == 1: print(RockVScissors(), Loser()) elif choice == 2: print(ScissorsVPaper(), Winner()) elif choice == 3: Tied()
额外优化建议
如果需要彻底规避全局变量的风险,可以将玩家选择、电脑选择作为函数参数传递,而非用全局变量存储,从根源上避免递归过程中变量被意外覆盖。
内容的提问来源于stack exchange,提问作者green_bean
相关产品推荐
相关产品推荐

