Desarrollando el Juego del
Parqués/Parchís en
ReactJS/WebSockets
Jorge Rubiano
@ostjh
Aprendiendo a través del desarrollo de juegos
https://github.com/jorger
Aprendiendo ReactJS a través de Juegos
https://bit.ly/2XH11CGhttps://bit.ly/2VmrWChhttps://bit.ly/34KvpgS
● Profundizar en el conocimiento de ReactJS y las
nuevas funcionalidades que esta librería nos ofrece,
por ejemplo: hooks suspense lazy, entre otras
● Hacer uso de WebSockets para jugabilidad en
tiempo real.
● Mejorar los conocimientos relacionados a CSS/CSS3
● Crear una aplicación/juego que funcione offline,
haciendo uso de ServiceWorker (PWA)
● Hacer uso de autenticación a través de redes
sociales y/o servicios, haciendo uso de PassportJS y
de las estrategias necesarias para cada uno de los
servicios utilizados (Github, Twitter y Google)
Motivación.
El parqués es un juego de mesa de origen Colombiano,
derivado del parchís 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.
El parqués/Parchís
https://es.wikipedia.org/wiki/Parqu%C3%A9s
● Se utiliza un tablero en el cual pueden jugar
de dos a cuatro jugadores.
● 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.
● 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.
Reglas.
● 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 un par, entonces el jugador se
ve obligado a romper la barrera (si existe)
Reglas.
● 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.
● Si un jugador obtiene tres pares consecutivos, la
última ficha que haya movido será enviada a la cárcel.
Reglas.
https://parchisreact.herokuapp.com/
Jugar!
Modalidades de Juego
● Modo Offline: Permite que el juego sea
jugado en un mismo dispositivo (sin requerir
conexión a internet), a su vez se puede
tener las siguientes variaciones:
1. Jugar dos, tres o cuatro jugadores.
2. Jugar versus un Bot.
3. Jugar entre bots.
Ejemplo Juego bots: https://youtu.be/l8iZHvhWtoc
Modalidades de juego.
Modo Online: Permite dos o cuatro jugadores puedan jugar en “tiempo real” en
su propio dispositivo, este modo hace uso de websockets/Socket.io, permitiendo
que cada usuario envíe sus movimientos a los demás jugadores.
1. Random selection.
2. Play with friends.
3. Party mode.
Modalidades de juego.
1. Random selection.
Se selecciona de forma
aleatoria el contrincante.
Ejemplo Juego - cuatro jugadores: https://youtu.be/WKU4IRVuM9o
Modalidades de juego
2. Play with friends.
Permite crear una sala
privada, para iniciar una
partida con un amig@
Modalidades de juego
3. Party mode.
Modo especial en el cual se
fusionan los tipos offline y online,
en este caso los jugadores harán
uso de un sólo tablero y las
acciones de movimientos y
lanzamiento de dados se podrían
hacer desde un dispositivo móvil
Modalidades de juego
Party Mode
Chat/emojis
● Emojis: Permite que un jugador pueda
expresarse a través del uso de emojis y
mensajes predeterminados durante una
partida, igualmente existe la opción
para silenciar un usuario si fuese
necesario.
● Chat: Igualmente existe un chat desde
el cual los usuarios podrán conversar
durante una partida online, los
mensajes escritos no son almacenados.
Otras características
Stack
El juego está desarrollado haciendo uso de
la librería conocida como ReactJS, en este
caso se hizo uso del conocido paquete CRA
(Create React APP) 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, workbox para el
manejo de ServiceWorkers/PWA, entre otras
características.
Front
● Reach Router: Para manejar las rutas a nivel de front.
● howler: Para el manejo de sonidos
● react-countdown-circle-timer: Para manejar un cronometro en las partidas
online.
● 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: Este es el cliente para la popular librería conocida como
socket.io, la cual facilita el uso de websockets
● sweetalert: Para el manejo de los mensajes/modals en el juego.
● react-app-rewired: Permite reescribir algunas reglas de CRA, sin la
necesidad de hacer un eject.
Front
NodeJS:
● ExpressJS
● MySql
● redis
● socket.io
● PassportJS
BackEnd
BackEnd - FrontEnd
Hooks, Suspense, Lazy
https://bhanu.io/easy-code-splitting-using-react-lazy-and-suspense-ec5295b8082e
Arquitectura de
Sockets
Arquitectura - Tiempo real
Arquitectura - Party mode
Desafíos
Desafíos
● Creación del escenario/board a través de CSS y ubicación de cada unas de las
celdas en el escenario de forma dinámica.
● Establecer el movimiento de las fichas en el board, validar cuando se encuentra
más de una ficha en una celda y establecer posiciones que evite que una ficha
quede sobre otra.
● Manejo del estado de cada una de las fichas, las cuales tuvieran
"conocimiento" en qué posición/celda se encuentra, el tipo de celda (salida,
seguro, meta).
● Sincronización de los eventos realizados a través de los websockets.
● Hacer distinción entre el router manejado en el front, versus el router manejado
en el backend.
● Para el front se hizo uso de Reach Router para así definir diferentes tipos de páginas,
pero igualmente se hizo uso del router de ExpressJS, en algún momento existió un
conflicto entre las rutas, es decir, cuando se ponía una ruta que hacía referencia al
llamado en el backend, quien capturaba la ruta era el front, mostrando que dicha ruta
no existía, se hacía necesario crear algunas rutas con las cuales se podía hacer
referencia a llamadas del API en el backend, además de rutas necesarias para la
autenticación social.
Desafíos
Desafíos
Por defecto CRA, maneja workbox para el manejo y configuración de los
serviceworkers, esté está configurado como cache firts por lo que toda ruta y/o
assets será chacheado, esto es muy bueno ya que permite que la aplicación
pueda seguir funcionando incluso si el usuario no tiene conexión a internet, pero
al chachear todo también existía el problema que rutas relacionadas a llamados
al API y rutas relacionadas a la autenticación fueran chacheadas, para evitar esto
se podría realizar un eject de CRA exponiendo toda la configuración que éste
tiene, pero se perdería los beneficios que CRA entrega, para evitar ello existe el
paquete react-app-rewired el cual permite reescribir algunas de las reglas que
CRA tiene, sin la necesitad de realizar un eject, para ello se debe realizar el
cambio en el comando que crea el build npm run build
Desafíos
Desafíos
Desafíos
CRA, por defecto monta un servidor, usualmente en el puerto 3000, (aunque
puede ser cambiando PORT=3001 react-scripts start por ejemplo), en este caso
para permitir hacer la autenticación social y el manejo de sockets era necesario
tener otro servidor, CRA entrega una solución la cual es estableciendo un proxy
para hacer uso de este es necesario establecerlo en el package.json
Desafíos
Nueva versión de la APP
Lighthouse
https://lighthouse-dot-webdotdevsite.appspot.com//lh/html?url=https://parchisreact.herokuapp.com/
Conclusiones
● Este tipo de aplicaciones/juegos, es posible ser desarrollado en
cualquier librería, no es exclusivo a ReactJS.
● El manejo de componentes ayudó a un rápido desarrollo del juego.
● Existe una gran variedad de paquetes/librerías que ayudan a un
rápido desarrollo.
● Aprender nuevas tecnologías/lenguajes/librerías a través de
desarrollos de este tipo de actividades es divertido y desafiante.
Conclusiones
Resources
● https://dev.to/jorger/recreando-el-parques-parchis-en-reactjs-primera-parte-nkk
● https://dev.to/glukmann/let-users-know-when-you-have-updated-your-service-w
orker-in-create-react-app-3il9
● https://moduscreate.com/blog/drawing-triangles-in-css/
● https://github.com/Pomax/react-onclickoutside/issues/321
● https://codepen.io/JakubHonisek/pen/qjpeeO
● https://github.com/AdamTyler/react-dice-complete
● https://overreacted.io/making-setinterval-declarative-with-react-hooks/
● https://es.wikipedia.org/wiki/Parch%C3%ADs#Sobre_el_5
¿Preguntas?

