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

Python while循环实现石头剪刀布的逻辑错误与报错排查

问题根因

两个报错全是缩进错位、逻辑放错位置导致的,没有复杂的语法问题:

  • 输入合法选项仍持续循环:询问是否重玩的resp=input(...)被写到了play_rps函数外面,函数内部的resp一直是初始值'x',永远满足循环条件,外层while是死循环,自然会一直要求输入。同时内层输入校验的while块里混进了电脑选值的逻辑,校验逻辑和游戏逻辑耦合在一起,运行顺序完全混乱。
  • 变量赋值前被引用:computer = random.choice(choices)被放在了内层while user not in choices块里,只要用户第一次就输入正确的r/p/s,根本不会进入这个内层循环,computer从来没被赋值就被后面的print引用,直接触发报错。
修正后完整可运行代码
import random

def isWin(player,opponent):
    if (player=='p' and opponent=='r') or (player=='r' and opponent=='s') or (player=='s' and opponent=='p'):
        return True
    return False


def play_rps():
    choices=['r','p','s']
    resp='x'
    while resp.lower()!='n':
        user=input("'r' for rock, 'p' for paper 's' for scissors: ")
        # 内层循环只做输入合法性校验,不掺杂其他游戏逻辑
        while user not in choices:
            user = input("Wrong choice! please input r/p/s again: ")
        # 校验通过后再生成电脑选择,保证变量一定已赋值
        computer = random.choice(choices)
        print(f'You chose {user} and Computer chose: {computer} ')
        if computer == user:
            print('Draw!')
        elif isWin(user, computer):
            print('You win!')
        else:
            print('You lose!')
        # 每轮结束后询问是否重开,放在循环内部才能更新resp值退出循环
        resp=input('Play again? y/n ')
  

play_rps()
关键修正点
  • 拆分逻辑:内层while循环只负责校验用户输入,直到拿到合法的r/p/s才退出,电脑选值逻辑移到校验通过后执行,从根源上避免user/computer未赋值就被引用的问题
  • 修正所有错位缩进:胜负判定、结果打印、重开询问全部放在外层游戏循环内部,每轮拿到合法输入就正常判定出结果
  • 补全isWin函数返回值:未满足获胜条件时返回False,避免分支判断时出现None值导致的逻辑异常
  • 去掉最后多余的print(play_rps()):函数本身已经实现结果打印,函数无显式return默认返回None,保留这行代码会在游戏结束后多打印一行无意义的None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:18:09