Determinar la posición de un elemento girado en Tetris

24

Tetris-Tiles se almacenan como una matriz booleana 4x4. Cada paso de rotación tiene su propia matriz, la representación del T -Block se vería así:

[
    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
]

Estoy tratando de encontrar una manera de calcular la posición del bloque cuando se gira y colisiona con el tablero (el tablero también es una matriz). El Tetris original simplemente no permitiría la rotación de un bloque cuando la rotación resultaría en una colisión. Las variantes modernas del juego resolverán la colisión y moverán el bloque a una posición válida.

Aquí hay algunas situaciones que deben resolverse. El tablero es 6x6, rojo = bloque activo, gris = bloques colocados / ocupados. Cada vez, se debe realizar una rotación en sentido antihorario. La superposición verde indica la matriz para el bloque. La flecha indica la corrección resultante para resolver la rotación:

rotación del bloque tetris

  1. El bloque está en el lado izquierdo del tablero. Como el bloque no puede abandonar el tablero, debe volver a moverse hacia adentro después de una rotación.
  2. El bloque golpea "suelo", pero aún no se ha colocado / comprometido. En este caso, el mosaico debe moverse hacia arriba para resolver la colisión (en caso de un "I" -Block, el movimiento sería de 2 celdas hacia arriba).
  3. El azulejo golpearía los bloques ocupados, debe moverse hacia la izquierda para resolver la colisión.
  4. El azulejo no se puede girar.

¿Cuál sería el mejor enfoque para abordar este problema? Óptimamente, la solución debe ser genérica, por ejemplo. trabaje con bloques de matriz 4x4 arbitrarios en un tablero poblado y de tamaño arbitrario.

bummzack
fuente
Interesante ... hice un tetris hace un año y simplemente giré la matriz y guardé el original. Si algo se superponía, usaba el original. Funcionó bien. Jugué con frecuencia y nunca tuve problemas. Debe haber tenido suerte. ¡Gracias por el tema que interviene!
snitch182

Respuestas:

16

La situación que describe se llama " patada en la pared ".

Una patada en la pared ocurre cuando un jugador gira una pieza cuando no hay espacio en las casillas donde ese tetromino ocuparía normalmente después de la rotación.

...

El algoritmo de patada de pared más simple ... es intentar mover el tetromino un espacio hacia la derecha, y luego un espacio hacia la izquierda, y fallar si no se puede hacer nada.

Existen varios sistemas de rotación Tetris, todos documentados en Wikia: Sistemas de rotación

SRS es la especificación "oficial" de Tetris, y tiene un algoritmo bastante complejo para patadas de pared que involucran tablas. ¡Es posible que la pieza final ni siquiera se superponga con la pieza original!

El sistema de rotación DTET extiende el algoritmo más simple al verificar otras cinco patadas de pared además de derecha e izquierda. Todas las piezas siguen las mismas reglas.

Leftium
fuente
+1, wiki interesante. Aunque el movimiento que un bloque de espacio a la izquierda oa la derecha no funcionará. Los sistemas de rotación más avanzados también parecen aplicar diferentes reglas para diferentes bloques. Me gustaría encontrar un método que funcione para todas las posibilidades de bloques (si no es demasiado costoso).
bummzack
1
@bummzack: Bueno, entonces usa la misma tabla para todos los bloques como el sistema DTET. Simplemente prueba más ubicaciones además de izquierda y derecha. Puede crear su propio sistema y verificar cuantas posiciones desee. Sin embargo, usar la misma tabla para todas las piezas podría permitir patadas de pared "antinaturales".
Leftium
Gracias por las ediciones. En realidad, estos son mucho mejores que el material en wikia. Muy apreciado.
bummzack