Juegos de mesa multijugador para 4-20 personas, en tiempo real y sin registro
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.
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.
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/
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.
ws/.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.
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.
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.
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.
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.
El código está en el repositorio Proyectos-Personales, dentro de la
carpeta JuntadasParty/.