Volver a Proyectos

🎉 Juntadas Party

Juegos de mesa multijugador para 4-20 personas, en tiempo real y sin registro

WebSockets Docker Compose Mobile-first

Escala del Proyecto

4-20Jugadores
47Archivos
9.2kLíneas
0Registros

Descripción General

Una reunión con diez personas y un solo móvil por persona: la idea es que cada uno abra una sala en su teléfono y todos jueguen a lo mismo a la vez, sin instalar nada y sin crear cuenta. Entras con un código de sala y ya estás dentro.

El reto técnico real no son los juegos, es la sincronización. Diez navegadores tienen que ver el mismo estado de partida al mismo tiempo, y HTTP no sirve para eso. La solución es un servidor WebSocket con Ratchet y ReactPHP que mantiene la partida en memoria y empuja cada cambio a todos los participantes.

El juego más ambicioso es el Truco argentino: baraja española de 40 cartas, equipos, y dos sistemas de apuestas paralelos — Truco / Retruco / Vale Cuatro y Envido / Real Envido / Falta Envido — con jerarquías de carta que no siguen ningún orden numérico intuitivo. Implementar sus reglas correctamente fue la mitad del proyecto.

Tecnologías Utilizadas


PHP 8.3

Ratchet

ReactPHP

MySQL 8

Redis

TailwindCSS

Docker Compose

PHPUnit

Los Juegos Implementados

🎴 Color Match

Juego de cartas estilo UNO para 2-10 jugadores: se juega por color o valor, los comodines cambian el color en curso y el Roba 4 puede ser desafiado. Gana quien se queda sin cartas.

🃏 Truco Argentino

Para 2, 4 o 6 jugadores en equipos, con baraja española de 40 cartas. Dos sistemas de apuesta simultáneos: Truco → Retruco → Vale Cuatro (1 a 4 puntos) y Envido → Real Envido → Falta Envido (hasta 15 puntos).

🕵️ El Impostor

Todos reciben una palabra menos uno; hay que descubrir quién no la tiene mediante pistas y votación.

😈 Verdad o Reto

El clásico, con selección aleatoria de participante y de tipo de prenda.

Arquitectura

Dos procesos separados que comparten base de datos: la aplicación web sirve las páginas por HTTP con un micro-router PHP propio, y el servidor WebSocket de ws/ mantiene las conexiones abiertas y el estado de las partidas. Todo el entorno — PHP, MySQL, Redis, Nginx y phpMyAdmin — se levanta con un solo docker compose up.

JuntadasParty/
├── docker-compose.yml   # php, mysql, redis, nginx, phpmyadmin
├── Makefile             # atajos de desarrollo
├── build-deploy.sh
├── composer.json        # ratchet / reactphp
├── phpunit.xml
├── public/               # document root
├── app/                  # micro-router y lógica de los juegos
├── ws/                   # servidor WebSocket (puerto 8081)
├── db/                   # migrate.php y seed.php
└── tests/

Integraciones Externas

Ratchet + ReactPHP

Servidor WebSocket en PHP que mantiene las conexiones abiertas y difunde el estado de la partida a todos los jugadores de la sala.

Redis

Capa de caché opcional para el estado volátil de las partidas en curso.

Docker Compose

Entorno completo reproducible: PHP, MySQL 8, Redis, Nginx y phpMyAdmin con un solo comando.

PHPUnit

Pruebas automatizadas sobre la lógica de los juegos, donde las reglas son fáciles de romper al tocar algo.

Flujo de una Partida

  1. Crear sala: un jugador abre la web y crea una sala; el sistema genera su código de acceso.
  2. Unirse: el resto entra con el código desde su móvil, eligiendo solo un nombre. Sin registro ni email.
  3. Conexión persistente: cada navegador abre un WebSocket contra el servidor de ws/.
  4. Elegir juego: el anfitrión escoge el juego y el servidor reparte el estado inicial a todos.
  5. Turnos sincronizados: cada jugada viaja al servidor, que valida las reglas y difunde el nuevo estado a la sala completa.
  6. Resolución: el servidor determina el final según las reglas del juego y anuncia el resultado.

Retos Técnicos y Decisiones de Diseño

WebSockets en PHP, que no está pensado para eso

PHP muere al final de cada petición: no hay estado entre llamadas, que es justo lo que necesita una partida. Ratchet sobre ReactPHP le da a PHP un bucle de eventos y procesos de larga duración. Eso obliga a un cambio de mentalidad: en ese proceso no puedes confiar en variables globales ni dejar recursos abiertos, porque no se limpian solos como en una petición normal.

Las reglas del Truco son el verdadero problema

El Truco tiene dos apuestas corriendo en paralelo con puntuaciones distintas, un orden de cartas que no es numérico, equipos, y cantos que se pueden subir o rechazar. Es el tipo de lógica donde cualquier cambio rompe un caso límite, y por eso es el módulo que más cobertura de PHPUnit tiene: las reglas se verifican con pruebas, no jugando.

Sin registro, pero con identidad durante la partida

Pedir cuenta mata el juego: nadie se registra en una reunión. Pero el servidor necesita saber quién es quién si alguien recarga o se le va el wifi. La sala mantiene la identidad del jugador asociada a su conexión, de forma que reconectar te devuelve a tu sitio en la partida sin haber dado nunca un email.

Mi Rol

Desarrollador full stack — autor único.

Micro-router, servidor WebSocket, lógica y reglas de los cuatro juegos, frontend mobile-first, migraciones, seeds, pruebas con PHPUnit y el entorno Docker.

Estado del Proyecto

Proyecto funcional en local mediante Docker Compose, con migraciones y datos de prueba. Los cuatro juegos están implementados y jugables; el Truco cuenta con pruebas automatizadas sobre sus reglas.

Código y Enlaces

El código está en el repositorio Proyectos-Personales, dentro de la carpeta JuntadasParty/.