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:
- 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.
- 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).
- El azulejo golpearía los bloques ocupados, debe moverse hacia la izquierda para resolver la colisión.
- 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.