Bestimmen Sie die Position eines gedrehten Elements in Tetris

24

Tetris-Tiles werden als 4x4-Boolesche Matrix gespeichert. Jeder Rotationsschritt hat eine eigene Matrix, die Darstellung des T- Blocks würde so aussehen:

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

Ich versuche einen Weg zu finden, um die Position des Blocks zu berechnen, wenn er gedreht wird und mit dem Board kollidiert (das Board ist auch eine Matrix). Das ursprüngliche Tetris würde einfach keine Drehung eines Blocks zulassen, wenn die Drehung zu einer Kollision führen würde. Moderne Spielvarianten lösen die Kollision auf und bringen den Block an eine gültige Position.

Hier sind einige Situationen, die gelöst werden sollten. Die Karte ist 6x6, rot = aktiver Block, grau = platzierte / belegte Blöcke. Jedes Mal sollte eine Drehung gegen den Uhrzeigersinn durchgeführt werden. Das grüne Overlay zeigt die Matrix für den Block an. Der Pfeil zeigt die resultierende Korrektur an, um die Drehung aufzulösen:

Tetris Block Rotation

  1. Der Block befindet sich auf der linken Seite der Tafel. Da der Block die Platine nicht verlassen kann, sollte er nach einer Drehung wieder nach innen bewegt werden.
  2. Block trifft "Boden", ist aber noch nicht platziert / festgeschrieben. In diesem Fall muss das Plättchen nach oben verschoben werden, um die Kollision zu beheben (im Fall eines "I" -Blocks beträgt die Bewegung 2 Zellen nach oben).
  3. Die Kachel würde belegte Blöcke treffen und muss nach links verschoben werden, um die Kollision zu beheben.
  4. Fliesen können nicht gedreht werden.

Was wäre der beste Ansatz, um dieses Problem anzugehen? Optimalerweise sollte die Lösung generisch sein, z. Arbeiten Sie mit beliebigen 4x4-Matrixblöcken auf einer beliebig großen und bestückten Karte.

Blödmann
quelle
Interessant .. Ich habe vor einem Jahr einen Tetris gemacht und die Matrix einfach gedreht und das Original beibehalten. Wenn sich etwas überschneidet, habe ich das Original verwendet. Hat gut funktioniert. Ich habe ziemlich oft getestet und bin nie auf Probleme gestoßen. Muss einfach Glück gehabt haben. Danke für das interessante Thema!
snitch182

Antworten:

16

Die Situation, die Sie beschreiben, wird als " Mauertritt " bezeichnet.

Ein Wandstoß tritt ein, wenn ein Spieler eine Figur dreht, wenn auf den Feldern, auf denen dieser Tetromino normalerweise nach der Drehung stehen würde, kein Platz mehr vorhanden ist.

...

Der einfachste Wall-Kick-Algorithmus ... besteht darin, das Tetromino um ein Feld nach rechts und dann um ein Feld nach links zu verschieben.

Es gibt verschiedene Tetris-Rotationssysteme, die alle in Wikia: Rotationssysteme dokumentiert sind

SRS ist die "offizielle" Tetris-Spezifikation und verfügt über einen recht komplexen Algorithmus für Wandtritte mit Tabellen. Das letzte Stück darf das Originalstück überhaupt nicht überlappen!

Das DTET-Rotationssystem erweitert den einfachsten Algorithmus, indem neben rechts und links fünf weitere Wandtritte überprüft werden. Alle Stücke folgen den gleichen Regeln.

Leftium
quelle
+1, Interessantes Wiki. Obwohl das Bewegen des I- Blocks um ein Leerzeichen nach links oder rechts nicht funktioniert. Die fortgeschritteneren Rotationssysteme scheinen auch unterschiedliche Regeln für unterschiedliche Blöcke anzuwenden. Ich würde gerne eine Methode finden, die für alle Blockmöglichkeiten funktioniert (wenn nicht zu teuer).
Mistzack
1
@bummzack: Nun, dann benutze einfach die gleiche Tabelle für alle Blöcke wie das DTET-System. Es werden einfach mehr Stellen als links und rechts geprüft. Sie können Ihr eigenes System erstellen und beliebig viele Positionen prüfen. Die Verwendung des gleichen Tisches für alle Teile kann jedoch zu "unnatürlichen" Wandtritten führen.
Leftium
Danke für die Änderungen. Diese sind eigentlich viel besser als das Material auf Wikia. Sehr geschätzt.
Mistzack