Tetris-Tiles хранятся в виде логической матрицы 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
]
Я пытаюсь найти способ рассчитать положение блока, когда он вращается и сталкивается с доской (доска также является матрицей). Оригинальный тетрис просто не позволил бы вращение блока, когда вращение привело бы к столкновению. Современные варианты игры позволят разрешить столкновение и переместить блок в правильное положение.
Вот несколько ситуаций, которые необходимо решить. Доска 6x6, красный = активный блок, серый = размещенные / занятые блоки. Каждый раз следует выполнять вращение против часовой стрелки. Зеленое наложение указывает матрицу для блока. Стрелка указывает результирующую коррекцию для разрешения поворота:
- Блок находится на левой стороне доски. Поскольку блок не может покинуть доску, он должен быть перемещен обратно после вращения.
- Блок поражает "землю", но еще не размещен / не зафиксирован. В этом случае плитка должна быть перемещена вверх, чтобы разрешить столкновение (в случае «I» -блока, движение будет на 2 ячейки вверх).
- Плитка попала бы в занятые блоки, ее нужно переместить влево, чтобы устранить столкновение.
- Плитка не может быть повернута.
Каков наилучший подход к решению этой проблемы? Оптимально, решение должно быть общим, например. работать с произвольными матричными блоками 4х4 на произвольной по размеру и заполненной доске.