掷骰子.免打扰,将数组中的数字相加



所以我为《地下城》创造了一个基本的掷骰子机器人;龙。

到目前为止,我所拥有的代码可以滚动任何类型的骰子,(例如:&;roll &;;滚动1d20",滚动100d100")

当有人发送匹配的消息时,它将输出结果骰子。

我的问题是,我想把这些数字加在一起,并显示最终的总数,但我不确定如何到达那里。

// Run dotenv
require('dotenv').config();
const { any } = require('async');
const Discord = require('discord.js');
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] });

client.on('messageCreate', msg => {
z = msg.content;
matches = z.match(/d+/g);
x = matches[0];
y = matches[1];
if (msg.content === 'ping') {
msg.reply('pong');
}
if (msg.content == 'roll ' + x + 'd' + y) {

function rollDie(sides) {
if (!sides) sides = 6;
return 1 + Math.floor(Math.random() * sides);
}
function rollDice(number, sides) {
var total = [];
var number = x;
var sides = y;
while (number-- > 0) total.push(rollDie(sides));
return total;
}
msg.reply("result: " + rollDice());
console.log(rollDice())
}
});
client.login(process.env.DISCORD_TOKEN);

似乎您在声明变量时没有使用letvar(z,matches,xy)。没有理由再使用var了。你有rollDice函数的参数,但之后只是从你创建的变量中提取,而不是使用参数,所以我修改了它。我使用了reduce方法对数组求和。我更改了一些变量名,使其更具描述性(例如将z改为msgContent),并在更多可用的地方使用它们。

在你的rollDie函数中,你给了一个默认的骰子边数6,但是因为if语句包装它,函数被调用的唯一方法是如果一个边数是特别选择的。所以我修改了这个,这样人们就可以输入&;Roll 3&;如果他们只是想掷3个6面骰子。当报告骰子滚动时,我使用了join方法,因此它们将显示在逗号和空格分隔的列表中,而不是作为数组。


我在看到你的编辑后修改了这个解决方案。现在在顶部创建msgContent,使用我创建的一个新的正则表达式,该表达式足够健壮,可以摆脱toLowerCase和trim方法输入清洗以及代码中先前必要的其他字符串检查。如果msg是'roll #'或'roll #d#'(其中'#'是除0以外的任何数字长度),msg将通过正则表达式测试方法。正则表达式将自动忽略字符大小写和字符串末尾的任何空白。我将rollDie函数转换为更简洁的箭头函数,并将其放在rollDice函数作用域中,因为这是唯一需要调用它的地方。你不需要写if (!sides) sides = 6;,因为你可以只使用表达式(sides || 6),因为sides只使用一次,如果是假的,表达式将只计算为6。我也不再将diceResults声明为空白数组,因为它可以在稍后将rollDice()的输出保存到它时定义。

require('dotenv').config();
const { any } = require("async");
const Discord = require("discord.js");
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] });
client.on("messageCreate", (msg) => {
const msgContent = msg.content,
msgRegEx = /s*rolls[1-9]d*(d[1-9]d*)?s*/i;
if (msgRegEx.test(msgContent)) {
let matches = msgContent.match(/d+/g),
numDice = matches[0],
numSides = matches[1],
diceResults;
function rollDice(number, sides) {
const rollDie = sides => Math.floor(Math.random() * (sides || 6)) + 1;
let diceArray = [];
while (number-- > 0) diceArray.push(rollDie(sides));
return diceArray;
}
function calcDiceTotal(diceArray) {
return diceArray.reduce(
(previousValue, currentValue) => previousValue + currentValue,
0
);
}
diceResults = rollDice(numDice, numSides);
msg.reply(
"ROLLING... " + diceResults.join(", ") +
" || TOTAL: " + calcDiceTotal(diceResults)
);
}
});
client.login(process.env.DISCORD_TOKEN);

输出应该像这样:"ROLLING... 3, 1, 6, 3, 5 || TOTAL: 18"

应该是这样的。

Reduce对给定数组的每个元素应用一个回调函数,因此您可以使用它将数组的所有值相加并报告。

传递一个数组'totalArr'到这个函数中会得到数组

中所有数字的总和。Javascript

const rollTotal = function (totalArr) {
const startingRoll = 0;
const subTotal = totalArr.reduce(
(previousValue, currentValue) => 
previousValue + currentValue,
startingRoll
);
return subTotal;
};

测试
console.log(rollTotal([1, 2, 3]));

输出= 6

这是最终的bot代码,按预期工作,使用上面的修复并调整它,所以当有人键入任何其他消息时bot不会中断。

似乎工作得很好!

require('dotenv').config();
const { any } = require("async");
const Discord = require("discord.js");
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] });
client.on("messageCreate", (msg) => {
if (msg.content.startsWith('roll ')) {
let msgContent = msg.content.trim().toLowerCase(),
matches = msgContent.match(/d+/g),
numDice = matches[0],
numSides = matches[1],
diceResults = [];
if (
msgContent === "roll " + numDice ||
msgContent === "roll " + numDice + "d" + numSides
) {
function rollDie(sides) {
if (!sides) sides = 6;
return 1 + Math.floor(Math.random() * sides);
}
function rollDice(number, sides) {
let diceArray = [];
while (number-- > 0) diceArray.push(rollDie(sides));
return diceArray;
}
function calcDiceTotal(diceArray) {
return diceArray.reduce(
(previousValue, currentValue) => previousValue + currentValue,
0
);
}
diceResults = rollDice(numDice, numSides);
msg.reply(
"ROLLING... " + diceResults.join(", ") +
" || TOTAL: " + calcDiceTotal(diceResults)
);
}
}
});
client.login(process.env.DISCORD_TOKEN);

最新更新