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

Python循环问题求助:猜拳程序无法退出while循环

问题分析与解决

嘿,这问题其实挺典型的,刚学循环逻辑的时候很容易踩这个坑!

核心问题:循环条件的逻辑错误

你的第一个while循环用了or连接三个判断条件,这会导致无论输入什么,循环永远无法退出。为什么?咱们拆解来看:
假设用户输入了'r',那么:

  • p1_choice != 'r' → 假
  • p1_choice != 's' → 真
  • p1_choice != 'p' → 真
    因为or逻辑只要有一个条件为真,整个表达式就为真,所以循环会一直执行。同理,输入's'或'p'时,另外两个条件也会是真,循环根本停不下来。

另外,第二个循环还有个笔误:你把判断p2_choice的条件里写成了p1_choice,这会导致即使玩家2输入正确,只要玩家1的选择不符合s或p,循环还会继续要求玩家2输入,这明显不对。

修正后的代码方案

推荐两种更清晰的写法:

写法1:用and修正逻辑

把or换成and,表示“当输入既不是r,也不是s,也不是p的时候,继续循环”:

# 初始化变量(避免未定义报错)
p1_choice = ''
p2_choice = ''

while p1_choice != 'r' and p1_choice != 's' and p1_choice != 'p':
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')

# 注意这里把所有p1_choice都改成p2_choice
while p2_choice != 'r' and p2_choice != 's' and p2_choice != 'p':
    p2_choice = input('Player two please make your choice. Rock(r), Scissors(s), Paper(p): ')

print()
if p1_choice == 'r' and p2_choice == 'p':
    print('Player two wins')
elif p1_choice == 'r' and p2_choice == 's':
    print('Player one wins')
elif p1_choice == 's' and p2_choice == 'r':
    print('Player two wins')
elif p1_choice == 's' and p2_choice == 'p':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 'r':
    print('Player one wins')
elif p1_choice == 'p' and p2_choice == 's':
    print('Player two wins')
else:
    print('The game is a tie')

写法2:用not in简化条件(更Pythonic)

直接检查输入是否不在允许的列表里,代码更简洁易懂:

valid_choices = ['r', 's', 'p']
p1_choice = ''
p2_choice = ''

while p1_choice not in valid_choices:
    p1_choice = input('Player one please make your choice. Rock(r), Scissors(s), Paper(p): ')

while p2_choice not in valid_choices:
    p2_choice = input('Player two please make your choice. Rock(r), Scissors(s), Paper(p): ')

# 后续判断逻辑不变...

这样修改后,循环就能正常退出啦,而且代码可读性也更高~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:08:09