Python实现石头剪刀布游戏时else/elif语句运行异常问题求助
错误排查与修复方案
核心问题点
- 你在获取用户输入后已经通过
upper()方法将输入转为大写,但是elif分支的判断条件使用的是小写的'r'、'p'、's',大小写不匹配导致获胜判断逻辑永远无法触发,所有非平局场景都会直接进入else分支判定为输。 - 使用Python内置关键字
list作为自定义变量名属于不规范写法,可能会导致后续调用列表内置方法时出现异常。
最小改动修复版本
import random # 替换内置关键字变量名 gesture_list = ['R', 'P', 'S'] def play(): x = input('Please input R, P, or S: ').upper() y = random.choice(gesture_list) if x == y: print('You both picked {}, pick again'.format(x)) play() # 判断条件改为大写匹配 elif (x == 'R' and y == 'S') or (x == 'P' and y == 'R') or (x == 'S' and y == 'P'): print('You won! You picked {} and computer picked {}'.format(x,y)) else: print('You lost. You picked {} and computer picked {}'.format(x,y)) play()
可选优化建议
当前平局时使用递归调用play()的方式,如果连续多次平局会触发递归深度超限报错,可以改用循环逻辑实现重玩:
import random gesture_list = ['R', 'P', 'S'] def play(): while True: x = input('Please input R, P, or S: ').upper() y = random.choice(gesture_list) if x == y: print('You both picked {}, pick again'.format(x)) continue elif (x == 'R' and y == 'S') or (x == 'P' and y == 'R') or (x == 'S' and y == 'P'): print('You won! You picked {} and computer picked {}'.format(x,y)) else: print('You lost. You picked {} and computer picked {}'.format(x,y)) break play()
内容的提问来源于stack exchange,提问作者paulnewbie34
相关产品推荐
相关产品推荐

