Volver al blog
Código creativo

Hice un juego donde todo está generado por código

2 de julio de 2026 6 min de lectura

Empezó con una pregunta tonta

Una noche pregunté: "¿se puede hacer música con código?" Unas horas más tarde la cosa había crecido hasta convertirse en un juego completo y jugable. Sin assets descargados. Sin motor de juego. Sin dependencias. Todo lo que ves y oyes se calcula a partir de una receta corta.

Esta es la historia de esa bola de nieve, y de la única idea que hizo encajar todo.

1. Música a partir de una fórmula

El primer experimento fue un sintetizador escrito a mano: llenar un array de muestras, una muestra a la vez. Una onda senoidal por aquí, una onda cuadrada por allá, una envolvente para dar forma a cada nota. En menos de una hora ya había crecido hasta dar:

  • un bucle lo-fi relajado,
  • un chiptune de 8 bits con canales al estilo NES como Dios manda (dos ondas de pulso, un bajo triangular, un canal de ruido para la batería), incluyendo el truco clásico en el que los acordes se arpegian a ~50 Hz porque cada canal es monofónico,
  • un tema de pelea contra el jefe en la menor armónica.

Nada de esto es una grabación. Son las notas, las formas de onda, las matemáticas.

2. Sprites a partir de una cuadrícula

Si la música es "notas, no una grabación", ¿cuál es el equivalente para un sprite? La cuadrícula, no la imagen. Un personaje dibujado como filas de texto:

"....KhhhhhhK...."
"...KhhsssshhK..."
"...Khsessesh K.."   // eyes

Más un diccionario que asocia cada carácter a un color. Un sprite de 16×16 son ~256 caracteres de texto. Para demostrar que era autosuficiente, hasta escribí el codificador PNG a mano (zlib más un par de chunks). ¿Animarlo? Cambia cuatro líneas de texto entre dos poses.

3. El desvío que me enseñó la verdadera lección

Alguien preguntó: "entonces, ¿por qué no generar una imagen 1080p en código?" Buena pregunta. Rendericé un conjunto de Mandelbrot de 1920×1080 en ~50 líneas, en 9 segundos.

Fue ahí cuando se cristalizó el principio:

Un archivo es detalle calculado o detalle almacenado. El código te da lo primero gratis. Lo segundo no.

Un fractal tiene detalle infinito a partir de una fórmula de 2 líneas. Un sprite de 16×16 tiene 256 píxeles colocados a mano. Una fotografía tiene ~2 millones de píxeles que ninguna fórmula corta puede regenerar, que es justamente por lo que no se puede "programar", y por lo que ese es el trabajo de un modelo de imágenes con IA o de un artista. La frontera no es la resolución. Es la compresibilidad: ¿se puede describir el contenido con reglas?

4. El juego

Con la música y los sprites resueltos, el resto fue ensamblaje. CodeQuest es un juego de supervivencia al estilo Vampire Survivors: hordas de enemigos que van directos a por ti, un arma que dispara sola, gemas de XP, subidas de nivel y un jefe calavera con su propia banda sonora que arranca cuando aparece.

Todo el conjunto (renderizado, física, IA de enemigos, dos bandas sonoras procedurales, efectos de partículas, una cámara con scroll) cabe en un único index.html, ~28 KB, cero dependencias, sin paso de build. Es el juego entero, en un archivo de texto que puedes meter en control de versiones.

5. Así es literalmente como se hicieron los clásicos

Aquí viene la parte que convierte un experimento de fin de semana en una lección de historia: así es como se construyeron los juegos con los que creciste.

La NES no podía almacenar audio grabado. Su chip de sonido, el Ricoh 2A03, daba a los compositores cinco canales: dos ondas cuadradas, una triangular, un canal de ruido y un costoso canal de muestras que la mayoría de los juegos apenas tocaba. Un cartucho almacenaba kilobytes; no había sitio para un MP3. Así que la música no se grababa, se describía: tonos, formas de onda, duraciones. La receta, no el resultado. Exactamente lo que hace CodeQuest. (Zelda es una pista curiosa: su versión japonesa para Famicom Disk System tenía hardware de audio extra, y Nintendo recortó la música para la edición en cartucho.)

Y las limitaciones engendraron genialidad, no concesiones. Koji Kondo metió toda la banda sonora de Super Mario Bros. en unos 40 KB repartidos entre esos cinco canales lo-fi, y compuso melodías que el planeta entero sigue tarareando. Reutilizaba material igual que yo reutilizo una función:

  • El jingle del power-up que oyes cuando Mario coge un champiñón es la fanfarria de "Course Clear" de fin de nivel, tocada a un tempo descomunalmente más rápido: una sola pieza compuesta, dos usos.
  • Los temas eran deliberadamente cortos y aptos para bucle, hechos para repetirse durante minutos sin cansar. La limitación se convirtió en el estilo.

No amamos esa música a pesar de los límites. Los límites son por lo que la amamos: la escasez obliga a la melodía. CodeQuest no es más que un pequeño eco moderno del mismo truco: cuando no puedes almacenarlo todo, lo describes, y resulta que "describible" y "bonito" se solapan mucho más de lo que uno imaginaría.

6. Por qué esto importa (más allá de la diversión)

Para un juego minimalista, la generación procedural es un superpoder:

  • Diminuto. Kilobytes, no megabytes. Sin pipeline de assets.
  • Versionable. Cada sprite y cada canción es un diff en un archivo de texto.
  • Retocable hasta el infinito. Cambia dos números y obtienes un nivel nuevo o una melodía nueva.

Y el futuro híbrido es evidente: usa un modelo de imágenes con IA (Nano Banana, GPT-image) para el aspecto de un sprite complejo, y luego tráelo de vuelta al código: reduce la escala, cuantízalo a una paleta pequeña, y vuelves a tener un asset editable, diminuto y animable. IA para la forma, código para el detalle que quieres mantener ligero.

Pruébalo

Empezó con una pregunta tonta. Terminó siendo un método. Próxima parada: iOS.


También en Medium. Construyo todo esto en solitario, en público — andygarcia.pro.

¿Un proyecto del mismo estilo?

Diseño y despliego productos como este. Hablemos.

Hablemos