Más contenido relacionado

PPSX
Enfoque Estructuralista de la Administración - El Modelo burocrático
PDF
Workbook de JavaScript (2).pdf
PDF
Reactvolution
PDF
Code Blast 2012 - Node.js
PDF
Explorando Mi Trayectoria: una Entrevista Exclusiva
PPTX
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
PPTX
Desarrollo Back-end Con React y node.pptx
Enfoque Estructuralista de la Administración - El Modelo burocrático
Workbook de JavaScript (2).pdf
Reactvolution
Code Blast 2012 - Node.js
Explorando Mi Trayectoria: una Entrevista Exclusiva
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
Desarrollo Back-end Con React y node.pptx

Similar a Bogota js parchis (10)

PDF
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
PDF
Guía e max_cómo desarrollar funciones con javascript para videojuegos online
PPTX
Node-webkit
PPTX
Humanizacion de java script con typescript para d365
PPTX
CrossDvlpu - REACT para desarrolladores de ASP.NET
PPTX
Cross development - React para desarrolladores de asp.net
PDF
PDF
DXAT LENA presentación final
PDF
Codemotion 2017: Pentesting en aplicaciones node.js AS ALWAYS: FOR FUN AND PR...
PDF
Temporis
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Guía e max_cómo desarrollar funciones con javascript para videojuegos online
Node-webkit
Humanizacion de java script con typescript para d365
CrossDvlpu - REACT para desarrolladores de ASP.NET
Cross development - React para desarrolladores de asp.net
DXAT LENA presentación final
Codemotion 2017: Pentesting en aplicaciones node.js AS ALWAYS: FOR FUN AND PR...
Temporis
Publicidad

