Déterminer la position d'un élément tourné dans Tetris

24

Les Tetris-Tiles sont stockés sous forme de matrice booléenne 4x4. Chaque étape de rotation a sa propre matrice, la représentation du bloc T ressemblerait à ceci:

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

J'essaie de trouver un moyen de calculer la position du bloc lorsqu'il tourne et entre en collision avec la carte (la carte est également une matrice). Le Tetris d'origine ne permettrait tout simplement pas la rotation d'un bloc lorsque la rotation entraînerait une collision. Des variantes modernes du jeu résoudront la collision et déplaceront le bloc vers une position valide.

Voici quelques situations qui devraient être résolues. La carte est 6x6, rouge = bloc actif, gris = blocs placés / occupés. Chaque fois, une rotation dans le sens antihoraire doit être effectuée. La superposition verte indique la matrice du bloc. La flèche indique la correction résultante pour résoudre la rotation:

rotation du bloc tetris

  1. Le bloc est sur le côté gauche du plateau. Comme le bloc ne peut pas quitter la planche, il doit être replacé à l'intérieur après une rotation.
  2. Le bloc touche "au sol", mais n'est pas encore placé / engagé. Dans ce cas, la tuile doit être remontée pour résoudre la collision (dans le cas d'un bloc "I", le mouvement serait de 2 cases vers le haut).
  3. La tuile toucherait les blocs occupés, doit être déplacée vers la gauche pour résoudre la collision.
  4. La tuile ne peut pas être tournée.

Quelle serait la meilleure approche pour résoudre ce problème? De manière optimale, la solution doit être générique, par exemple. travailler avec des blocs de matrice 4x4 arbitraires sur une carte arbitrairement dimensionnée et peuplée.

bummzack
la source
Intéressant .. J'ai fait un tetris il y a un an et je viens de faire pivoter la matrice et de conserver l'original. Si quelque chose se chevauchait, j'utilisais l'original. A bien fonctionné. J'ai joué assez souvent et je n'ai jamais rencontré de problèmes. Ça devait être juste de la chance. Merci pour le sujet intéressant!
snitch182

Réponses:

16

La situation que vous décrivez s'appelle un « coup de pied mural ».

Un coup de pied de mur se produit lorsqu'un joueur fait tourner une pièce alors qu'il n'y a pas d'espace dans les cases où ce tétromino occuperait normalement après la rotation.

...

L'algorithme de coup de pied de mur le plus simple ... est d'essayer de déplacer le tétromino d'un espace vers la droite, puis d'un espace vers la gauche, et d'échouer si aucun des deux ne peut être fait.

Il existe différents systèmes de rotation Tetris, tous documentés sur Wikia: Rotation Systems

SRS est la spécification "officielle" de Tetris, et il a un algorithme assez complexe pour les coups de pied de mur impliquant des tables. La pièce finale peut même ne pas chevaucher la pièce d'origine du tout!

Le système de rotation DTET étend l'algorithme le plus simple en vérifiant cinq autres coups de pied en plus juste à droite et à gauche. Toutes les pièces suivent les mêmes règles.

Leftium
la source
+1, Wiki intéressant. Bien que le déplacement du bloc I vers la gauche ou la droite ne fonctionne pas. Les systèmes de rotation les plus avancés semblent également appliquer des règles différentes pour différents blocs. J'aimerais trouver une méthode qui fonctionnerait pour toutes les possibilités de blocs (si ce n'est trop coûteux).
bummzack
1
@bummzack: Eh bien, utilisez simplement la même table pour tous les blocs comme le système DTET. Il teste simplement plus d'emplacements en plus de gauche et de droite. Vous pouvez créer votre propre système et vérifier autant de postes que vous le souhaitez. Cependant, l'utilisation de la même table pour toutes les pièces peut permettre des coups de pied «contre nature».
Leftium
Merci pour les modifications. Ceux-ci sont en réalité bien meilleurs que le matériel sur Wikia. Très appréciée.
bummzack