2009-03-14 59 views
17

私はテトリスクローンをプログラミングしています。私のゲームでは、テロミノブロックを4x4ブロックのブロックとして保存しています。私は今、回転したテトリスブロックを得るために、配列内の整数位置を回転できる必要があります。すべての衝突検出などが2D配列で動作するように設計されているため、単にテクスチャを回転させることはできません。ゲームはXNAを使ってC#で書かれています。2次元配列を回転させる方法

私の2D配列の配列を時計回り/反時計回りに90度回転させる方法はありますか?

例として、私の 'L'ブロックがどのように格納されているかを示します。

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

ありがとうございました。

+0

C#およびC++の両方? –

答えて

29

2D配列の場合は、異なる配列アクセスオーダーでコピーすることでローテーションを実装できます。

即ち、時計回りの回転のために、試してください:

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]; 
    } 
} 

反時計回りも同様です。

+0

良い解決策ですが、問題ドメインを過大に与えました。 –

+0

このコードを今すぐテストしてください... –

+0

私はこれを投票しています。解決策としてマークする必要があります。あなたが4方向配列を保管することを保証していない限り、あなたがrde6173を意味するかどうかは分かりません。 – Ricket

4

あなたは4×4ブロックを回転させたい場合は、あなただけの位置を移動:

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

各AはB、C、Dの

/-----\ 
    |  | 
    |  V 
    A B C A 
/->C D>D B--\ 
| B D D C | 
| A C B A | 
| |^ | 
| | | | 
\----/ \----/  
については、次のAに移動し、同じ
+0

私はあなたの写真は少しオフだと思う、それを明確にしようとしていることを正確には確信しておらず、矢印はあなたの指示を支持するのではなく、b→cとa→cを指しているようです。 fmsf、grow up。 – Ricket

+0

@Ricketありがとう、それを修正しました。 –

6

古典的なテトリスでは、オブジェクトの順列はほとんどありません。私は単純に、4つのポジションのそれぞれで「テトミノ」のそれぞれに対して一定の配列を持ち、入力に基づいて適切なものを選択する単純なロジックを持っています。

なぜCPUを循環させようとしているのですか?

+0

この場合、数学はとてもシンプルですが、現在のブロックスタイル+位置に基づいて順列検索を行うのと同じくらい速く回転させるのと同じでしょう。 –

+0

それはばかげている。 –

+0

また、ゲームプレイやデザインの視点から、回転をあらかじめ設定しておく方が良いかもしれません。長い4x1作品を手に入れたらどうしますか?それを2回回転させると、それは実際には(純粋な数学を使用する場合には)1つの余分なスペースになりますか? –

11

コードでコードを回転させないでください。異なるピースの向きの配列を保存し、ピースを回転させたときにピッキングします。テトリスゲームで動的に回転させる必要はありません。

問題のドメインはテトリスなので、回転アルゴリズムは、長い薄いテトロニモが2つの位置の間で交互に現われないなどの望ましくない効果を引き起こすことがわかります(実際の場合と同じです)。

+0

-1;単に回転させるのではなく、各ピースの4つの向きを格納する利点はありません。批判的な間違いをしない限り、彼の質問に答えることに集中して、彼を落胆させないようにする必要があります。彼は確かにそうではありません。 – Ricket

+0

上記のようにdouble forループを書くのにかかる時間はずっと短くなります。 –

+4

リケット、楽な音があります。この場合、ローテーションが悪い理由である理由を示すために私の答えを更新しました。 – Jon

1

"セル"の(x、y)座標を格納し、回転行列を使用して回転させます。 たとえば、Drawing a Rotated Rectangleを参照してください。おそらく、最も近い0.5増分に結果を丸める必要があります。時計回りと反時計回りの両方について

0

JSコード:

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; 
     }