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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:05:22