Określ pozycję obracanego elementu w Tetris

24

Płytki Tetris są przechowywane jako macierz boolowska 4x4. Każdy krok obrotu ma własną matrycę, reprezentacja bloku T- Block wyglądałaby następująco:

[
    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
]

Próbuję znaleźć sposób, aby obliczyć pozycję bloku, gdy jest on obracany i zderza się z płytką (tablica jest również matrycą). Pierwotny Tetris po prostu nie pozwalałby na obrót bloku, gdy obrót spowodowałby kolizję. Nowoczesne warianty gry rozstrzygną kolizję i przestawią blok na prawidłową pozycję.

Oto kilka sytuacji, które należy rozwiązać. Plansza ma wymiary 6 x 6, czerwony = aktywny blok, szary = umieszczone / zajęte bloki. Za każdym razem należy wykonać obrót w lewo. Zielona nakładka wskazuje macierz dla bloku. Strzałka wskazuje wynikową korektę rozwiązującą obrót:

obrót bloku tetris

  1. Blok znajduje się po lewej stronie planszy. Ponieważ blok nie może opuścić planszy, po obrocie należy go przenieść z powrotem do środka.
  2. Zablokuj trafienia „na ziemi”, ale nie zostało jeszcze umieszczone / popełnione. W takim przypadku kafelek musi zostać przesunięty w górę, aby rozwiązać kolizję (w przypadku blokady „I” ruch byłby o 2 komórki w górę).
  3. Płytka uderzy w zajmowane bloki, musi zostać przesunięta w lewo, aby rozwiązać kolizję.
  4. Płytki nie można obracać.

Jakie byłoby najlepsze podejście do rozwiązania tego problemu? Optymalnie rozwiązanie powinno być ogólne, np. pracować z dowolnymi blokami macierzy 4x4 na dowolnej wielkości i wypełnionej płycie.

grzmot
źródło
Ciekawe .. Zrobiłem tetris rok temu i właśnie obróciłem matrycę i zachowałem oryginał. Jeśli coś się pokrywało, użyłem oryginału. Działał dobrze Grałem dość często i nigdy nie miałem problemów. Musiał mieć szczęście. Dzięki za ciekawy temat!
snitch182,

Odpowiedzi:

16

Opisana sytuacja nazywa się „ kopnięciem w ścianę ”.

Kopnięcie w ścianę ma miejsce, gdy gracz obraca pion, gdy nie ma miejsca na polach, na których tetromino normalnie zajmowałoby po rotacji.

...

Najprostszym algorytmem kopnięcia w ścianę ... jest próba przesunięcia tetromina o jedno pole w prawo, a następnie o jedno miejsce w lewo i nie powiedzie się, jeśli nie da się tego zrobić.

Istnieje wiele systemów rotacji Tetris, wszystkie udokumentowane na Wikia: Rotation Systems

SRS jest „oficjalną” specyfikacją Tetris i ma dość skomplikowany algorytm do kopnięć w ścianę z wykorzystaniem tabel. Ostatni kawałek może w ogóle nie pokrywać się z oryginalnym!

System rotacji DTET rozszerza najprostszy algorytm, sprawdzając pięć innych kopnięć w ścianę oprócz prawej i lewej. Wszystkie elementy podlegają tym samym zasadom.

Leftium
źródło
+1, ciekawe wiki. Chociaż przesuwanie I bloku o jedno miejsce w lewo lub w prawo nie będzie działać. Bardziej zaawansowane systemy rotacji również wydają się stosować różne reguły dla różnych bloków. Chciałbym znaleźć metodę, która działałaby dla wszystkich możliwości bloków (jeśli nie zbyt kosztowna).
bummzack
1
@bummzack: Cóż, po prostu użyj tej samej tabeli dla wszystkich bloków, takich jak system DTET. Po prostu testuje więcej lokalizacji oprócz lewej i prawej. Możesz stworzyć własny system i sprawdzić, ile pozycji chcesz. Jednak użycie tej samej tabeli dla wszystkich elementów może pozwolić na „nienaturalne” kopnięcia w ścianę.
Leftium
Dzięki za zmiany. Są one w rzeczywistości znacznie lepsze niż materiały na wiki. Bardzo mile widziane.
bummzack