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

