Tetris'te döndürülmüş bir elemanın pozisyonunu belirleme


24

Tetris-Tiles, 4x4 boolean matris olarak saklanır. Her dönme adımının kendine ait bir matrisi vardır, T -Block gösterimi şöyle görünür:

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

Döndüğünde bloğun konumunu hesaplamak için bir yol bulmaya çalışıyorum ve tahta ile çarpıştı (tahta aynı zamanda bir matristir). Orijinal Tetris, rotasyon bir çarpışma ile sonuçlandığında basitçe bloğun rotasyonuna izin vermez. Oyunun modern çeşitleri çarpışmayı çözecek ve bloğu geçerli bir konuma getirecektir.

İşte çözülmesi gereken bazı durumlar. Tahta 6x6, kırmızı = aktif blok, gri = yerleştirilmiş / dolu bloklardır. Her seferinde saatin tersi yönde bir dönüş yapılmalıdır. Yeşil kaplama, blok matrisini gösterir. Ok, rotasyonu çözmek için ortaya çıkan düzeltmeyi gösterir:

tetris bloğu döndürme

  1. Blok tahtanın sol tarafındadır. Blok tahtayı terk edemediğinden, bir döndürme işleminden sonra tekrar içeri taşınmalıdır.
  2. Blok, "yere" çarptı, ancak henüz yerleştirilmedi / işlenmedi. Bu durumda, kiremit çarpışmayı gidermek için yukarı hareket ettirilmelidir ("I" -Blok durumunda, hareket 2 hücreli olur).
  3. Döşeme işgal edilmiş bloklara çarpacaktı, çarpışmayı çözmek için sola taşınmalı.
  4. Döşeme döndürülemez.

Bu sorunun üstesinden gelmek için en iyi yaklaşım ne olurdu? Optimal olarak, çözelti jenerik olmalıdır, örn. isteğe bağlı olarak boyutlandırılmış ve yerleştirilmiş bir tahtanın üzerindeki keyfi 4x4 matris bloklarıyla çalışın.


İlginç .. Bir yıl önce bir tetris yaptım ve sadece matrisi döndürdüm ve orijinali tuttum. Bir şey üst üste binerse orjinal kullandım. İyi çalıştı. Sık sık test ettim ve hiçbir zaman sorun yaşamadım. Şanslı olmalı. Yardımcı konu için teşekkürler!
snitch182 14:14

Yanıtlar:


16

Tarif ettiğiniz duruma " duvar vuruşu " denir .

Bir oyuncu, bir parçayı döndürdüğünde, tetromino normalde rotasyondan sonra işgal edeceği karelerde yer kalmadığında bir duvar vuruşu gerçekleşir.

...

En basit duvar tekme algoritması ... tetrominoyu bir boşluk sağa, sonra bir boşluk sola kaydırmayı denemek ve eğer ikisi de yapılamazsa başarısız olur.

Tüm Wikia: Rotation Systems belgesinde belgelenen çeşitli Tetris rotasyon sistemleri vardır.

SRS "resmi" Tetris teknik özelliğidir ve tablo içeren duvar hareketleri için oldukça karmaşık bir algoritmaya sahiptir . Son parça bile orijinal parça ile örtüşmeyebilir!

DTET rotasyon sistemi dışında sadece sağ ve sol diğer beş duvar tekmeler kontrol ederek en basit algoritma uzanır. Tüm parçalar aynı kuralları izler.


+1, İlginç wiki. Hareketli rağmen ben bloğunu bir boşluk sola veya sağa çalışma olmaz. Daha gelişmiş rotasyon sistemleri de farklı bloklar için farklı kurallar uygulamaktadır. Tüm blok olasılıkları için işe yarayacak bir yöntem bulmak istiyorum (çok maliyetli değilse).
Bummzack

1
@bummzack: O zaman DTET sistemi gibi tüm bloklar için aynı tabloyu kullanın. Sadece sol ve sağ dışında daha fazla yeri test eder. Kendi sisteminizi oluşturabilir ve istediğiniz birçok konumu kontrol edebilirsiniz. Bununla birlikte, aynı masayı tüm parçalar için kullanmak "doğal olmayan" duvar vurmalarına izin verebilir.
Leftium

Düzenlemeler için teşekkürler. Bunlar aslında wikia'daki materyallerden çok daha iyi. Çok takdir.
serseri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.