UNPKG

discord-minesweeper-game

Version:
77 lines (56 loc) โ€ข 2.93 kB
import { CommandInteraction, Message } from "discord.js"; import { numberType, OptionParams } from "./interfaces"; import createGameBoard from "./utility/createGameBoard"; import emojis from "./utility/emojis"; import handleInput from "./utility/handleInput"; import Options from "./utility/options"; import ms from 'ms-prettify'; export default class Minesweeper { static start(interaction: CommandInteraction, options: OptionParams) { return new Promise(async res => { const _options = new Options(options); let bombs = [], number: numberType[] = [], visible: string[] = [], remaining = [], extra: string[] = [], numberSet: string[] = [""]; for (let i = 1; i <= _options.size; i++) { for (let j = 1; j <= _options.size; j++) { remaining.push(`${emojis(i, "letter")}${j}`); } } extra = remaining; while (bombs.length < _options.bombs && extra.length > 0) { let p = Math.floor(Math.random() * extra.length); bombs.push(extra[p]); extra = extra.filter(v => v != extra[p]); } let l = extra.length; while (number.length <= l && extra.length > 0) { let p = Math.floor(Math.random() * extra.length); number.push({ position: extra[p], value: Math.floor(Math.random() * 5) }); extra = extra.filter(v => v != extra[p]); } for (let i = 0; i < number.length; i++) { let x = Math.random() > 0.4 ? numberSet.length - 1 : numberSet.length; if (!number[i].position) return; numberSet[x] ? numberSet[x] += `,${number[i].position}` : numberSet[x] = number[i].position; } numberSet = numberSet.filter(v => v) if (number.length < 1) throw new Error("Number of bombs should be less than total blocks i.e. size * size"); let m = { embeds: [{ title: "๐Ÿ’ฃ Mine ๐Ÿงน Sweeper ๐ŸŽฎ Game", description: createGameBoard(_options.size, bombs, number, visible) + `\n\n${_options.embedMessage.replace(/\{prefix\}/g, _options.prefix).replace(/\{timer\}/g, ms(_options.timer))}` }], } const msg = interaction.replied || interaction.deferred ? await interaction.followUp({ fetchReply: true, embeds: m.embeds }) : await interaction.reply({ fetchReply: true, embeds: m.embeds }); const data = await handleInput(<Message>msg, interaction, bombs, number, visible, numberSet, remaining, _options) res(data) }) } }