前書き
前々から、TRPGに少し興味があり、ダイス機能を作ってみたいと思ったので作ってみたいと思います。
どのようなものか
コマンドで、何回振るか、そのダイスは何面あるか。を指定します。
上記は6面のダイスを4回振った時の例です。
どういう感じなのか(概要)
どういう動作をするのかの概要を説明します。
- ユーザーから2つの引数を受け取る(回数・ダイスの面数)
- Discordの最大文字数は2000なので、上の引数が大きすぎたら無視する(任意で大丈夫です)
- それぞれのダイスの目の合計数とそれぞれの目のリストの変数を初期化しておく
- 「1」で受け取った回数の引数分繰り返し処理をする
- 繰り返し処理の中に「1」で受け取ったダイスの面数の中を乱数で出す
- その目をリストに追加しながら、足し続けて、合計数の変数に代入。
このような感じのコードを組み立てていきたいと思います。
コーディング
上記の概要をコードにするとこのような感じになります。
「times」と「side」は引数として受け取るようにしてください。
このコードを自分の合うように調整していけば行けると思います。
dice.js
//変数の初期化
let total = 0;
const list = [];
for (let i = 0; i < times; i++) { //指定された回数分繰り返し処理
const num = Math.floor(Math.random() * side) + 1; //指定された面数の乱数
total += num; //合計に足していく
list.push(num); //リストに入れる
}
私の開発環境では以下のようになりました。画像と全く同じ動作をさせるならばこちらになります。
dice.js
const { SlashCommandBuilder } = require('@discordjs/builders');
module.exports = {
data: new SlashCommandBuilder()
.setName('dice')
.setDescription('ダイスを振ります。')
.addNumberOption(option => option.setName('回数').setDescription('何回降りますか'))
.addNumberOption(option => option.setName('面数').setDescription('何面ですか')),
async execute(interaction) {
const times = interaction.options.getNumber('回数');
const side = interaction.options.getNumber('面数');
if (times > 500 && side > 10 || side > 10000 || times > 200 && side > 1000) return await interaction.reply('数字が大きすぎます。');
let total = 0;
const list = [];
for (let i = 0; i < times; i++) {
const num = Math.floor(Math.random() * side) + 1;
total += num;
list.push(num);
}
await interaction.reply(`${times.toString()}d${side.toString()} >> **${total.toString()}** *\`(${list})\`*`);
},
};
以上で今回は終わりです。お疲れさまでした!