테트리스-타일은 4x4 부울 매트릭스로 저장됩니다. 각 회전 단계에는 자체 행렬이 있으며 T 블록 의 표현 은 다음과 같습니다.
[
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
]
블록이 회전하고 보드와 충돌 할 때 블록의 위치를 계산하는 방법을 찾으려고합니다 (보드도 매트릭스입니다). 원래 Tetris는 회전으로 인해 충돌이 발생할 때 블록 회전을 허용하지 않습니다. 최신 게임 변형은 충돌을 해결하고 블록을 유효한 위치로 옮깁니다.
해결해야 할 상황은 다음과 같습니다. 보드는 6x6, 빨간색 = 활성 블록, 회색 = 배치 / 사용 된 블록입니다. 매번 시계 반대 방향으로 회전해야합니다. 녹색 오버레이는 블록의 매트릭스를 나타냅니다. 화살표는 회전을 해결하기위한 수정 결과를 나타냅니다.
- 블록은 보드의 왼쪽에 있습니다. 블록은 보드를 떠날 수 없으므로 회전 후에 다시 안쪽으로 이동해야합니다.
- 블록이 "그라운드"에 도달했지만 아직 배치 / 커밋되지 않았습니다. 이 경우 충돌을 해결하기 위해 타일을 위로 이동해야합니다 ( "I"블록의 경우 이동은 2 셀이됩니다).
- 타일은 점유 된 블록에 부딪 치므로 충돌을 해결하려면 왼쪽으로 이동해야합니다.
- 타일을 회전시킬 수 없습니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 최적의 솔루션은 예를 들어 일반적인 것이어야합니다. 임의로 크기가 조정되고 채워진 보드에서 임의의 4x4 매트릭스 블록으로 작업합니다.