🎉 Juntadas Party
Juegos de mesa multijugador para 4-20 personas, en tiempo real y sin registro
Escala del Proyecto
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
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.
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).
Todos reciben una palabra menos uno; hay que descubrir quién no la tiene mediante pistas y votación.
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
Servidor WebSocket en PHP que mantiene las conexiones abiertas y difunde el estado de la partida a todos los jugadores de la sala.
Capa de caché opcional para el estado volátil de las partidas en curso.
Entorno completo reproducible: PHP, MySQL 8, Redis, Nginx y phpMyAdmin con un solo comando.
Pruebas automatizadas sobre la lógica de los juegos, donde las reglas son fáciles de romper al tocar algo.
Flujo de una Partida
- Crear sala: un jugador abre la web y crea una sala; el sistema genera su código de acceso.
- Unirse: el resto entra con el código desde su móvil, eligiendo solo un nombre. Sin registro ni email.
- Conexión persistente: cada navegador abre un WebSocket contra
el servidor de
ws/. - Elegir juego: el anfitrión escoge el juego y el servidor reparte el estado inicial a todos.
- Turnos sincronizados: cada jugada viaja al servidor, que valida las reglas y difunde el nuevo estado a la sala completa.
- 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/.