Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const { MessageEmbed } = require("discord.js");
- const { MessageActionRow, MessageButton } = require('discord-buttons');
- const data = new Set();
- const width = 15;
- const height = 10;
- const apple = { x: 0, y: 0 };
- const food = { x: 0, y: 0}
- const gameBoard = [];
- class SnakeGame {
- constructor(options) {
- this.score = 0;
- this.inGame = false;
- this.snakeLength = 1;
- this.snake = [{ x: 0, y: 0 }];
- this.options = options;
- if (data.has(this.options.message.author.id)) return;
- data.add(this.options.message.author.id);
- for (let y = 0; y < height; y++) {
- for (let x = 0; x < width; x++) {
- gameBoard[y * width + x] = ":black_large_square:";
- }
- }
- }
- gameBoardToString() {
- let str = '';
- for (let y = 0; y < height; y++) {
- for (let x = 0; x < width; x++) {
- if (x == apple.x && y == apple.y) {
- str += ":small_blue_diamond:";
- continue;
- }
- if (x == food.x && y == food.y) {
- str += ":small_orange_diamond:";
- continue;
- }
- let flag = true;
- for (let s = 0; s < this.snake.length; s++) {
- if (x == this.snake[s].x && y == this.snake[s].y) {
- str += ":green_circle:";
- flag = false;
- }
- }
- if (flag) {
- str += gameBoard[y * width + x];
- }
- }
- str += '\n';
- }
- return str;
- }
- isLocInSnake(pos) {
- return this.snake.find((sPos) => sPos.x == pos.x && sPos.y == pos.y);
- }
- newappleLoc() {
- let newapplePos = {
- x: 0,
- y: 0,
- };
- do {
- newapplePos = {
- x: parseInt(Math.random() * width),
- y: parseInt(Math.random() * height),
- };
- } while (this.isLocInSnake(newapplePos));
- apple.x = newapplePos.x;
- apple.y = newapplePos.y;
- }
- newfoodLoc() {
- let newfoodPos = {
- x: 0,
- y: 0,
- };
- do {
- newfoodPos = {
- x: parseInt(Math.random() * width),
- y: parseInt(Math.random() * height),
- };
- } while (this.isLocInSnake(newfoodPos));
- food.x = newfoodPos.x;
- food.y = newfoodPos.y;
- }
- step(msg){
- if (apple.x == this.snake[0].x && apple.y == this.snake[0].y) {
- this.score += 1;
- this.snakeLength++;
- this.newappleLoc();
- }
- if (food.x == this.snake[0].x && food.y == this.snake[0].y) {
- this.score += 2;
- this.snakeLength += 2;
- this.newfoodLoc();
- }
- const updateEmbed = new MessageEmbed()
- .setColor("BLUE")
- .setTitle("Snake Game")
- .setFooter("® RDDigital")
- .addField('Score:', this.score, true)
- .setDescription(this.gameBoardToString())
- .setTimestamp(Date.now());
- let disbtn1 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn1').setDisabled();
- let disbtn2 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn2').setDisabled();
- let btnUP = new MessageButton().setStyle('blurple').setEmoji('⬆️').setID('btnUP')
- let btnDOWN = new MessageButton().setStyle('blurple').setEmoji('⬇️').setID('btnDOWN')
- let btnRIGHT = new MessageButton().setStyle('blurple').setEmoji('➡️').setID('btnRIGHT')
- let btnLEFT = new MessageButton().setStyle('blurple').setEmoji('⬅️').setID('btnLEFT')
- let rowbtnA = new MessageActionRow().addComponents([disbtn1, btnUP, disbtn2])
- let rowbtnB = new MessageActionRow().addComponents([btnLEFT, btnDOWN, btnRIGHT])
- let btnRow = [rowbtnA, rowbtnB]
- msg.edit({
- embed: updateEmbed,
- components: btnRow
- })
- }
- gameOver(m){
- this.inGame = false
- const gameoverembed = new MessageEmbed()
- .setColor("RED")
- .setTitle("GameOver")
- .setFooter("® RDDigital")
- .setDescription(`Your Score: ${this.score}`)
- .setTimestamp(Date.now());
- let disbtn1 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn1').setDisabled();
- let disbtn2 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn2').setDisabled();
- let btnUP = new MessageButton().setStyle('blurple').setEmoji('⬆️').setID('btnUP').setDisabled()
- let btnDOWN = new MessageButton().setStyle('blurple').setEmoji('⬇️').setID('btnDOWN').setDisabled()
- let btnRIGHT = new MessageButton().setStyle('blurple').setEmoji('➡️').setID('btnRIGHT').setDisabled()
- let btnLEFT = new MessageButton().setStyle('blurple').setEmoji('⬅️').setID('btnLEFT').setDisabled()
- let rowbtnA = new MessageActionRow().addComponents([disbtn1, btnUP, disbtn2])
- let rowbtnB = new MessageActionRow().addComponents([btnLEFT, btnDOWN, btnRIGHT])
- let btnRow = [rowbtnA, rowbtnB]
- m.edit({
- embed: gameoverembed,
- components: btnRow
- })
- }
- newGame(){
- if (this.inGame) {
- return;
- }
- this.inGame = true;
- this.score = 0;
- this.snakeLength = 1;
- this.snake = [{ x: 5, y: 5 }];
- this.newappleLoc();
- this.newfoodLoc();
- const embed = new MessageEmbed()
- .setColor("BLUE")
- .setTitle("Snake Game")
- .setFooter("® RDDigital")
- .addField('Score:', this.score, true)
- .setDescription(this.gameBoardToString())
- .setTimestamp(Date.now());
- let disbtn1 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn1').setDisabled();
- let disbtn2 = new MessageButton().setStyle('grey').setLabel('\u200b').setID('disablebtn2').setDisabled();
- let btnUP = new MessageButton().setStyle('blurple').setEmoji('⬆️').setID('btnUP')
- let btnDOWN = new MessageButton().setStyle('blurple').setEmoji('⬇️').setID('btnDOWN')
- let btnRIGHT = new MessageButton().setStyle('blurple').setEmoji('➡️').setID('btnRIGHT')
- let btnLEFT = new MessageButton().setStyle('blurple').setEmoji('⬅️').setID('btnLEFT')
- let rowbtnA = new MessageActionRow().addComponents([disbtn1, btnUP, disbtn2])
- let rowbtnB = new MessageActionRow().addComponents([btnLEFT, btnDOWN, btnRIGHT])
- let btnRow = [rowbtnA, rowbtnB]
- this.options.message.channel.send({ embed }).then(async (m) => {
- m.edit({
- embed: embed,
- components: btnRow
- })
- const filter = (buttons) => buttons.clicker.id === this.options.message.author.id
- const collector = m.createButtonCollector(filter, {});
- collector.on("collect", (button) => {
- button.reply.defer();
- const snakeHead = this.snake[0];
- const nextPos = {
- x: snakeHead.x,
- y: snakeHead.y,
- };
- if (button.id === "btnRIGHT") {
- let nextX = snakeHead.x + 1;
- if (nextX >= width) {
- nextX = 0;
- }
- nextPos.x = nextX;
- } else if (button.id === "btnUP") {
- let nextY = snakeHead.y - 1;
- if (nextY < 0) {
- nextY = height - 1;
- }
- nextPos.y = nextY;
- } else if (button.id === "btnDOWN") {
- let nextY = snakeHead.y + 1;
- if (nextY >= height) {
- nextY = 0;
- }
- nextPos.y = nextY;
- } else if (button.id === "btnLEFT") {
- let nextX = snakeHead.x - 1;
- if (nextX < 0) {
- nextX = width - 1;
- }
- nextPos.x = nextX;
- }
- if (this.isLocInSnake(nextPos)) {
- this.gameOver(m);
- collector.stop();
- data.delete(this.options.message.author.id);
- } else {
- this.snake.unshift(nextPos);
- if (this.snake.length > this.snakeLength) {
- this.snake.pop();
- }
- this.step(m);
- }
- })
- })
- }
- }
- module.exports = SnakeGame;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement