Cascade Puzzle: un puzzle diario de bloques para la web
Lancé un juego de puzzle estilo Panel de Pon: un desafío diario con límite de movimientos, un editor de niveles y un modo versus online. Qué es, y la ingeniería que hace que un puzzle sea justo de verdad.
Lancé un juego de puzzle: Cascade Puzzle. Es un puzzle de intercambiar bloques de la familia de Panel de Pon y Tetris Attack, dos juegos de la era SNES que para mí envejecieron mejor que casi cualquier otro de esa generación. Intercambiás dos bloques adyacentes, alineás tres o más del mismo color, y se limpian. La gravedad hace caer el resto, lo que puede armar nuevas combinaciones que se limpian de nuevo. Las cadenas son todo el arte del juego.
La diferencia está en el formato. En vez de un modo arcade infinito, el corazón de Cascade Puzzle es un desafío diario: un tablero por día, un límite fijo de movimientos, y el objetivo de limpiar todos los bloques antes de quedarte sin jugadas. Si lo resolvés, ganás una medalla. Es el loop de Wordle aplicado a un género que me encanta: corto, autocontenido y resuelto en unos minutos.
También hay un modo práctica con un pool grande de puzzles, estadísticas personales, un editor de niveles para armar y compartir tus propios tableros, y un modo versus donde jugás en tiempo real contra un bot u otra persona.
Que el límite de movimientos sea justo
El problema interesante de ingeniería no fue el rendering ni la animación. Fue la confianza. Si el puzzle del día dice "resolvelo en 5 movimientos", ese número tiene que ser honesto. Si sobra margen, el puzzle aburre; si es imposible, el juego está roto.
Cascade Puzzle genera sus tableros y después corre un solver BFS sobre el grafo completo de movimientos, incluyendo jugadas de preparación que no combinan nada por sí solas. El solver encuentra la solución más corta o demuestra que no existe. Los tableros sin solución se descartan, y el límite de movimientos de cada puzzle publicado es exactamente el largo de la solución más corta. El par no es una estimación. Es una prueba.
Ese solver existe porque toda la lógica del juego vive en un paquete de TypeScript puro, sin dependencias: estado del tablero, swaps, detección de matches, gravedad, resolución de cadenas. Funciones puras de punta a punta, fáciles de testear, que le permiten al solver simular miles de estados de tablero sin tocar un renderer.
El stack
El rendering es Phaser embebido en React: la escena del juego maneja bloques y animaciones, y React maneja todo lo demás: menús, diálogos, estadísticas y routing con TanStack Router. El backend es tRPC con Drizzle y PostgreSQL, y todo es un monorepo de pnpm donde el juego, el editor de niveles y el server comparten los mismos paquetes core.
El modo versus fue una aventura aparte. La simulación es totalmente determinística, así que las partidas online usan netcode lockstep con rollback: los clientes solo intercambian inputs y cada uno simula la partida localmente. El bot rival usa el mismo motor determinístico, con niveles de dificultad que son literalmente acciones por minuto.
Si te gusta este tipo de puzzle, el desafío diario te espera. Corre en el navegador, en desktop y en el teléfono, y una partida lleva menos tiempo que leer este post.