
En 1985, Alexey Pajitnov y Vadim Gerasimov lanzaron Tetris. Este juego fascinante y altamente adictivo requería que los jugadores conectaran piezas que aparecían
al azar . Desde entonces, se han lanzado más de 150 versiones con licencia de Tetris. A diferencia de los modos de juego, las reglas y la implementación, todos jugaron un poco (o muy) de manera diferente. El aleatorizador Tetris es una función que devuelve una forma seleccionada al azar. Con los años, las reglas para elegir formas han evolucionado, influyendo en el juego y la aleatoriedad en sí. Algunos de estos algoritmos han sido diseñados y documentados de manera inversa. He compilado una lista de aleatorizadores que considero importantes, y mostraré en el artículo cómo la estructura interna de Tetris ha cambiado con los años.
Tetris (c. 1985)
La primera y original versión de Tetris tenía un aleatorizador sin sesgos. Nada influyó en la elección de la siguiente figura, simplemente fue elegida y mostrada al jugador.
Cuando se usa un aleatorizador sin desplazamiento, surgen situaciones en las que el jugador recibe una secuencia de una figura (llamada "inundación", inundación) o una secuencia en la que no hay una figura determinada (llamada "sequía", sequía). Veremos cómo los diseñadores de diferentes versiones de Tetris intentaron suavizar ligeramente este problema.
Aunque un aleatorizador sin sesgos crea la mayor complejidad de rompecabezas para los jugadores, es inestable y puede conducir a una
secuencia invencible (PDF) . Sin embargo, esto no sucede en un juego real, porque las computadoras no tienen verdaderos generadores de números aleatorios. Los generadores de números pseudoaleatorios (PRNG) intentan simular una aleatoriedad verdadera, pero no tienen las propiedades que pueden generar en una fila 70 mil cifras Z.
Pseudoaleatoriedad verdadera
function* random() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; while (true) { yield pieces[Math.floor(Math.random() * pieces.length)]; } }
Dificultad del rompecabezas: 4/5
Prevención de inundaciones: 0/5
Prevención de sequía: 0/5
Tetris , Nintendo (1989)
Cuatro años después,
se lanzó la versión inusualmente popular de Tetris para
NES .
Para reducir el número de inundaciones (repeticiones) de cifras, se agregó una verificación de historial al aleatorizador. Este simple control hizo lo siguiente:
- elige una figura
- comprobado si la cifra coincide con la anterior,
- si es así, entonces el algoritmo seleccionó una nueva forma, pero solo una vez,
- y cualquiera que sea el resultado, la cifra se le dio al jugador.
Aunque la probabilidad de obtener una pieza consecutiva estaba disminuyendo, nada impedía que el juego emitiera dos piezas alternas. Además, en esta versión, la sequía en más de 30 cifras era una situación frecuente. Podría ocurrir una sequía para cualquier tipo de tetramino, pero la figura I es importante para anotar en este juego, y su gran sequía podría afectar significativamente el puntaje final.
Memorizar una historia 1 figura en profundidad y con 1 tiro
function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let history; while (true) {
Dificultad del rompecabezas: 5/5
Prevención de inundaciones: 2/5
Prevención de sequía: 0/5
Tetris: el gran maestro (1998)
Aunque
Tetris para NES mejoró el algoritmo en comparación con la aleatorización sin sesgo, las sequías en él todavía eran frecuentes.
Tetris: El Gran Maestro (
TGM ) usó esencialmente el mismo sistema, pero con una historia más larga y más lanzamientos.
Debido al aumento en estos valores, no solo disminuyó el número de inundaciones, sino que también mejoró la situación con las sequías. Cuatro figuras se conservaron en la historia, y esto significó que la probabilidad de obtener una figura que no había existido durante mucho tiempo aumentó. A pesar de esto, el juego aún carecía de una regla estricta para prevenir las sequías y todavía ocurrían, aunque con mucha menos frecuencia que en
Tetris para NES .
Memorizar una historia con 4 piezas y 4 tiros
function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z'];
Dificultad del rompecabezas: 4/5
Prevención de inundaciones: 4/5
Prevención de sequía: 2/5
Tetris Worlds y otros (2001)
Tetris Worlds introdujo las masas al generador aleatorio. Ahora es el aleatorizador oficial, en la mayoría de las versiones oficiales del juego después de
Tetris Worlds, y hasta el día de hoy está acostumbrado.
Los aleatorizadores basados en la historia ayudaron a deshacerse de las inundaciones (o al menos minimizarlas), pero no detuvieron la sequía. Bajo ciertas condiciones, aún existía la posibilidad de obtener una secuencia mortal de figuras.
El generador aleatorio (Random Generator) resuelve estos problemas mediante el uso de un nuevo sistema de "bolsas" (bolsas). En este sistema, la lista de figuras se coloca en una "bolsa", después de lo cual las figuras se extraen aleatoriamente una tras otra hasta que la "bolsa" está vacía. Cuando está vacío, las piezas vuelven a él y el proceso se repite. Random Generator tiene una "bolsa" de tamaño 7 (7 bolsas), es decir, una "bolsa" llena de cada uno de los 7 tetraminos. Son posibles otros tipos de "bolsas", por ejemplo, una bolsa de 14, en la que se colocan dos piezas de cada tipo de tetramino.
Debido a la falta de historia de las "bolsas", pueden producirse inundaciones de 2 figuras y "serpientes" de 4 figuras en sus cruces (

,

etc.) Es decir, en cierto sentido, este es un paso atrás en comparación con el
Tetris tradicional
para NES .
Las piezas se caen de la bolsa de forma estable, lo que lo hace más predecible. Es fácil entender en qué parte de la “bolsa” se encuentra y cuándo puede llegar la cifra que necesita. Debido a la previsibilidad de este generador de aleatoriedad, el juego se puede
jugar sin cesar . En general, este es un sistema muy estúpido, y no está claro cómo se convirtió en un aleatorizador oficial.
7 bolsas
function* randomGenerator() { let bag = []; while (true) { if (bag.length === 0) { bag = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; bag = shuffle(bag); } yield bag.pop(); } }
Dificultad del rompecabezas: 3/5
Prevención de inundaciones: 3/5
Prevención de sequía: 4/5
Tetris: The Grand Master 3 - Terror-Instinct (2005)
TGM3 ha avanzado mucho la idea de generar aleatoriedad. Este es un sistema único que no se encuentra en ninguna otra versión.
En lugar de una bolsa o historia, el TGM3 utiliza un conjunto de formas. Inicialmente, tiene 5 figuras de cada tipo, es decir, un total de 35 figuras. Cuando se tira de una figura, no se elimina de la piscina, sino que se reemplaza por la figura con la mayor sequía (una que no se ha eliminado durante mucho tiempo). Gradualmente, la piscina se llena cada vez más con esta figura hasta que finalmente se retira. Esto resuelve los problemas de los sistemas de "bolsa", así como los sistemas con un historial; ella toma lo mejor de ambos tipos de aleatorización.
Grupo de 35 figuras con 6 lanzamientos
function* tgm3Randomizer() { let pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let order = [];
Dificultad del rompecabezas: 4/5
Prevención de inundaciones: 4/5
Prevención de sequía: 4/5
Conclusiones
Es difícil sacar un resultado definitivo. El aleatorizador TGM3 parece más predecible y menos complejo para el jugador. La torpe bolsa de 7 se siente antinatural, pero le permite crear muchas estrategias de construcción establemente viables. Un aleatorizador hostil, como en Tetris para NES, puede arruinar tu juego o, más probablemente, tu estado de ánimo para jugar.
¿Podemos mejorar estos sistemas haciéndolos parecer más aleatorios y poniendo restricciones severas a las sequías e inundaciones? ¿O son restricciones tan severas que solo hacen que el juego sea más predecible?