Discord.js骰子机器人多骰计算异常:结果莫名+1求助
问题原因与修复方案
问题原因
当前代码的修正值提取逻辑存在错误:
用于提取加减修正值的正则/([+-]\d+)/会匹配字符串任意位置的加减数字。当输入多骰指令(如1d20+1d30)时,第二个骰子表达式开头的+1会被错误识别为数值修正值,导致程序给总结果额外加上1,最终出现结果多1的异常(比如预期50,实际返回51)。
修复方案
1. 修正modifier匹配正则
将修正值的匹配正则改为/([+-]\d+)$/,通过$锚定字符串末尾,确保只识别所有骰子表达式之后的加减数值,不会误判骰子之间的连接符号。
2. 优化指令校验正则(可选)
原开头的校验正则/(\d+)d(\d+)([+-]\d+)?/只能匹配单个骰子加修正值的情况,对于多骰指令(如1d20+1d30),它会因匹配到其中的1d20而进入代码块,但本身并不符合完整的多骰指令格式。可以替换为更全面的校验正则,确保只有合法的掷骰指令才会被处理:
if(command.match(/^(?:\d+d\d+(?:[+-])*)+(?:[+-]\d+)?$/))
修复后的完整代码
//dice rolling if(command.match(/^(?:\d+d\d+(?:[+-])*)+(?:[+-]\d+)?$/)) { let total = 0; let individualRolls = []; const rolls = command.match(/(\d+)d(\d+)/g); for (let i = 0; i < rolls.length; i++) { const [count, size] = rolls[i].split("d").map(val => parseInt(val)); for(let j=0; j<count; j++){ let roll = (Math.floor(Math.random() * size) + 1); individualRolls.push(roll); total += roll; } } // 修正modifier匹配,只取末尾的加减数值 const modifier = command.match(/([+-]\d+)$/); if (modifier) { total += Number(modifier[0]); } message.channel.send(`You rolled ${command} and got ${total}!\nIndividual rolls: ${individualRolls}`); }
测试验证
输入1d20+1d30时,程序会正确识别两个骰子部分,分别掷出数值并相加,不会额外添加错误的修正值,结果与预期一致;如果是带修正值的指令如1d20+1d30+5,也会正确加上末尾的5。
内容的提问来源于stack exchange,提问作者Pedro Silva
相关产品推荐
相关产品推荐

