UNPKG

tresenraya

Version:

Módulo para facilitar la creación del popular juego llamado tres en raya en tus proyectos

219 lines (120 loc) 7.42 kB
### Instalar el módulo ``` $ npm install tresenraya --s ``` ---------------------- > Este módulo te facilitará la creación del juego tres en raya para tus proyectos, teniendo una clase para empezar una nueva partida ### Empezar una nueva partida ```js const tresenraya = require('tresenraya'); const juego = new tresenraya.partida(opciones); ``` ---------------------- ## Opciones `fichas` - **Array** con las fichas con las que se jugará (2 elementos dentro del array) Los dos elementos del array deben ser de tipo **String** > Por defecto: `[ '❌', '⭕' ]` `jugadores` - **Array** con el nombre de los dos jugadores que jugarán la partida (2 elementos dentro del array) Los dos elementos del array deben ser de tipo **String** > Por defecto: `[ 'Jugador 1', 'Jugador 2' ]` `tablero` - **Array** con el tablero en el que se jugará (9 elementos dentro del array) Los elementos del array deben ser de tipo **String** > Por defecto: `[ '1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣' ]` `id` - **String** con la id de la partida que se inicia, sirve para que se almacene en el array al que puedes acceder con la propiedad `partidas` del módulo. Puede servir para que un mismo usuario no pueda jugar varias partidas al mismo tiempo. > Por defecto no se almacena ninguna id ---------------------- ## Eventos ### **ganador** Se emite cuando se encuentra un ganador dentro de la partida que se está jugando. > Parámetros que recibe `jugador` - El jugador que ha ganado (uno de los dos de los que están especificados en **opciones.jugadores**) `tablero` - El tablero final (devuelve un objeto con las propiedades: **array** [tablero en forma de array] y **string** [tablero en forma de texto]) `paso` - Paso por el que iban (devuelve un número) ---------------------- ### **empate** Se emite cuando ocurre un empate dentro de la partida que se está jugando. > Parámetros que recibe `jugadores` - Jugadores que estaban jugando la partida (devuelve el array establecido en **opciones.jugadores**) `tablero` - El tablero que quedó (devuelve un objeto con las propiedades: **array** [tablero en forma de array] y **string** [tablero en forma de texto]) `paso` - Paso por el que iban (devuelve un número) ---------------------- ### **finalizado** Se emite cuando se usa el método `finalizar` > Parámetros que recibe `jugadores` - Jugadores que estaban jugando la partida (devuelve el array establecido en **opciones.jugadores**) `tablero` - El tablero que quedó (devuelve un objeto con las propiedades: **array** [tablero en forma de array] y **string** [tablero en forma de texto]) `turno` - Objeto con la información del turno en el que se quedó. `razón` - Razón específicada al usar el método finalizar. ---------------------- ## Propiedades `opciones` - Las **opciones** establecidas al iniciar la partida. `tablero` - Objeto con dos propiedades: `array` [tablero en forma de array] y `string` [tablero en forma de texto] `turno` - Objeto con los datos del turno actual. `finalizado` - Si la partida ha finalizado devolverá el valor `true`, si no ha finalizado devolverá el valor `false` [**boolean**] `perdedor` - Si alguien resulta ganador/a en la partida, la propiedad **perdedor** devolverá el nombre del jugador que ha perdido, especificado en **opciones.jugadores**, si todavía nadie ha ganado devolverá `null` `posibilidades` - **Array** con las posibilidades de ganar de cada jugador. `partidas` **(Propiedad del módulo, no de la clase Partida)** - **Array** con las id's de las partidas que siguen pendientes todavía. ---------------------- ## Métodos `elegir` - Posicionar la ficha del jugador del turno actual en una posición especifica. > Ejemplo: `elegir(5)` [posicionaría una ficha en la posición 5] `disponible` - Comprobar si la posición solicitada está libre para posicionar una ficha (devuelve un valor de tipo `boolean`) > Ejemplo: `disponible(5)` [comprobaría si la posición 5 del tablero está disponible o no para posicionar una nueva ficha] `pasar` - Pasar al siguiente turno. > Ejemplo: `pasar()` `finalizar` - Finalizar la partida actual (se emitirá el evento **finalizado**) > Ejemplo: `finalizar('razón')` `mejorPos` - Obtén la mejor posición para colocar una ficha (puede servir para un modo contra un bot) > Ejemplo: `mejorPos('x|o')` > Hay que específicar de qué ficha está a favor (podrías poner la ficha que pone el bot) ---------------------- # Ejemplo usando discord.js ```js const tresenraya = require('tresenraya'); const usuario = message.mentions.users.first(); if(!usuario) return message.channel.send('Menciona a alguien'); const partida = new tresenraya.partida({ jugadores: [message.author.id, usuario.id] }); partida.on('ganador', (jugador, tablero, paso) => { // cuando encuentra a algún ganador se emite el evento 'ganador' message.channel.send('¡Ha ganado ' + client.users.get(jugador).username + ' en esta partida! Después de `' + paso + ' pasos.`\n\n' + tablero.string + '\n\nLo siento, ' + client.users.get(partida.perdedor).username + '... 😦'); }); partida.on('empate', (jugadores, tablero, paso) => { // si se produce un empate se emite el evento 'empate' message.channel.send('¡Ha habido un empate entre ' + jugadores.map(x => client.users.get(x).username).join(' y ') + '!'); }); message.channel.send('Empieza ' + client.users.get(partida.turno.jugador).username + ', elige un número del 1 al 9 [`' + partida.turno.ficha + '`]\n\n' + partida.tablero.string); const colector = message.channel.createMessageCollector(msg => msg.author.id === partida.turno.jugador && !isNaN(msg.content) && (Number(msg.content) >= 1 && Number(msg.content) <= 9) && partida.disponible(msg.content) && !partida.finalizado); colector.on('collect', (msg) => { partida.elegir(msg.content); // elegir la posición dependiendo del contenido del mensaje recolectado if(partida.finalizado) { colector.stop(); return; } // si la partida ya ha finalizado (ya sea por que alguien ha ganado o ha habido un empate), para el colector y retorna nada message.channel.send('Turno de ' + client.users.get(partida.turno.jugador).username + ' [`' + partida.turno.ficha + '`]\n\n' + partida.tablero.string); }); ``` ---------------------- ## Actualizaciones > v0.0.4 ``` [+] Algunos errores fueron solucionados. [+] Se agregaron nuevas propiedades. [+] Se agregó la opción de tablero personalizado (opciones.tablero) ``` > v0.0.5 ``` [+] Cambio en la clase para iniciar partida, para crear una nueva partida pasa de ser new tresenraya(opciones) a new tresenraya.partida(opciones) [+] Nueva propiedad para la clase Partida: posibilidades [+] Nueva propiedad para el módulo: partidas [+] Nueva opción: id ``` > v0.0.6 ``` [+] Reestructuración del código interno del módulo [+] Nueva propiedad para la clase Partida: mejorPos ``` > v0.0.7 ``` [+] Mejorado el método mejorPos. [+] Posibilidad de añadir una razón al usar el método finalizar. ``` ---------------------- ## Creador del módulo **G5lvatron#9562**