Más de Jorge Rubiano (6)

PDF
Sistema de Vídeo Clases
PDF
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
PDF
Aprendizaje y juegos - Transmedia UMB
PDF
Platform from mobile learning
PDF
WebRTC - Una nueva tecnología web al servicio de la educación. Caso en Virtua...
PDF
Experiencia de uso de WebRTC en la educación
Sistema de Vídeo Clases
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Aprendizaje y juegos - Transmedia UMB
Platform from mobile learning
WebRTC - Una nueva tecnología web al servicio de la educación. Caso en Virtua...
Experiencia de uso de WebRTC en la educación
Publicidad

Último (20)

PDF
TALLER DE ESTADISTICA BASICA para principiantes y no tan basicos
DOCX
TEXTO DE TRABAJO DE EDUCACION RELIGIOSA - CUARTO GRADO.docx
PDF
Introducción a la historia de la filosofía
DOC
4°_GRADO_-_SESIONES_DEL_11_AL_15_DE_AGOSTO.doc
PPTX
LAS MIGRACIONES E INVASIONES Y EL INICIO EDAD MEDIA
PDF
CURRICULAR DE PRIMARIA santa ursula..pdf
PDF
Uso de la Inteligencia Artificial en la IE.pdf
PDF
Didáctica de las literaturas infantiles.
PDF
Aprendizaje Emocionante - Begoña Ibarrola SM2 Ccesa007.pdf
PDF
ciencia_tecnologia_sociedad Mitcham Carl. (1994)..pdf
PDF
Estadística Aplicada a la Psicología y Ciencias de la Salud Ccesa.pdf
PDF
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
PDF
Ernst Cassirer - Antropologia Filosofica.pdf
PDF
ACERTIJO EL CONJURO DEL CAZAFANTASMAS MATEMÁTICO. Por JAVIER SOLIS NOYOLA
PDF
Los hombres son de Marte - Las mujeres de Venus Ccesa007.pdf
PDF
Aumente su Autoestima - Lair Ribeiro Ccesa007.pdf
DOCX
Programa_Sintetico_Fase_4.docx 3° Y 4°..
PDF
Modelo Educativo SUB 2023versión final.pdf
PDF
La lluvia sabe por qué: una historia sobre amistad, resiliencia y esperanza e...
PDF
Como usar el Cerebro en las Aulas SG2 NARCEA Ccesa007.pdf
TALLER DE ESTADISTICA BASICA para principiantes y no tan basicos
TEXTO DE TRABAJO DE EDUCACION RELIGIOSA - CUARTO GRADO.docx
Introducción a la historia de la filosofía
4°_GRADO_-_SESIONES_DEL_11_AL_15_DE_AGOSTO.doc
LAS MIGRACIONES E INVASIONES Y EL INICIO EDAD MEDIA
CURRICULAR DE PRIMARIA santa ursula..pdf
Uso de la Inteligencia Artificial en la IE.pdf
Didáctica de las literaturas infantiles.
Aprendizaje Emocionante - Begoña Ibarrola SM2 Ccesa007.pdf
ciencia_tecnologia_sociedad Mitcham Carl. (1994)..pdf
Estadística Aplicada a la Psicología y Ciencias de la Salud Ccesa.pdf
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
Ernst Cassirer - Antropologia Filosofica.pdf
ACERTIJO EL CONJURO DEL CAZAFANTASMAS MATEMÁTICO. Por JAVIER SOLIS NOYOLA
Los hombres son de Marte - Las mujeres de Venus Ccesa007.pdf
Aumente su Autoestima - Lair Ribeiro Ccesa007.pdf
Programa_Sintetico_Fase_4.docx 3° Y 4°..
Modelo Educativo SUB 2023versión final.pdf
La lluvia sabe por qué: una historia sobre amistad, resiliencia y esperanza e...
Como usar el Cerebro en las Aulas SG2 NARCEA Ccesa007.pdf

