2009-03-14 13 views
17

Je suis en train de programmer un clone Tetris et dans mon jeu, je stocke mes blocs tétromino sous forme de tableaux 4x4 de blocs. Je dois maintenant pouvoir faire pivoter les positions entières dans les tableaux de sorte que j'obtienne un bloc de tetris tourné. Je ne peux pas simplement faire pivoter la texture car toute ma détection de collision, etc. a été conçue pour fonctionner avec le tableau 2D. Le jeu est écrit en C# en utilisant XNA.Comment faire pivoter un tableau 2D d'entiers

Comment puis-je faire pivoter mon tableau 2D de Ints de 90 degrés dans le sens horaire/anti-horaire.

Voici comment mon bloc 'L' est stocké comme exemple.

0 1 0 0 
0 1 0 0 
0 1 1 0 
0 0 0 0 

Merci pour votre aide.

+0

C# et C++? –

Répondre

29

S'il s'agit d'un tableau 2D, vous pouvez implémenter la rotation en copiant avec différents ordres d'accès au tableau.

dire, pour une rotation dans le sens horaire, essayez:

int [,] newArray = new int[4,4]; 

for (int i=3;i>=0;--i) 
{ 
    for (int j=0;j<4;++j) 
    { 
     newArray[j,3-i] = array[i,j]; 
    } 
} 

sens anti-horaire est similaire.

+0

Bonne solution, mais exagérée étant donné le domaine du problème. –

+0

tester ce code maintenant ... –

+0

Je vote en ce sens, il devrait être marqué comme la solution. Je ne sais pas ce que vous voulez dire rde6173, à moins que vous ne vous soyez également porté garant de stocker 4 tableaux d'orientation. – Ricket

4

Si vous souhaitez faire pivoter un 4 x 4 bloc, vous venez de déplacer les positions:

A B C A 
C D D B 
B D D C 
A C B A 

Chaque A passe à l'autre A, et même pour B, C et D.

/-----\ 
    |  | 
    |  V 
    A B C A 
/->C D>D B--\ 
| B D D C | 
| A C B A | 
| |^ | 
| | | | 
\----/ \----/  
+0

Je pense que votre photo est un peu éteinte, Je ne sais pas exactement ce que vous essayez de clarifier et les flèches semblent pointer b -> c et a -> c plutôt que de soutenir vos instructions. fmsf, grandir. – Ricket

+0

@Ricket merci, l'a corrigé. –

6

Dans le tetris classique, il y a très peu de permutations d'objets. Je voudrais simplement avoir un tableau constant pour chaque "tetromino", à chacune des 4 positions, et une logique simple pour choisir celui qui convient en fonction de l'entrée. Pourquoi les cycles du CPU gaspillent-ils en essayant de le faire pivoter?

+0

Le calcul est si simple dans ce cas, il est probablement aussi rapide de le faire pivoter que de faire la recherche de permutation basée sur le style de bloc + la position actuelle. –

+0

C'est ridicule. –

+0

J'ajouterai aussi que du point de vue du gameplay et de la conception, il serait peut-être préférable d'avoir des rotations prédéfinies. Que faites-vous quand vous obtenez la longue pièce 4x1? Si vous le faites pivoter deux fois, devrait-il vraiment y avoir un espace complet sur le côté (ce qui serait le cas si vous utilisiez des mathématiques pures)? –

11

Ne pas faire pivoter les pièces avec du code. Il suffit de stocker un tableau des différentes orientations des pièces et de les parcourir lorsque la pièce est tournée. Il n'est pas nécessaire de les faire pivoter dynamiquement dans un jeu Tetris. Comme le domaine du problème est Tetris, vous constaterez qu'un algorithme de rotation provoque des effets indésirables, tels que le long Tetronimo mince n'alternant pas entre deux positions (comme il le fait dans le réel).

+0

-1; Il n'y a aucun avantage à stocker 4 orientations de chaque pièce plutôt que de simplement tourner. Vous devriez être concentré sur répondre à sa question, ne pas le décourager, à moins qu'il fasse une erreur critique; ce qu'il n'est certainement pas. – Ricket

+0

Il me faudrait beaucoup moins de temps pour écrire un double pour boucle comme cela a été suggéré plus haut. –

+4

Ricket, facile sur le ton là-bas. J'ai mis à jour ma réponse pour indiquer pourquoi la rotation est une mauvaise idée dans ce cas. – Jon

1

Je stockerais (x, y) les coordonnées des "cellules" et utiliserais la matrice de rotation pour les faire tourner. Voir Drawing a Rotated Rectangle par exemple. Vous devrez probablement arrondir le résultat au plus proche de 0,5 incrément. Code

0

js pour les deux sens et dans le sens antihoraire:

function arrRotation90(arr, clockwise) { 
      var arr_rotated = []; 
      for (var i = 0; i < arr[0].length; i++) { 
       arr_rotated[i] = []; 
      } 
      if (clockwise) { 
       for (var i = 0; i < arr.length; i++) { 
        for (var j = 0; j < arr[i].length; j++) { 
         arr_rotated[arr[i].length-1-j][i] = arr[i][j]; 
        } 
       } 
      } else { 
       for (var i = 0; i < arr.length; i++) { 
        for (var j = 0; j < arr[i].length; j++) { 
         arr_rotated[j][arr.length - 1 - i] = arr[i][j]; 
        } 
       } 
      } 
      return arr_rotated; 
     } 
Questions connexes