
Em 1985, Alexey Pajitnov e Vadim Gerasimov lançaram Tetris. Este jogo fascinante e altamente viciante exigia que os jogadores conectassem peças que apareciam
aleatoriamente . Desde então, mais de 150 versões licenciadas do Tetris foram lançadas. Diferindo nos modos de jogo, regras e implementação, todos eles jogaram um pouco (ou muito) de maneira diferente. O randomizador Tetris é uma função que retorna uma forma selecionada aleatoriamente. Ao longo dos anos, as regras para a escolha de formas evoluíram, influenciando a jogabilidade e o próprio acaso. Alguns desses algoritmos foram submetidos a engenharia reversa e documentados. Eu compilei uma lista de randomizadores que considero importantes e mostrarei no artigo como a estrutura interna do Tetris mudou ao longo dos anos.
Tetris (1985)
A primeira e original versão do Tetris possuía um randomizador sem viés. Nada influenciou a escolha da próxima figura, ela foi simplesmente escolhida e exibida ao jogador.
Ao usar um randomizador sem deslocamento, surgem situações em que o jogador recebe uma sequência de uma figura (chamada “inundação”, inundação) ou uma sequência na qual não existe uma determinada figura (chamada “seca”, seca). Veremos como os designers de diferentes versões do Tetris tentaram suavizar um pouco esse problema.
Embora um randomizador sem viés crie a maior complexidade de quebra-cabeça para os jogadores, é instável e pode levar a uma
sequência invencível (PDF) . No entanto, isso não acontece em um jogo real, porque os computadores não possuem verdadeiros geradores de números aleatórios. Os geradores de números pseudo-aleatórios (PRNGs) tentam simular a aleatoriedade verdadeira, mas não possuem as propriedades que podem gerar em sequência 70 mil algarismos Z.
Verdadeira pseudo-aleatoriedade
function* random() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; while (true) { yield pieces[Math.floor(Math.random() * pieces.length)]; } }
Dificuldade de quebra-cabeça: 4/5
Prevenção de inundação: 0/5
Prevenção de Secas: 0/5
Tetris , Nintendo (1989)
Quatro anos depois,
foi lançada a versão incomumente popular do Tetris para
NES .
Para reduzir o número de inundações (repetições) de números, uma verificação de histórico foi adicionada ao randomizador. Essa verificação simples fez o seguinte:
- escolha uma figura
- verificado se a figura corresponde à anterior,
- Nesse caso, o algoritmo selecionou uma nova forma, mas apenas uma vez,
- e qualquer que seja o resultado, o valor foi dado ao jogador.
Embora a probabilidade de conseguir uma peça seguida estivesse diminuindo, nada impedia o jogo de emitir duas peças alternadas. Além disso, nesta versão, a seca acima de 30 números era uma situação frequente. Pode ocorrer uma seca para qualquer tipo de tetramino, mas a figura I é importante para marcar neste jogo, e sua grande seca pode afetar significativamente a pontuação final.
Memorizando uma história 1 figura em profundidade e com 1 arremesso
function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let history; while (true) {
Dificuldade de quebra-cabeça: 5/5
Prevenção de inundação: 2/5
Prevenção de Secas: 0/5
Tetris: O Grão-Mestre (1998)
Embora o
Tetris para NES tenha melhorado o algoritmo comparado à randomização sem viés, as secas nele ainda eram frequentes.
Tetris: O Grão-Mestre (
TGM ) usou essencialmente o mesmo sistema, mas com uma história mais longa e mais arremessos.
Devido ao aumento desses valores, não apenas o número de inundações diminuiu, mas a situação com secas também melhorou. Quatro figuras foram preservadas na história, e isso significava que a probabilidade de obter uma figura que não existia há muito tempo aumentava. Apesar disso, o jogo ainda carecia de uma regra estrita para evitar secas e elas ainda ocorriam, embora com muito menos frequência do que em
Tetris para NES .
Memorizando uma história com 4 peças e 4 jogadas
function* historyRandomizer() { const pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z'];
Dificuldade de quebra-cabeça: 4/5
Prevenção de inundação: 4/5
Prevenção de Secas: 2/5
Tetris Worlds e outros (2001)
Tetris Worlds introduziu as massas no gerador aleatório. Ele agora é o randomizador oficial, na maioria das versões oficiais do jogo depois de
Tetris Worlds, e até hoje ele é usado.
Os randomizadores baseados na história ajudaram a se livrar das inundações (ou pelo menos a minimizá-las), mas não pararam a seca. Sob certas condições, ainda havia a possibilidade de obter uma sequência mortal de figuras.
O gerador aleatório (Random Generator) resolve esses problemas através do uso de um novo sistema de "bolsas" (bolsas). Nesse sistema, a lista de figuras é colocada em uma “bolsa”, após a qual as figuras são extraídas aleatoriamente uma após a outra até que a “bolsa” esteja vazia. Quando está vazio, as peças retornam a ele e o processo se repete. O Random Generator possui uma “bolsa” do tamanho 7 (7 bolsas), ou seja, uma “bolsa” preenchida com cada um dos 7 tetraminos. Outros tipos de "bolsas" são possíveis, por exemplo, uma bolsa de 14, na qual são colocadas duas peças de cada tipo de tetramino.
Devido à falta de histórico dos “sacos”, podem ocorrer inundações de 2 algarismos e “cobras” de 4 algarismos nos seus cruzamentos (

,

etc.) Isto é, de certa forma, este é um passo atrás em comparação ao
Tetris tradicional
para o NES .
As peças caem da bolsa de maneira estável, o que a torna mais previsível. É fácil entender em que parte da “bolsa” você está e quando a figura que você precisa pode aparecer. Devido à previsibilidade deste gerador de aleatoriedade, o jogo pode realmente ser
jogado sem parar . Em geral, esse é um sistema muito estúpido e não está claro como ele geralmente se tornou um randomizador 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(); } }
Dificuldade de quebra-cabeça: 3/5
Prevenção de inundações: 3/5
Prevenção de Secas: 4/5
Tetris: O Grão-Mestre 3 - Terror-Instinct (2005)
O TGM3 avançou bastante a ideia de gerar aleatoriedade. Este é um sistema único não encontrado em nenhuma outra versão.
Em vez de uma mala ou história, o TGM3 usa um conjunto de formas. Inicialmente, possui 5 figuras de cada tipo, ou seja, um total de 35 figuras. Quando uma figura é puxada, ela não é removida da piscina, mas é substituída pela figura com a maior seca (uma que não é removida há muito tempo). Gradualmente, a piscina é cada vez mais preenchida com esse número até finalmente ser retirada. Isso resolve os problemas dos sistemas “bolsa”, bem como sistemas com histórico; ela tira o melhor dos dois tipos de randomização.
Conjunto de 35 figuras com 6 arremessos
function* tgm3Randomizer() { let pieces = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']; let order = [];
Dificuldade de quebra-cabeça: 4/5
Prevenção de inundação: 4/5
Prevenção de Secas: 4/5
Conclusões
É difícil obter qualquer resultado definitivo. O randomizador TGM3 parece mais previsível e menos complexo para o jogador. O desajeitado saco de 7 parece antinatural, mas permite que você crie muitas estratégias de construção estáveis. Um randomizador hostil, como o Tetris for NES, pode arruinar o seu jogo ou, mais provavelmente, o seu humor.
Podemos melhorar esses sistemas fazendo com que pareçam mais aleatórios e colocando severas restrições a secas e inundações? Ou essas restrições severas estão apenas tornando o jogo mais previsível?