如何让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
相关产品推荐
相关产品推荐

