death-games
v1.2.2
Published
Un módulo creado principalmente para juegos en bots de discord.js
Downloads
51
Maintainers
Readme
death-games
Éste módulo proporciona herramientas para crear pequeños juegos, diseñado principalmente para bots de discord.js
Nuevo juego
const Death = require("death-games")
const game = new Death.<GAME>(opciones)
Shortcuts
Hangman
PARÁMETROS:
- Frase: String con la frase del juego
OPCIONES:
jugadores: Array con las ID's de los jugadores del juego actual
lowerCase: true o false, true para que las letras maýusculas en la frase sean descubiertas con minúsculas y visceversa, false para restringir que las mayúsculas se encuentren con letras mayúsculas, y las minúsculas con minúsculas
Default: true
- vidas: Número con el número de intentos antes de que el juego se pierda automáticamente
Default: 7
EVENTOS:
- end:
Retorna: Objeto con la configuración del juego actual
//Configuración del juego actual:
game : {
palabra: String, //La frase definida en los parámetros del juego
jugadores: Array, //El array con las ID's de los jugadores definidos en las opciones
lowercase: Boolean, //true si las letras mayusculas pueden ser descubiertas con las minúsculas y visceversa
vidas: Number, //Numero de intentos restantes
turno: String, //String con la ID del jugador del turno actual, (las ID's se especifican en la opción jugadores)
ascii: Array, //Array con el juego ascii: ['_','_','_']
letrasUsadas: Array, //Array con todas las letras que se han usado en el juego actual
letrasIncorrectas: Array, //Array con las letras que ya estaban puestas o que no se encontraban en la frase (puede ser usado para evitar que repitan letras, dándole uso en el colector)
ended: Boolean, //true si el juego ya ha acabado, de lo contrario false
winned: Boolean; //true si se descubrió la palabra por completo, de lo contrario false
}
EJEMPLO HANGMAN:
//Ejemplo usando el módulo discord.js
const Death = require("death-games");
let author = [message.author.id]
let menciones = message.mentions.users.map(x => x.id);
let jugadores = author.concat(menciones); //Un array donde el primer elemento es el autor del mensaje, los demás los usuarios mencionados
if(!menciones.length) return message.channel.send("Tienes que mencionar mínimo a una persona!")
if(menciones.includes(message.author.id)) return message.channel.send("No te puedes mencionar a ti mismo!")
if(message.mentions.users.map(x => x.bot).some(x => x)) return message.channel.send("No puedes mencionar a un bot!")
//*Nota:* El elemento 0 del array jugadores es el que elige la frase!
const canal = await message.author.createDM() //Puedes definir un canal a donde se le preguntará la palabra al usuario
canal.send("Elige tu palabra")
let palabra;
await canal.awaitMessages(m => m.author.id == message.author.id && m.content.replace(/[^A-Za-z0-9ñ ]/g,"").length,
{max: 1, time: 20000, errors:["time"]}).then(collected => {
palabra = collected.first().content.replace(/[^A-Za-z0-9ñ ]/g,"")
}).catch(() => canal.send("Tiempo agotado!"))
if(!palabra) return
const ahorcado = new Death.Hangman(palabra, {jugadores: jugadores, lowerCase: true, vidas: 7})
ahorcado.on("end", game => {
if(game.winned){ //Si el juego ha terminado y se ha descubierto toda la frase
message.channel.send("El juego ha finalizado! La frase era: **"+game.palabra+"**\n"+
"Descubierto por: **"+client.users.cache.get(game.turno).tag+"**\n\n```"+game.ascii.join(" ")+"```")
return;
}else{ //Si ha terminado pero no han descubierto la frase
message.channel.send("Han perdido! La frase era: **"+game.palabra+"**\n"+
"Último error: **"+client.users.cache.get(game.turno).tag+"**\n\n```\n"+game.ascii.join(" ")+"```")
}
})
message.channel.send(message.author.toString()+" ha elegido su palabra!\n\n"+
"```\n"+ahorcado.game.ascii.join(" ")+"```**Empieza "+client.users.cache.get(ahorcado.game.turno).tag+"**")
const colector = message.channel.createMessageCollector(msg => msg.author.id == ahorcado.game.turno && /[A-Za-z0-9ñ]/.test(msg.content) && msg.content.length == 1);
colector.on('collect', msg => {
let encontrado = ahorcado.find(msg.content) //Usamos el método find() para encontrar una letra en la frase, éste retorna true si se encuentra, false si no
if(ahorcado.game.ended){
colector.stop()
return;
}
if(!encontrado) message.channel.send("- Vaya! Parece que la letra "+msg.content+" no se encontraba en la frase!\nLetras incorrectas: **["+ahorcado.game.letrasIncorrectas.join(", ")+"]**")
message.channel.send("```\n"+ahorcado.game.ascii.join(" ")+"\n```**Turno de "+client.users.cache.get(ahorcado.game.turno).tag+"**\nIntentos restantes: **"+ahorcado.game.vidas+"**")
})
RussianRoulette
OPCIONES:
jugadores: Array con las ID's de los jugadores del juego actual
slots: Número de huecos en el tambor del revólver
Default: 6
EJEMPLO RUSSIAN ROULETTE:
//Un ejemplo del constructor Roulette usando el módulo discord.js
const Death = require("death-games")
let author = [message.author.id] //Hacemos que el jugador N.1 siempre sea el autor del mensaje
let menciones = message.mentions.users.map(x => x.id); //Obtenemos las ID's de las personas mencionadas
let jugadores = author.concat(menciones); //Juntamos ambos arrays en uno mismo
if(menciones.includes(message.author.id)) return message.channel.send("No te puedes mencionar a ti mismo!")
if(message.mentions.users.map(x => x.bot).some(x => x)) return message.channel.send("No puedes mencionar a un bot!")
const ruleta = new Death.Roulette({jugadores: jugadores}) //Creamos el juego con el array de ID's de los jugadores, si no hay mencionados sólo juega el autor del mensaje
message.channel.send("Empieza "+message.author.toString())
const colector = message.channel.createMessageCollector(msg => ruleta.game.turno == msg.author.id && !isNaN(msg.content))
colector.on('collect', msg => { //Creamos un colector de mensajes
if(!Number.isSafeInteger(+(msg.content))) return msg.reply("Necesitas introducir un número más pequeño!") //Si el número es excesivamente grande
let muertoXD = ruleta.elegir(msg.content) //Elegimos el número de veces a girar el tambor del revólver
if(muertoXD){
message.channel.send(msg.author.toString()+" ha muerto! Se ha acabado la ronda!")
colector.stop()
return;
}else{
message.channel.send("Parece que "+msg.author.toString()+" se ha salvado!\nTurno de "+message.guild.members.cache.get(ruleta.game.turno).user.toString()+"\n"+
"Posición actual: "+ruleta.game.posicion+", Bala: "+ruleta.game.bala)
}
})
Buscaminas
OPCIONES:
- largo: El número de casillas del largo del tablero (max: 15)
Default: 7
- ancho: El número de casillas del ancho del tablero (max: 9)
Default: 7
- bombas: Número de bombas que se esparcirán por el tablero
Default: 10
- charOculto: Carácter que se usará para las casillas ocultas (no descubiertas)
Default: x
- chars: Array con los carácteres que se usarán en el juego (ordenados), si alguno no se proporciona, los carácteres no proporcionados serán los Default
Default: [0,1,2,3,4,5,6,7,8,💥]
EVENTOS:
- win:
Retorna: Objeto con la configuración del juego actual
//Configuración del juego actual:
game: {
tablero: {
largo: Number, //El largo del tablero
ancho: Number, //El ancho del tablero
casillas: Number //El total de casillas del tablero (largo * ancho)
},
bombas: Number, //El número de bombas colocadas
open: Array, //El juego sin casillas ocultas (ascii pero todo descubierto)
ascii: Array, //El juego con las casillas ocultas, se modifica mientras se van descubriendo casillas
descubiertos: Array, //El juego con las coordenadas descubiertas
winned: Boolean //true si se han descubierto todas las casillas que no son bombas
}
}
EJEMPLO BUSCAMINAS:
//Ejemplo de minesweeper usando el módulo discord.js
const Discord = require("discord.js") //Para los embeds
const Death = require("death-games")
const largo = 7
const ancho = 7
const bombas = 10
const caracteres = [":black_large_square:",":one:",":two:",":three:",":four:",":five:",":six:",":seven:",":eight:", ":boom:"]
//Definimos los carácteres que aparecerán en el tablero, casillas vacías, número de bombas adyacentes y el emoji de la bomba
const numerosLaterales = [":black_large_square:",":one:",":two:",":three:",":four:",":five:",":six:",":seven:",":eight:", ":nine:"]
//Creamos un array con los emojis de las coordenadas del eje Y
const buscaminas = new Death.Buscaminas({largo: largo, ancho: ancho, bombas: bombas, charOculto: ":x:", chars: caracteres})
let coordsLetras = [ [":regional_indicator_a:",":regional_indicator_b:",":regional_indicator_c:",":regional_indicator_d:",
":regional_indicator_e:",":regional_indicator_f:",":regional_indicator_g:",":regional_indicator_h:",
":regional_indicator_i:",":regional_indicator_j:",":regional_indicator_k:",":regional_indicator_l:",
":regional_indicator_m:",":regional_indicator_n:",":regional_indicator_o:"].slice(0, buscaminas.game.tablero.largo) ]
//Creamos un array con los emojis de las coordenadas del eje X
let tablero1 = coordsLetras.concat(buscaminas.game.ascii)
.flatMap(x => x.join(" ")) //Ponemos las letras del eje X en el tablero
let tablero2 = []
tablero1.forEach((x, i) => {
tablero2.push(numerosLaterales[i]+" "+x)
}) //Ponemos los números del eje Y en el tablero
message.channel.send(new Discord.MessageEmbed().setDescription(
tablero2.join("\n")
).setColor("RANDOM")) //Mandamos el array del tablero ordenado
buscaminas.on("win", game => {
message.channel.send("Eso paaaa, la re ganaste en un tablero de "+game.tablero.casillas+" casillas!")
return;
})
const colector = message.channel.createMessageCollector(msg => message.author.id == msg.author.id && msg.content.length == 2 && !buscaminas.game.descubiertos.includes(msg.content.toLowerCase()))
colector.on('collect', msg => {
let encontrado = buscaminas.find(msg.content) //Buscamos la coordenada y la descubrimos
let tablero = buscaminas.game.ascii.flatMap(x => x.join(" ")).join("\n")
if(!encontrado){ //Si el encontrado es una bomba
message.channel.send(new Discord.MessageEmbed().setTitle("Perdiste pa' :(").setDescription(
tablero
).setColor("RANDOM"))
colector.stop()
return;
}
let tablero1 = coordsLetras.concat(buscaminas.game.ascii)
.flatMap(x => x.join(" "))
let tablero2 = []
tablero1.forEach((x, i) => {
tablero2.push(numerosLaterales[i]+" "+x)
})
message.channel.send(new Discord.MessageEmbed().setDescription(
tablero2.join("\n")
).setColor("RANDOM")) //Si no es una bomba, mandamos el tablero actualizado
})
Actualizaciones
1.2.1
- Se han agregado 2 nuevos juegos, russian-roulette y buscaminas
- Se ha actualizado el README
- Se han arreglado problemas menores con el juego hangman
1.1.1
- Se han corregido problemas con el evento end
- Se ha arreglado un problema al establecer la frase
- Se han corregido errores en el README
- Se ha añadido 1 propiedad al constructor:
- game.letrasIncorrectas: Array
1.1.0
- La función Hangman.turno() ahora pasa a Hangman.game.turno
- Se ha arreglado un problema con los jugadores
- Se ha corregido el README
- Se ha arreglado un problema con la opción lowerCase.
- Se han añadido 3 propiedades al constructor:
- game.vidas: Number
- game.winned: Boolean
- game.letrasUsadas: Array