Определить положение повернутого элемента в тетрисе

24

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, красный = активный блок, серый = размещенные / занятые блоки. Каждый раз следует выполнять вращение против часовой стрелки. Зеленое наложение указывает матрицу для блока. Стрелка указывает результирующую коррекцию для разрешения поворота:

вращение тетрис

  1. Блок находится на левой стороне доски. Поскольку блок не может покинуть доску, он должен быть перемещен обратно после вращения.
  2. Блок поражает "землю", но еще не размещен / не зафиксирован. В этом случае плитка должна быть перемещена вверх, чтобы разрешить столкновение (в случае «I» -блока, движение будет на 2 ячейки вверх).
  3. Плитка попала бы в занятые блоки, ее нужно переместить влево, чтобы устранить столкновение.
  4. Плитка не может быть повернута.

Каков наилучший подход к решению этой проблемы? Оптимально, решение должно быть общим, например. работать с произвольными матричными блоками 4х4 на произвольной по размеру и заполненной доске.

bummzack
источник
Интересно .. Я сделал тетрис год назад, и я просто повернул матрицу и сохранил оригинал. Если что-то перекрывалось, я использовал оригинал. Работал нормально. Я тестировал довольно часто и никогда не сталкивался с проблемами. Должно быть, просто повезло. Спасибо за интересующую тему!
snitch182

Ответы:

16

Ситуация, которую вы описываете, называется " ударом по стене ".

Удар в стену происходит, когда игрок поворачивает фигуру, когда в клетках нет места, где этот тетромино обычно занимал бы после вращения.

...

Самый простой алгоритм удара по стене ... это попытаться переместить тетромино на одну клетку вправо, а затем на одну клетку влево, и потерпеть неудачу, если ни одна из них не может быть выполнена.

Существуют различные системы ротации тетриса, все они описаны в Викия: системы ротации

SRS - это «официальная» спецификация Tetris, и она имеет довольно сложный алгоритм для настенных ударов с использованием таблиц. Последняя часть может даже не перекрывать оригинальную часть!

Система вращения DTET расширяет простейший алгоритм, проверяя пять других ударов стены, кроме правого и левого. Все произведения следуют одним и тем же правилам.

Leftium
источник
+1, интересная вики. Хотя перемещение блока I на одну позицию влево или вправо не сработает. Более продвинутые системы ротации, похоже, также применяют разные правила для разных блоков. Я хотел бы найти метод, который бы работал для всех возможностей блоков (если не слишком дорого).
bummzack
1
@bummzack: Хорошо, тогда просто используйте одну и ту же таблицу для всех блоков, таких как система DTET. Он просто проверяет больше мест, кроме левого и правого. Вы можете создать свою собственную систему и проверить сколько угодно позиций. Однако использование одной и той же таблицы для всех фигур может привести к «неестественным» ударам с стены.
Leftium
Спасибо за правки. Это на самом деле намного лучше, чем материал в Викия. Очень признателен.
bummzack