Визначте положення повернутого елемента в тетрісі


24

Tetris-плитки зберігаються як булева матриця 4x4. Кожен крок обертання має власну матрицю, представлення T -Block буде виглядати так:

[
    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. Блок потрапляє "земля", але ще не розміщена / здійснена. У цьому випадку плитку потрібно перемістити вгору, щоб вирішити зіткнення (у випадку блоку "Я" рух буде на 2 комірки вгору).
  3. Плитка потрапила б в окуповані блоки, її слід перемістити вліво, щоб вирішити зіткнення.
  4. Плитку не можна обертати.

Який найкращий підхід для вирішення цієї проблеми? Оптимально рішення має бути загальним, наприклад. робота з довільними блоками матриць 4x4 на дошці розміром із будь-яким розміром


Цікаво .. Я робив тетріс рік тому, і я просто обертав матрицю і зберігав оригінал. Якщо щось перекривалося, я використовував оргінал. Працював чудово. Я тестував досить часто і ніколи не стикався з проблемами. Мабуть, просто пощастило. Дякую за тему, що перебуває в інтерв'ю!
snitch182

Відповіді:


16

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

Удар в стіну відбувається, коли гравець обертає шматок, коли на площі, де тетроміно зазвичай займає після обертання, немає місця.

...

Найпростіший алгоритм удару на стіну ... - спробувати перемістити тетроміно на один простір праворуч, а потім на один пробіл вліво, і провалитися, якщо цього не можна зробити.

Існують різні системи обертання Tetris, всі вони документально підтверджені на Wikia: Rotation Systems

SRS - це "офіційна" специфікація Tetris, і вона має досить складний алгоритм для ударів стін за участю таблиць. Заключний твір може взагалі не перекривати оригінальний твір!

Система обертання DTET розширює найпростіший алгоритм, перевіряючи п’ять інших ударів стіни, окрім правого та лівого. Усі твори дотримуються однакових правил.


+1, цікавий вікі. Хоча переміщення I блокує один пробіл вліво або вправо, не вийде. Більш просунуті системи обертання також, здається, застосовують різні правила для різних блоків. Я хотів би знайти метод, який би працював для всіх можливостей блоку (якщо не надто дорого).
bummzack

1
@bummzack: Ну, тоді просто використовуйте ту саму таблицю для всіх блоків, як система DTET. Він просто випробовує ще декілька локацій, крім лівої та правої. Ви можете створити власну систему і перевірити, скільки потрібних позицій. Однак використання однієї таблиці в усіх частинах може призвести до «неприродних» ударів стіни.
Лефтій

Дякуємо за правки Це насправді набагато краще, ніж матеріал на wikia. Цінується.
bummzack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.