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

如何让Discord Bot数字猜谜游戏结束后停止响应用户输入

问题原因

你的现有代码存在3个核心问题导致需求无法实现:

  • 你将num命令嵌套定义在numpuz命令内部,每次执行.numpuz都会重复注册一次num命令,会触发重复命令的冲突bug
  • 没有设置游戏运行状态的标记变量,不管游戏是否结束,bot都会响应.num指令
  • 你直接将输入的数字转为字符串比较大小,字符串比较是逐位比对字符ASCII值,会出现"99" > "100"的逻辑错误,导致猜数字判断完全失效
修复代码

你可以通过添加全局游戏状态标记的方式实现需求,修改后的完整代码如下,关键位置加了注释方便你理解:

import keep_alive
import discord
import os
from discord.ext import commands
import random
import sys

client = commands.Bot(command_prefix=".")
# 新增两个全局变量:游戏是否运行的标记,以及正确的随机数字
game_active = False
target_num = 0

@client.event
async def on_ready():
  print("The bot is online")

@client.command()
async def numpuz(ctx):
  global game_active, target_num
  # 启动游戏时重置状态和随机数
  game_active = True
  target_num = random.randint(1, 100)
  await ctx.send("数字猜谜游戏已开始,请输入1-100之间的数字,使用.num 你猜的数字 格式发送")

# 命令不要嵌套定义,放在全局位置
@client.command()
async def num(ctx, chosennumber):
  global game_active, target_num
  # 先判断游戏是否在运行,没运行直接返回不处理
  if not game_active:
    await ctx.send("当前没有进行中的游戏,请先发送.numpuz启动游戏")
    return
  # 把输入的内容转成整数再比较
  try:
    guess = int(chosennumber)
  except:
    await ctx.send("请输入有效的数字")
    return
  if guess > target_num:
    await ctx.send('数字太大了,猜小一点')
  elif guess < target_num:
    await ctx.send('数字太小了,猜大一点')
  else:
    await ctx.send('恭喜你猜对了!游戏结束')
    # 猜对后把游戏状态标记为关闭,后续的.num指令就不会响应了
    game_active = False
          
keep_alive.keep_alive()
client.run(os.getenv("token"))
核心修改说明
  • 新增了game_active全局变量标记游戏运行状态,游戏未启动/已结束时,.num指令会直接提示用户先启动游戏,不会执行猜数字逻辑
  • 把num命令移到了全局作用域,避免重复注册命令的bug
  • 新增了输入格式校验,用户输入非数字内容时会提示错误,不会直接崩溃
  • 把数字比较逻辑改成了整数对比,修复了原代码的大小判断错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:51:01