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