Recreando el Parqués/Parchis en ReactJS - Primera Parte
Tags: react, pwa, serviceworkers, websockets
Published: 2020-03-07 16:42:48

---
title: Recreando el Parqués/Parchis en ReactJS - Primera Parte
published: true
description: Parchis ReacJS
tags: React, PWA, ServiceWorkers, WebSockets
---

En este artículo me gustaría compartir la experiencia de desarrollo del Juego [El parqués](https://es.wikipedia.org/wiki/Parqu%C3%A9s) y su variación conocida como [El Parchís](https://es.wikipedia.org/wiki/Parch%C3%ADs) en ReactJS.


![Image_01](https://raw.githubusercontent.com/Jorger/parchisi-game/master/images_tutorial/img_01.gif?token=AAAHKYVOA74X63ESLYE33CK6KP5AW)

# El Juego.

**Jugar Parchís ReactJS: https://parchisreact.herokuapp.com**

[El parqués](https://es.wikipedia.org/wiki/Parqu%C3%A9s) es un juego de mesa de origen Colombiano, derivado del [parchís](https://es.wikipedia.org/wiki/Parch%C3%ADs) Español y este a su vez del antiguo pachisi o chaupar de la India.

Tanto la versión Colombiana como la Española guardan varias similitudes en cuanto a las reglas.

### Similitudes.

![Image_02](https://raw.githubusercontent.com/Jorger/parchisi-game/master/images_tutorial/img_02_tablero.png?token=AAAHKYT2J3AKXZHI5L2GZ5K6KP54G)


* Se utiliza un tablero en el cual pueden jugar de dos a cuatro jugadores (existen versiones en las cuales se puede jugar un número mayor)
* Hace uso de dos dados.
* Cada jugador cuenta con cuatro fichas, las cuales inician en la cárcel.
* Existen casillas que son marcadas como seguros (las que son representadas con una estrella y las casillas de salida y llegada)
* Si una ficha de diferente color cae en una casilla donde se encuentra otra ficha, la enviará a la cárcel.
* Gana el jugador que lleve las 04 fichas a la meta.

### Diferencias.

![Image_03_barrera](https://raw.githubusercontent.com/Jorger/parchisi-game/master/images_tutorial/img_03_Barrera.png?token=AAAHKYSRSHZRVPN56IW5ER26KQATY)


* Para sacar a una ficha de la cárcel el jugador deberá obtener un cinco, bien por que uno de los dados obtuvo un cinco o porque la sumatoria de los dos dados es cinco, se sacará una ficha, si el usuario obtiene pares de 5 sacará dos fichas de la cárcel.
* Si dos fichas del mismo color caen en la misma celda, forman una barrera. Ni la ficha del jugador ni la ficha del oponente pueden cruzar el bloqueo. Si un jugador no puede mover ninguna ficha debido a un bloqueo, el turno se perderá.
* Si el jugador obtiene el par, entonces el jugador se ve obligado a romper la barrera (si existe)
* Si existen dos fichas de diferentes colores formarán un bloqueo en una celda segura y se aplicarán las mismas reglas que las anteriores para eliminar las barreras.
* Si un jugador envía una ficha a la cárcel, obtendrá una recompensa de 20 movimientos que no se pueden dividir entre las fichas.
* Si un jugador lleva una ficha a la meta, obtendrá una recompensa de 10 movimientos que no se pueden dividir entre las fichas.

# Motivación.

La motivación de crear este juego se basa en lo siguiente:

* Profundizar en el conocimiento de ReactJS y las nuevas funcionalidades que esta librería nos ofrece, por ejemplo: [`hooks`](https://reactjs.org/docs/hooks-intro.html) [`suspense`](https://reactjs.org/docs/react-api.html#suspense) [`lazy`](https://reactjs.org/docs/react-api.html#reactlazy), entre otras
* Hacer uso de [WebSockets](https://en.wikipedia.org/wiki/WebSocket) para jugabilidad en tiempo real.
* Mejorar los conocimientos relacionados a CSS/CSS3
* Crear una aplicación que funcione offline, haciendo uso de [ServiceWorker](https://developers.google.com/web/fundamentals/primers/service-workers) (PWA)
* Hacer uso de autenticación a través de redes sociales haciendo uso de [PassportJS](http://www.passportjs.org/) y de las [estrategias](http://www.passportjs.org/packages/) necesarias para cada una de las redes sociales que se han utilizado (Github, Twitter y Google)

# Stack

A continuación listaré el Stack de tecnologías con las cuales se desarrolló el juego.

### Front

Como lo había mencionado el juego está hecho haciendo uso de la librería conocida como [ReactJS](https://reactjs.org/), en este caso se hizo uso del conocido paquete [CRA (Create React APP)](https://create-react-app.dev/) el cual permite un rápido inicio en el uso de ReactJS, debido a que nos configura por defecto todo el entorno, como por ejemplo configuraciones relacionadas a [WebPack](https://webpack.js.org/), [workbox](https://developers.google.com/web/tools/workbox) para el manejo de ServiceWorkers/PWA, entre otras características.

Otros de los paquetes que se ha utilizado a nivel de front son:

* [Reach Router](https://reach.tech/router): Para manejar las rutas a nivel de front.
* [howler](https://www.npmjs.com/package/howler): Para el manejo de sonidos
* [react-countdown-circle-timer](https://www.npmjs.com/package/react-countdown-circle-timer): Para manejar un cronometro en las partidas online.
* [react-dice-complete](https://www.npmjs.com/package/react-dice-complete): Para el manejo de los dados, este paquete otorga una gran flexibilidad para manejar la animación de los dados.
* [socket.io-client](https://www.npmjs.com/package/socket.io-client): Este es el cliente para la popular librería conocida como [socket.io](https://socket.io/), la cual facilita el uso de websockets
* [sweetalert](https://www.npmjs.com/package/sweetalert): Para el manejo de los mensajes/modals en el juego.
* [react-app-rewired](https://www.npmjs.com/package/react-app-rewired): Permite reescribir algunas reglas de CRA, sin la necesidad de hacer un [eject](https://github.com/satendra02/react-chrome-extension/wiki/What-happens-when-you-eject-Create-React-App).


### Backend

El backend de la aplicación está en NodeJS, haciendo uso de [ExpressJS](https://expressjs.com/), [MySql](https://www.mysql.com/) para persistencia de datos, además de ello se hace uso de los siguientes paquetes:

* [connect-redis](https://www.npmjs.com/package/connect-redis): Middleware que permite conectar con Redis (redis se utiliza para guardar la información relacionada a sesiones de usuario, así como para la creación de salas en la modalidad online del juego)
* [passport](https://www.npmjs.com/package/passport): Permite el manejo de autenticación, en este caso se hizo autenticación a través de medios sociales, haciendo uso de tres estrategias: [passport-github2](https://www.npmjs.com/package/passport-github2) [passport-google-oauth2](https://www.npmjs.com/package/passport-google-oauth2) y [passport-twitter](https://www.npmjs.com/package/passport-twitter)
* [mysql](https://www.npmjs.com/package/mysql): Driver que permite la conexión con la base de datos.
* [socket.io](https://www.npmjs.com/package/socket.io): 
Para el manejo de sockets, en este caso en el lado del servidor
* [redis](https://www.npmjs.com/package/redis): Driver para conectar con Redis

En la [segunda parte](https://dev.to/jorger/recreando-el-parques-parchis-en-reactjs-segunda-parte-4f6o) de este artículo hablaré acerca de las modalidades del juego, así como la arquitectura y algunos desafíos en el desarrollo del mismo.