1.1.2 • Published 3 years ago

death-hangman v1.1.2

Weekly downloads
-
License
MIT
Repository
-
Last release
3 years ago

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