death-hangman v1.1.2
death-hangman
Un módulo dedicado a bots de discord para jugar ahorcado/hangman
Support & suggestions
Hangman class
Constructor
new Hangman(text, {jugadores, lowerCase, lives, findWords, findWholeText});PARÁMETROS:
- text: String con la frase del juego
 
OPCIONES:
jugadores: Array con las ID's de los jugadores del juego actual
lowerCase: Boolean, 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
- lives: Number, número de intentos antes de que el juego se pierda automáticamente
Default: 7
 - findWords: Boolean, true para poder encontrar palabras completas
Default: false
 - findWholeText: Boolean, true para poder encontrar todo el texto oculto
Default: false
 
EVENTOS:
- end: 
Retorna: Objeto con la configuración del juego actual
 
//Configuración del juego actual:
game: {
  word: 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
  lives: Number, //Numero de intentos restantes
  turn: 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: ['_','_','_']
  chars: {
    used: Array, //Array con todas las letras que se han usado en el juego actual
    wrong: 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)
  },
  step: Number, //Número de intentos de adivinanzas que se han ejecutado
  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
  lastTurn: String, //String con la ID del jugador del último turno
}PROPIEDADES
game: Objeto con la configuración del juego actual (especificado arriba)
players: Lista de los siguientes turnos en la cola
MÉTODOS
find: Busca la letra especificada como parámetro
- texto: El texto a buscar en la frase
 
nextTurn: Salta al siguiente turno
- player: Si un jugador es especificado, salta toda la cola hasta su turno
 
removePlayer: Elimina un jugador especificado en la partida actual
ascii: Retorna un array con el juego ascii
EJEMPLO HANGMAN:
//Ejemplo usando el módulo discord.js v13
const Hangman = require('death-hangman')
const menciones = message.mentions.users.map(x => x.id)
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!')
const jugadores = [message.author.id, ...menciones] //Array de jugadores donde el primer elemento es el autor del mensaje
//*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({
    filter: 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, '') //Reemplazamos carácteres diferentes a los de la expresión regular para evitar problemas (usamos solo números y letras)
}).catch(() => canal.send('Tiempo agotado!'))
if (!palabra) return;
const ahorcado = new Hangman(palabra, {
    jugadores: jugadores,
    lowerCase: true,
    lives: 7
})
ahorcado.on('end', game => {
    if (game.winned) { //Si el juego ha terminado y se ha descubierto toda la frase
        return message.channel.send('El juego ha finalizado! La frase era: **' + game.text + '**\n' +
            'Descubierto por: **' + client.users.cache.get(game.lastTurn).tag + '**\n\n```' + game.ascii.join(' ') + '```')
    } else { //Si ha terminado pero no han descubierto la frase
        return message.channel.send('Han perdido! La frase era: **' + game.text + '**\n' +
            'Último error: **' + client.users.cache.get(game.lastTurn).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.turn).tag + '**')
const colector = message.channel.createMessageCollector({
    filter: msg => msg.author.id == ahorcado.game.turn && /[A-Za-z0-9ñ]/.test(msg.content) && msg.content.length == 1
}) //hacemos un colector de letras y numeros de longitud 1
colector.on('collect', msg => {
    const encontrado = ahorcado.find(msg.content) //Usamos el método find() para encontrar una letra en la frase, éste retorna true si se encuentra, de lo contrario false
    if (ahorcado.game.ended) {
        colector.stop() //Si el juego ya ha terminado, detenemos el colector
        return
    }
    if (!encontrado) message.channel.send('- Vaya! Parece que la letra ' + msg.content + ' no se encontraba en la frase!\nLetras incorrectas: **[' + ahorcado.game.chars.wrong.join(', ') + ']**')
    message.channel.send('```\n' + ahorcado.game.ascii.join(' ') + '\n```**Turno de ' + client.users.cache.get(ahorcado.game.turn).tag + '**\nIntentos restantes: **' + ahorcado.game.lives + '**')
})Changelog
v1.1.2
- Añadidas opciones findWord y findWholeText
 - Arreglos en las funciones find, nextTurn y removePlayer
 - Arreglos en README.md
 - Optimizado el código general