数字猜谜游戏猜中后仍循环、次数耗尽不终止的代码BUG排查
问题排查与修复方案
核心BUG分析
你的代码两个问题的根源都是递归调用与while循环错误嵌套,导致游戏流程无法正常终止:
1. 猜中数字后游戏持续循环
当玩家猜中数字时,仅打印了恭喜信息,但没有终止当前流程,且之前递归调用的函数栈会继续运行,导致游戏不会停止。
2. 耗尽次数后程序不停止
每次猜错后,你在attempts-=1后用while attempts>0包裹递归调用,这会导致每次递归返回后,原while循环会再次触发递归,形成无限重复调用,即使attempts耗尽,外层的递归栈仍在继续执行。
另外,random.choices(choices_list)[0]可以简化为random.randint(1,100),没必要额外生成列表再选数。
修复后的代码
# 导入模块 import random # ASCII Art Logo logo = """ █▀▀▀ █──█ █▀▀ █▀▀ █▀▀ ▀▀█▀▀ █──█ █▀▀ █▀▀▄ █──█ █▀▄▀█ █▀▀▄ █▀▀ █▀▀█ █─▀█ █──█ █▀▀ ▀▀█ ▀▀█ ──█── █▀▀█ █▀▀ █──█ █──█ █─▀─█ █▀▀▄ █▀▀ █▄▄▀ ▀▀▀▀ ─▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀ ──▀── ▀──▀ ▀▀▀ ▀──▀ ─▀▀▀ ▀───▀ ▀▀▀─ ▀▀▀ ▀─▀▀ """ print(logo) print("欢迎来到数字猜谜游戏!") # 直接生成1-100的随机数,无需创建列表 chosen_number = random.randint(1, 100) # 测试时可保留打印,正式发布建议注释 print(chosen_number) print("我正在想一个1到100之间的数字。") game_level = input("选择难度:输入'easy'(简单,10次机会)或'hard'(困难,5次机会):").lower() if game_level == 'easy': attempts = 10 elif game_level == 'hard': attempts = 5 else: # 处理非法输入,默认设为简单难度 print("输入无效,默认选择简单难度") attempts = 10 # 用顶层while循环控制游戏流程,替代递归 while attempts > 0: print(f"你还有 {attempts} 次猜数字的机会。") choice = int(input("猜一个数字:")) if choice < chosen_number: print("太小了!") attempts -= 1 elif choice > chosen_number: print("太大了!") attempts -= 1 else: print("恭喜你!猜对了!") # 猜中后直接终止循环 break # 次数耗尽且未猜中时提示结果 if attempts == 0: print(f"游戏结束!正确数字是 {chosen_number}")
修复说明
- 替换递归为while循环:用顶层循环控制游戏流程,避免递归栈导致的流程混乱,逻辑更直观。
- 明确终止条件:猜中数字后用
break终止循环,次数耗尽后自动退出循环并提示结果。 - 简化随机数生成:用
random.randint(1,100)直接生成目标数字,省去不必要的列表创建。 - 增加非法输入处理:避免用户输入非指定难度时程序出错。
内容的提问来源于stack exchange,提问作者Shreyasree G
相关产品推荐
相关产品推荐

