
本文详解如何在python终端游戏中用while循环安全处理用户输入,避免因类型错误或无效选项导致程序中断,并确保分支逻辑正常执行。
本文详解如何在python终端游戏中用while循环安全处理用户输入,避免因类型错误或无效选项导致程序中断,并确保分支逻辑正常执行。
在开发基于文本的Python终端游戏时,一个常见且关键的需求是:持续提示用户选择,直到输入合法有效为止;同时,对每个合法选项(如 1 或 2)执行对应逻辑(如播放剧情、跳转分支)。但初学者常陷入两个典型误区:一是将业务逻辑(if 分支)放在循环外部,导致只校验不响应;二是混淆数据类型(如用字符串 "1" 比较整型输入),致使条件永远不成立。
下面这段代码正是问题所在:
while True:
try:
question1 = int(input("1. oui 2. non \n"))
except ValueError:
slow_type("essai un nombre ou de répondre la question.")
continue
else:
break # ← 错误关键:break后直接退出循环,后续if完全不执行!
if question1 == "1": # ← 类型错误:question1是int,"1"是str
slow_type("Alors, voici mon histoire...")✅ 正确做法是:将所有响应逻辑嵌入循环体内,并使用整型比较。以下是优化后的健壮实现:
while True:
try:
choice = int(input("1. oui 2. non \n"))
except ValueError:
slow_type("essai un nombre ou de répondre la question.")
continue # 输入非数字 → 提示重试
if choice == 1:
slow_type("Alors, voici mon histoire...")
break # 成功响应后退出循环
elif choice == 2:
slow_type("D'accord.")
break
else:
slow_type("Choix invalide. Veuillez entrer 1 ou 2.")
# 不break,继续下一轮循环? 进阶建议:封装为可复用函数
为提升代码可维护性与复用性,推荐将该逻辑抽象为通用选择函数(如原问题中改进的 choose_wisely):
def choose_option(options):
"""
安全获取用户选项(1-based索引)
:param options: 字符串列表,如 ["oui", "non"]
:return: 用户选择的整数(从1开始)
"""
for idx, opt in enumerate(options, 1):
print(f"{idx}. {opt}")
while True:
try:
user_input = int(input("Ton choix? "))
if 1 <= user_input <= len(options):
return user_input
else:
slow_type(f"Nombre invalide. Choisis entre 1 et {len(options)}.")
except ValueError:
slow_type("S'il vous plaît, entre un nombre.")
# 使用示例
answer = choose_option(["oui", "non"])
if answer == 1:
slow_type("Alors, voici mon histoire...")
else:
slow_type("D'accord.")⚠️ 注意事项总结:
立即学习“Python免费学习笔记(深入)”;
- 永远在循环内处理有效输入的响应逻辑,避免 break 过早终止;
- int(input()) 的结果是 int 类型,比较时务必用 1 而非 "1";
- else 子句在 try/except 中仅在无异常时执行,不适用于“输入合法但值无效”的场景(如输入 3);此时应显式判断范围;
- 将重复逻辑封装为函数,既增强可读性,也便于统一管理提示语与错误策略。
掌握这一模式,你就能构建出稳定、友好、专业级的终端交互流程——这是文字冒险类游戏、命令行工具甚至教学系统的坚实基础。











