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

Python石头剪刀布游戏中while循环输入校验仅生效一次是什么原因

问题原因

你的代码存在两个核心逻辑错误,直接导致输入校验失效:

  • 合法性判断逻辑错误:你直接将字符串格式的用户输入和列表possible_choices做等值比较,字符串永远不可能和列表相等,因此该判断永远返回False,正确做法是用in关键字判断输入是否包含在可选列表中。
  • 变量用途混乱:你复用user_input变量同时存储用户输入内容和布尔类型的校验结果,第一次校验不合法时你将user_input设为False,进入重提示循环后你又把新的用户输入赋值给user_input,如果这次输入仍不合法,user_input就变成了字符串类型,此时while user_input == False的判断永远不成立,循环直接退出,因此只会提示一次重输。

修正后代码(已全部汉化)

import random

print("你希望玩多少轮游戏?")
repeat = input()
possible_choices = ["rock", "paper", "scissors"]
for x in range(int(float(repeat))):
    user_input = input("请输入选择(rock/paper/scissors):")
    # 输入不合法则持续提示重输
    while user_input not in possible_choices:
        user_input = input("输入无效,请输入rock、paper或scissors:")
    
    computer_action = random.choice(possible_choices)
    print(f"\n你选择了{user_input},电脑选择了{computer_action}。\n")
    if computer_action == user_input:
        print(f"双方都选择了{user_input},平局!")
    elif user_input == "rock":
        if computer_action == "paper":
            print("纸包石头,你输了!")
        else:
            print("石头砸剪刀,你赢了!")
    elif user_input == "paper":
        if computer_action == "scissors":
            print("剪刀剪纸,你输了!")
        else:
            print("纸包石头,你赢了!")
    elif user_input == "scissors":
        if computer_action == "paper":
            print("剪刀剪纸,你赢了!")
        else:
            print("石头砸剪刀,你输了!")
    print("")
  
print("游戏结束。")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:27:03