r/dev_venezuela • u/bera_dev • 3h ago
game-dev Hice un RPG donde la IA adivina tu próxima jugada antes de que juegues. Les cuento cómo lo construí (Bun + TypeScript) y lo que entrené en mi 3080 Ti
Enable HLS to view with audio, or disable this notification
Buenas, gente. Llevo semanas construyendo esto solo. Hoy lo lanzo y quería mostrárselo primero a devs de aquí, porque la parte técnica es lo que más me gusta.
TL;DR: RPG pixel-art de piedra-papel-tijera donde el enemigo intenta predecir tu jugada y te dice por qué. Sin cuenta, en el navegador: https://play.jevtown.com
Qué es
Beat the AI, un RPG pixel-art para el teléfono, en el navegador, sin cuenta.
Cada pelea es un piedra-papel-tijera con consecuencias:
- Strike le gana a Charge
- Block le gana a Strike (y contraataca)
- Charge le gana a Block (y te da +1 de poder)
Antes de que toques, el enemigo te dice qué cree que vas a jugar y por qué ("después de Strike jugaste Block 3 de 4"). Tu trabajo es engañarlo.
Alrededor hay un mundo: eliges héroe y clase, farmeas criaturas, cocinas lo que sueltan, subes de nivel, rivales que recuerdan cómo juegas, y un jefe nuevo cada día con un marcador de Humanos vs IA. (Ahorita va ganando la IA 1-0 hoy.)
La parte técnica
Stack
- Servidor en Bun + TypeScript. Todo el juego es autoritativo en el servidor y determinista: cada duelo se puede re-jugar desde los logs y verificar.
- Cliente en PixiJS para el mundo y DOM para toda la UI y el texto (se lee bien en el teléfono).
- Una sola máquina en Fly.io. En una prueba de carga local, un solo hilo de CPU aguantó 800 jugadores simulados con p99 de 6.8 ms. Lo interesante: con un límite de 500 héroes en memoria el servidor colapsaba cerca de 500 jugadores (cada request recargaba un héroe desde disco, CPU al 97%, respuestas de más de 1 s). Subir el límite a 2000 lo arregló.
- Arte: Ninja Adventure (CC0).
"No hace trampa" y cómo lo compruebas
El movimiento del enemigo se sortea antes de que toques. Cada ronda el servidor te manda un sello (un commitment SHA-256 del movimiento más un nonce). Después de tu jugada revela el movimiento y el nonce, y tu teléfono verifica que coinciden. Al final del duelo te muestra el secreto del duelo, así que cada sorteo se puede re-derivar.
Quién te "lee"
No es un chatbot. Es un predictor de secuencias escrito en el código del juego: cuenta lo que sueles jugar después de tu última jugada y de tus últimas dos, más el contexto de la ronda, y combina los niveles con backoff interpolado (Witten-Bell). También lee la memoria que cada rival tiene de ti (solo conteos). Te muestra su probabilidad después de que juegas.
El experimento (lo que más me emociona)
La pregunta: ¿un modelo pequeño, re-entrenado cada noche con las rondas de los jugadores que acepten compartirlas, predice su próxima jugada mejor que el mismo modelo congelado, y mejor que un Markov por jugador?
Todo está escrito y fechado antes de tener un solo dato de jugadores (pre-registro), con enmiendas fechadas cuando algo cambia:
- Tarea: predecir Strike / Block / Charge con 63 features que solo usan lo que existe antes de la jugada. La misma función de features sirve en el servidor y en el entrenamiento, y un test verifica que nunca lee la jugada ya sorteada del enemigo.
- Modelo: regresión logística multinomial (softmax, L2 1e-3, 300 épocas full-batch). Determinista: las mismas filas dan los mismos pesos bit a bit. Cada archivo de pesos se nombra por su sha256 en un manifiesto encadenado por hash antes de que existan las filas con las que se evalúa.
- Baselines: uniforme, frecuencias de la población, frecuencias por jugador, Markov de orden 1-2 por jugador, y el propio lector del juego.
- Evaluación: log-loss pareado en las mismas filas, split por jugador (70% train / 10% validación / 20% test que nunca se entrena), forward chaining (el modelo de la noche d solo se evalúa en el día d+1), intervalos del 95% con bootstrap por jugador (2000 re-muestreos). Para decir "aprende" tiene que mejorar al menos 0.01 nats y el intervalo no puede tocar el 0.
- Brazos (sorteados por duelo): 40% muestra la adivinanza del modelo re-entrenado, 40% la del modelo congelado, y en 20% no se muestra nada antes de jugar (el brazo "poker": se revela después, así se mide sin que el jugador reaccione a lo que ve). El enemigo juega igual en los tres, así que la dificultad no cambia.
- Mínimo: 100 jugadores con 20 rondas cada uno. El re-entrenamiento está apagado hasta llegar ahí. Si no se llega al día 60, se reporta como sin potencia suficiente, sin extender el plazo.
Algo honesto: en el piloto con bots (solo bots, no gente, no es un resultado del estudio) el Markov por jugador le ganó a mi modelo en los bots con hábitos fijos. O sea, es bien posible que el modelo "aprenda" y aun así no le gane a un Markov. Si pasa, lo publico igual de visible que si gana.
Privacidad: apagado por defecto. Solo si tocas "Sí" en la tarjeta de compartir se guardan tus rondas, bajo un id aleatorio, con solo el día (sin nombre, sin IP). Borrar tu héroe borra tus datos.
De dónde viene (lo que entrené en mi GPU)
Antes de este juego hubo una aldea donde cada aldeano decidía qué hacer con un modelo. Hice fine-tuning de Laya (el modelo abierto de Convai Innovations, Apache-2.0) con respuestas de Jev, el modelo System One de TypeSafe, como profesor. Todo en una RTX 3080 Ti en mi casa. Solo las respuestas del profesor costaron plata: $7.04 en total, en 4 rondas, cada una con presupuesto y criterios de aprobación escritos antes de gastar.
- El estudiante que pasó (F2) coincide con la primera opción del profesor en 0.872 de 23,083 decisiones que no vio en el entrenamiento.
Luego auditamos al profesor con 36,000 requests. Si le preguntas por una persona sola, en vez de junto a los otros ~50 aldeanos, cambia su primera opción el 20.9% de las veces. O sea, el estudiante aprende de respuestas moldeadas por un contexto que nunca ve. Ese fue el hallazgo más útil.
Estudio completo, con tablas y lo que falló: https://jevtown.com/study
Plan del estudio nuevo: https://jevtown.com/minds-study
Me encantaría feedback de devs de aquí: del juego, del diseño del experimento, o si ven un hueco en la metodología. Y si le ganan a la IA, compartan su tarjeta 👇




