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

如何让Discord机器人在数学小游戏中检测最新消息作为答案

解决Discord机器人数学小游戏的答案检测问题

你的代码核心问题是没监听用户后续发送的新消息,setTimeout里还在使用触发命令的那条message对象,自然拿不到用户后来输入的答案。另外代码里的message.content.channel === answer是完全错误的写法——message.content是消息文本,channel是频道对象,根本没法和数字答案做对比。

修正后的代码(适配Discord.js v13/v14)

if (message.content === "s!mathMinigame") {
  const number1 = Math.floor(Math.random() * 100) + 1;
  const number2 = Math.floor(Math.random() * 100) + 1;
  const answer = number1 + number2;
  console.log(answer);

  // 发送数学题目
  await message.reply(`${number1}+${number2}=?`);

  // 创建消息收集器:只监听触发命令的用户,超时5秒,最多收1条消息
  const collector = message.channel.createMessageCollector({
    filter: msg => msg.author.id === message.author.id,
    time: 5000,
    max: 1
  });

  // 收集到用户答案时的处理逻辑
  collector.on('collect', msg => {
    const userAnswer = parseInt(msg.content);
    // 先判断用户输入的是不是有效数字,再对比答案
    if (!isNaN(userAnswer) && userAnswer === answer) {
      message.reply("答对了!");
    } else {
      message.reply(`不对哦,正确答案是${answer},输入s!mathMinigame再来一次吧!`);
    }
    collector.stop(); // 拿到答案后停止监听
  });

  // 超时未收到答案的处理
  collector.on('end', collected => {
    if (collected.size === 0) {
      message.reply(`时间到啦!正确答案是${answer},输入s!mathMinigame再来一次吧!`);
    }
  });
}

关键改动说明

  • 用createMessageCollector替代setTimeout,专门监听频道内的新消息
  • 添加filter规则,确保只收集触发命令的用户的消息,避免其他用户干扰
  • 将用户输入的文本转为数字后再对比,同时处理非数字输入的情况
  • 分别处理答对、答错、超时三种场景,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:43:19