Bogota js parchis

  • 1. Desarrollando el Juego del Parqués/Parchís en ReactJS/WebSockets Jorge Rubiano @ostjh
  • 2. Aprendiendo a través del desarrollo de juegos https://github.com/jorger
  • 3. Aprendiendo ReactJS a través de Juegos https://bit.ly/2XH11CGhttps://bit.ly/2VmrWChhttps://bit.ly/34KvpgS
  • 4. ● Profundizar en el conocimiento de ReactJS y las nuevas funcionalidades que esta librería nos ofrece, por ejemplo: hooks suspense lazy, entre otras ● Hacer uso de WebSockets para jugabilidad en tiempo real. ● Mejorar los conocimientos relacionados a CSS/CSS3 ● Crear una aplicación/juego que funcione offline, haciendo uso de ServiceWorker (PWA) ● Hacer uso de autenticación a través de redes sociales y/o servicios, haciendo uso de PassportJS y de las estrategias necesarias para cada uno de los servicios utilizados (Github, Twitter y Google) Motivación.
  • 5. El parqués es un juego de mesa de origen Colombiano, derivado del parchís 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. El parqués/Parchís https://es.wikipedia.org/wiki/Parqu%C3%A9s
  • 6. ● Se utiliza un tablero en el cual pueden jugar de dos a cuatro jugadores. ● 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. ● 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. Reglas.
  • 7. ● 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 un par, entonces el jugador se ve obligado a romper la barrera (si existe) Reglas.
  • 8. ● 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. ● Si un jugador obtiene tres pares consecutivos, la última ficha que haya movido será enviada a la cárcel. Reglas.
  • 11. ● Modo Offline: Permite que el juego sea jugado en un mismo dispositivo (sin requerir conexión a internet), a su vez se puede tener las siguientes variaciones: 1. Jugar dos, tres o cuatro jugadores. 2. Jugar versus un Bot. 3. Jugar entre bots. Ejemplo Juego bots: https://youtu.be/l8iZHvhWtoc Modalidades de juego.
  • 12. Modo Online: Permite dos o cuatro jugadores puedan jugar en “tiempo real” en su propio dispositivo, este modo hace uso de websockets/Socket.io, permitiendo que cada usuario envíe sus movimientos a los demás jugadores. 1. Random selection. 2. Play with friends. 3. Party mode. Modalidades de juego.
  • 13. 1. Random selection. Se selecciona de forma aleatoria el contrincante. Ejemplo Juego - cuatro jugadores: https://youtu.be/WKU4IRVuM9o Modalidades de juego
  • 14. 2. Play with friends. Permite crear una sala privada, para iniciar una partida con un amig@ Modalidades de juego
  • 15. 3. Party mode. Modo especial en el cual se fusionan los tipos offline y online, en este caso los jugadores harán uso de un sólo tablero y las acciones de movimientos y lanzamiento de dados se podrían hacer desde un dispositivo móvil Modalidades de juego
  • 17. Chat/emojis ● Emojis: Permite que un jugador pueda expresarse a través del uso de emojis y mensajes predeterminados durante una partida, igualmente existe la opción para silenciar un usuario si fuese necesario. ● Chat: Igualmente existe un chat desde el cual los usuarios podrán conversar durante una partida online, los mensajes escritos no son almacenados. Otras características
  • 18. Stack
  • 19. El juego está desarrollado haciendo uso de la librería conocida como ReactJS, en este caso se hizo uso del conocido paquete CRA (Create React APP) 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, workbox para el manejo de ServiceWorkers/PWA, entre otras características. Front
  • 20. ● Reach Router: Para manejar las rutas a nivel de front. ● howler: Para el manejo de sonidos ● react-countdown-circle-timer: Para manejar un cronometro en las partidas online. ● 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: Este es el cliente para la popular librería conocida como socket.io, la cual facilita el uso de websockets ● sweetalert: Para el manejo de los mensajes/modals en el juego. ● react-app-rewired: Permite reescribir algunas reglas de CRA, sin la necesidad de hacer un eject. Front
  • 21. NodeJS: ● ExpressJS ● MySql ● redis ● socket.io ● PassportJS BackEnd
  • 28. Desafíos ● Creación del escenario/board a través de CSS y ubicación de cada unas de las celdas en el escenario de forma dinámica. ● Establecer el movimiento de las fichas en el board, validar cuando se encuentra más de una ficha en una celda y establecer posiciones que evite que una ficha quede sobre otra. ● Manejo del estado de cada una de las fichas, las cuales tuvieran "conocimiento" en qué posición/celda se encuentra, el tipo de celda (salida, seguro, meta). ● Sincronización de los eventos realizados a través de los websockets. ● Hacer distinción entre el router manejado en el front, versus el router manejado en el backend.
  • 29. ● Para el front se hizo uso de Reach Router para así definir diferentes tipos de páginas, pero igualmente se hizo uso del router de ExpressJS, en algún momento existió un conflicto entre las rutas, es decir, cuando se ponía una ruta que hacía referencia al llamado en el backend, quien capturaba la ruta era el front, mostrando que dicha ruta no existía, se hacía necesario crear algunas rutas con las cuales se podía hacer referencia a llamadas del API en el backend, además de rutas necesarias para la autenticación social. Desafíos
  • 31. Por defecto CRA, maneja workbox para el manejo y configuración de los serviceworkers, esté está configurado como cache firts por lo que toda ruta y/o assets será chacheado, esto es muy bueno ya que permite que la aplicación pueda seguir funcionando incluso si el usuario no tiene conexión a internet, pero al chachear todo también existía el problema que rutas relacionadas a llamados al API y rutas relacionadas a la autenticación fueran chacheadas, para evitar esto se podría realizar un eject de CRA exponiendo toda la configuración que éste tiene, pero se perdería los beneficios que CRA entrega, para evitar ello existe el paquete react-app-rewired el cual permite reescribir algunas de las reglas que CRA tiene, sin la necesitad de realizar un eject, para ello se debe realizar el cambio en el comando que crea el build npm run build Desafíos
  • 34. CRA, por defecto monta un servidor, usualmente en el puerto 3000, (aunque puede ser cambiando PORT=3001 react-scripts start por ejemplo), en este caso para permitir hacer la autenticación social y el manejo de sockets era necesario tener otro servidor, CRA entrega una solución la cual es estableciendo un proxy para hacer uso de este es necesario establecerlo en el package.json Desafíos
  • 38. ● Este tipo de aplicaciones/juegos, es posible ser desarrollado en cualquier librería, no es exclusivo a ReactJS. ● El manejo de componentes ayudó a un rápido desarrollo del juego. ● Existe una gran variedad de paquetes/librerías que ayudan a un rápido desarrollo. ● Aprender nuevas tecnologías/lenguajes/librerías a través de desarrollos de este tipo de actividades es divertido y desafiante. Conclusiones
  • 39. Resources ● https://dev.to/jorger/recreando-el-parques-parchis-en-reactjs-primera-parte-nkk ● https://dev.to/glukmann/let-users-know-when-you-have-updated-your-service-w orker-in-create-react-app-3il9 ● https://moduscreate.com/blog/drawing-triangles-in-css/ ● https://github.com/Pomax/react-onclickoutside/issues/321 ● https://codepen.io/JakubHonisek/pen/qjpeeO ● https://github.com/AdamTyler/react-dice-complete ● https://overreacted.io/making-setinterval-declarative-with-react-hooks/ ● https://es.wikipedia.org/wiki/Parch%C3%ADs#Sobre_el_5