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
Markdown
### 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**