Determinar a posição de um elemento girado no Tetris

24

Os Tetris-Tiles são armazenados como uma matriz booleana 4x4. Cada etapa de rotação tem sua própria matriz, a representação do T- Block seria assim:

[
    0, 0, 0, 0,
    0, 1, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 0, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 1,
    0, 0, 0, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 0,
    0, 0, 1, 0,
    0, 0, 0, 0
]

Estou tentando encontrar uma maneira de calcular a posição do bloco quando ele está sendo girado e colide com a placa (a placa também é uma matriz). O Tetris original simplesmente não permitiria a rotação de um bloco quando a rotação resultaria em uma colisão. As variantes modernas do jogo resolverão a colisão e moverão o bloco para uma posição válida.

Aqui estão algumas situações que devem ser resolvidas. O cartão é 6x6, vermelho = bloco ativo, cinza = blocos colocados / ocupados. A cada vez, uma rotação no sentido anti-horário deve ser realizada. A sobreposição verde indica a matriz para o bloco. A seta indica a correção resultante para resolver a rotação:

rotação do bloco de tetris

  1. O bloco está no lado esquerdo do tabuleiro. Como o bloco não pode sair do tabuleiro, ele deve ser movido de volta para dentro após uma rotação.
  2. O bloco atinge o "solo", mas ainda não foi colocado / confirmado. Nesse caso, o bloco deve ser movido para cima para resolver a colisão (no caso de um bloco "I", o movimento seria 2 células acima).
  3. O bloco atingirá os blocos ocupados, deve ser movido para a esquerda para resolver a colisão.
  4. O bloco não pode ser girado.

Qual seria a melhor abordagem para resolver este problema? Idealmente, a solução deve ser genérica, por exemplo. trabalhe com blocos de matriz 4x4 arbitrários em uma placa de tamanho e população arbitrariamente.

bummzack
fonte
Interessante .. Eu fiz um tetris há um ano e eu apenas girei a matriz e guardei o original. Se algo se sobrepus, usei o original. Funcionou bem. Eu testei com bastante frequência e nunca tive problemas. Deve ter tido apenas sorte. Obrigado pelo tópico interistente!
snitch182

Respostas:

16

A situação que você descreve é ​​chamada de " chute na parede ".

Um chute na parede acontece quando um jogador gira uma peça quando não existe espaço nos quadrados onde esse tetromino normalmente ocuparia após a rotação.

...

O algoritmo mais simples de chute na parede ... é tentar mover o tetromino um espaço para a direita e depois um espaço para a esquerda, e falhar se nada puder ser feito.

Existem vários sistemas de rotação Tetris, todos documentados na Wikia: Sistemas de Rotação

SRS é a especificação "oficial" do Tetris e possui um algoritmo bastante complexo para chutes de parede envolvendo tabelas. A peça final pode nem se sobrepor à peça original!

O sistema de rotação DTET estende o algoritmo mais simples, verificando outros cinco chutes na parede, além da direita e da esquerda. Todas as peças seguem as mesmas regras.

Leftium
fonte
+1, wiki interessante. Embora movendo o I bloco um espaço à esquerda ou à direita não vai funcionar. Os sistemas de rotação mais avançados também parecem aplicar regras diferentes para blocos diferentes. Gostaria de encontrar um método que funcionasse para todas as possibilidades de blocos (se não for muito caro).
bummzack
11
@ albummzack: Bem, basta usar a mesma tabela para todos os blocos como o sistema DTET. Simplesmente testa mais locais além da esquerda e da direita. Você pode criar seu próprio sistema e verificar quantas posições desejar. No entanto, o uso da mesma tabela para todas as peças pode permitir chutes na parede "não naturais".
Leftium
Obrigado pelas edições. Estes são realmente muito melhores do que o material na wikia. Muito apreciado.
bummzack