Tentukan posisi elemen yang diputar dalam Tetris

24

Tetris-Tiles disimpan sebagai matriks boolean 4x4. Setiap langkah rotasi memiliki matriks sendiri, representasi T -Block akan terlihat seperti ini:

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

Saya mencoba mencari cara untuk menghitung posisi blok ketika sedang diputar dan bertabrakan dengan papan (papan juga merupakan matriks). Tetris asli tidak akan memungkinkan rotasi blok ketika rotasi akan menghasilkan benturan. Varian modern dari gim ini akan menyelesaikan tabrakan dan memindahkan blok ke posisi yang valid.

Inilah beberapa situasi yang harus diselesaikan. Papan adalah 6x6, merah = blok aktif, abu-abu = blok ditempatkan / ditempati. Setiap kali, rotasi berlawanan arah jarum jam harus dilakukan. Overlay hijau menunjukkan matriks untuk blok. Panah menunjukkan koreksi yang dihasilkan untuk menyelesaikan rotasi:

rotasi blok tetris

  1. Blok ada di sisi kiri papan. Karena blok tidak dapat meninggalkan papan, itu harus dipindahkan kembali ke dalam setelah rotasi.
  2. Blokir hit "ground", tetapi belum ditempatkan / dilakukan. Dalam hal ini, ubin harus dipindahkan ke atas untuk menyelesaikan tabrakan (dalam kasus "I" -Blok, gerakan akan menjadi 2 sel ke atas).
  3. Ubin akan mengenai blok yang ditempati, harus dipindahkan ke kiri untuk menyelesaikan tabrakan.
  4. Ubin tidak dapat diputar.

Apa yang akan menjadi pendekatan terbaik untuk mengatasi masalah ini? Secara optimal, solusinya harus generik, mis. bekerja dengan blok matriks 4x4 sewenang-wenang pada papan ukuran dan penduduk sewenang-wenang.

bummzack
sumber
Menarik .. Saya melakukan tetris setahun yang lalu dan saya hanya memutar matriks dan menyimpan yang asli. Jika sesuatu tumpang tindih saya menggunakan aslinya. Bekerja dengan baik. Saya bermain cukup sering dan tidak pernah mengalami masalah. Pasti beruntung. Terima kasih untuk topik yang menarik!
snitch182

Jawaban:

16

Situasi yang Anda gambarkan disebut " tendangan dinding ".

Tendangan dinding terjadi ketika pemain memutar sepotong ketika tidak ada ruang di kotak di mana tetromino biasanya akan menempati setelah rotasi.

...

Algoritma tendangan dinding yang paling sederhana ... adalah mencoba memindahkan tetromino satu ruang ke kanan, lalu satu ruang ke kiri, dan gagal jika tidak ada yang bisa dilakukan.

Ada berbagai sistem rotasi Tetris, semua didokumentasikan di Wikia: Sistem Rotasi

SRS adalah spesifikasi Tetris "resmi", dan memiliki algoritma yang cukup kompleks untuk tendangan dinding yang melibatkan tabel. Potongan terakhir bahkan mungkin tidak tumpang tindih dengan aslinya!

Sistem rotasi DTET memperluas algoritma paling sederhana dengan memeriksa lima tendangan dinding lain di samping kanan dan kiri. Semua bagian mengikuti aturan yang sama.

Leftium
sumber
+1, wiki yang menarik. Meskipun memindahkan I memblokir satu ruang kiri atau kanan tidak akan berfungsi. Sistem rotasi yang lebih maju juga tampaknya menerapkan aturan yang berbeda untuk blok yang berbeda .. Saya ingin menemukan metode yang akan bekerja untuk semua kemungkinan blok (jika tidak terlalu mahal).
bummzack
1
@bummzack: Baiklah, gunakan saja tabel yang sama untuk semua blok seperti sistem DTET. Ini hanya menguji lebih banyak lokasi selain kiri dan kanan. Anda dapat membuat sistem Anda sendiri dan memeriksa banyak posisi yang Anda inginkan. Namun, menggunakan tabel yang sama untuk semua bagian mungkin memungkinkan tendangan dinding "tidak alami".
Leftium
Terima kasih atas hasil editnya. Ini sebenarnya jauh lebih baik daripada materi di wikia. Sangat dihargai.
bummzack