El Dudo —o cacho, o Perudo— es el juego de dados de engaño que se juega en casi todas las mesas chilenas. Quise jugarlo online con amigos y no encontré una versión en español que me gustara, así que la hice: dudo.igna.cl (código MIT en GitHub).

Partida de Dudo en el navegador

El problema: estado compartido en tiempo real

Cada sala es un objeto Game en memoria con jugadores, turno, apuesta vigente y reglas. Los clientes se conectan por WebSocket y el servidor es la única fuente de verdad: valida cada apuesta y manda a cada jugador solo lo que debe ver (nunca los dados ajenos antes del desafío).

Reglas que parecen simples

Los ases son comodines, salvo cuando se apuesta por ases; al cambiar entre unos y otros, la cantidad mínima cambia (de normal a ases, la mitad hacia arriba; de ases a normal, el doble más uno). Esa regla y la del paso tienen tests porque son fáciles de romper.

Reconexión

Un celular que pierde señal no debería sacarte de la partida. Cada jugador tiene un id anónimo persistente y un tiempo de gracia para reconectarse; mientras tanto la partida sigue y el turno no se roba.

Bots

Hay cinco niveles. Los primeros usan probabilidades binomiales (con los ases como comodín, cada dado cuenta con probabilidad 1/3 para una cara normal). El experto además guarda memoria de rondas, estima la tasa de bluff de cada rival y bluffea a propósito de vez en cuando.

Persistencia

Postgres guarda estadísticas, niveles y permite restaurar salas tras un reinicio. Las migraciones se aplican al arrancar.

Qué aprendí

  • Un solo proceso con estado en memoria alcanza para cientos de salas pequeñas; no hace falta Redis al principio.
  • Limitar la tasa de mensajes por jugador evita abusos con casi cero costo.
  • El front en JS vanilla fue suficiente, pero el manejo de estado crece rápido.

Si lo pruebas, me interesa saber qué se siente raro. Y si juegas cacho con otras reglas, cuéntame cuáles.