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

如何让Discord机器人在指令发送后响应用户消息?回合制战斗机器人开发报错求助

解决Discord机器人回合制战斗中获取用户后续回复的问题

嘿,我来帮你搞定这个问题!首先咱们先拆解你遇到的错误:AttributeError: 'Context' object has no attribute 'content',这个问题的根源很简单——Discord.py的Context对象(也就是你代码里的ctx)本身并不包含用户后续回复的内容,它只记录了触发当前命令的那条消息的上下文信息。要获取用户在发送battle指令后的选择,你需要用bot.wait_for()方法主动监听用户的回复。

下面我会一步步帮你修改代码,同时优化你的敌人数据结构,让代码更整洁易维护:

1. 错误原因详解

你之前写的enemypicked = ctx.content.lower()是错误的,因为ctx没有content属性。正确的做法是使用wait_for来等待用户发送下一条消息,并且可以通过校验规则确保是触发命令的用户在同一个频道回复,避免其他用户干扰战斗流程。

2. 修改后的完整代码

import random
from discord.ext import commands
from discord import errors

# 假设你的bot实例是bot,需要和你实际的bot变量名一致
bot = commands.Bot(command_prefix='!', intents=commands.Intents.all())

async def battle(ctx):
    # 优化敌人数据结构:用字典分组管理,比零散变量清晰太多
    enemy_groups = {
        '1': {
            'enemies': ['Skeleton', 'Goblin', 'Bandit'],
            'hp': 50,
            'dmg': 25
        },
        '2': {
            'enemies': ['Knight', 'Barbarian', 'Archer'],
            'hp': 75,
            'dmg': 35
        },
        '3': {
            'enemies': ['Elf Mage', 'Dwarf Warrior', 'Orc Brute'],
            'hp': 100,
            'dmg': 25
        }
    }
    playerhp = 150
    playerdmg = random.randint(10, 40)
    
    await ctx.send('Pick a number between 1 and 3')
    
    try:
        # 等待用户回复,校验条件:必须是触发命令的用户,且在同一个频道
        # 超时时间设置为60秒,你可以根据需求调整
        msg = await bot.wait_for(
            'message',
            check=lambda m: m.author == ctx.author and m.channel == ctx.channel,
            timeout=60
        )
        enemypicked = msg.content.strip()
        
        # 验证用户输入是否是合法的1-3数字
        if enemypicked not in enemy_groups.keys():
            await ctx.send("Invalid choice! Please enter a number between 1 and 3.")
            return
        
        # 根据选择获取对应敌人组并随机挑选敌人
        selected_group = enemy_groups[enemypicked]
        opponent = random.choice(selected_group['enemies'])
        await ctx.send(f'You encountered a {opponent} with {selected_group["hp"]}HP!')
        
        # 这里可以继续添加回合制战斗的核心逻辑,比如攻击交互、血量计算等
        
    except errors.TimeoutError:
        await ctx.send("You took too long to respond! The battle has been canceled.")

# 注册触发战斗的命令
@bot.command()
async def start_battle(ctx):
    await battle(ctx)

# 运行bot(替换成你的机器人token)
bot.run('YOUR_BOT_TOKEN_HERE')

3. 关键修改点说明

  • 使用bot.wait_for():这个方法会监听指定的message事件,直到满足校验条件的消息出现或者超时。check参数确保只有触发命令的用户在同一个频道发送的消息才会被接受,避免无关用户干扰。
  • 优化敌人数据结构:用嵌套字典把每个难度的敌人列表、血量、伤害整合在一起,后续扩展新敌人或者调整数值会更方便。
  • 输入验证与异常处理:添加了对用户输入的合法性校验,同时捕获TimeoutError,处理用户超时未回复的情况,让机器人的交互更健壮。
  • 替换错误的ctx.content调用:换成从wait_for获取的msg对象的content属性,这才是用户后续回复的真实内容。

这样修改后,你的机器人就能正确响应用户的数字选择,生成对应的敌人啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:53:10