You need to enable JavaScript to run this app. Python Rock, Paper, Scissors游戏出现结果重复打印问题
优惠活动
大模型
产品
解决方案
定价
更多

Python Rock, Paper, Scissors游戏出现结果重复打印问题

石头剪刀布游戏重复打印结果问题修复

问题原因

  • determine_winner 内同层级的选择判断使用了连续if而非elif,触发平局递归后,旧栈帧仍会继续执行后续判断。
  • 全局变量存储对局选择,递归的新对局会覆盖全局值,导致旧栈帧执行后续判断时读到新对局的变量,触发重复打印。

修复方案

  1. 调整determine_winner的判断结构,将同层级的if改为if-elif,匹配到对应分支后不再执行后续同层级判断。
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 23:06:07