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

