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

数字猜谜游戏猜中后仍循环、次数耗尽不终止的代码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}")

修复说明

  1. 替换递归为while循环:用顶层循环控制游戏流程,避免递归栈导致的流程混乱,逻辑更直观。
  2. 明确终止条件:猜中数字后用break终止循环,次数耗尽后自动退出循环并提示结果。
  3. 简化随机数生成:用random.randint(1,100)直接生成目标数字,省去不必要的列表创建。
  4. 增加非法输入处理:避免用户输入非指定难度时程序出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:07:39