10

私はテトリスを構築していて、ピースを回転させる方法を考えようとしています。

それらは単一のブロックで回転していますか? それとも、モーフィングする必要がありますか...別名スワップポジションですか?

ここに画像の説明を入力

私が考えている方法は、一種のハードコードです...(疑似コード)のように:

if (rotateRight()) {

    if (Piece == "T") {
        if (Piece.getCurrRotation() == down (aka.. 180 degrees))
          move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot's of hardcoding
     }
    if (Piece == "L") { etc...

     }
}
if (rotateLeft()) {
     perform same checks for the Left...
}

しかし、これを理解するだけでも膨大な量のコードになるようです

最初に) 現在のピースがどの回転にあるか (各ピースには 4 つの可能な回転があります)

第二に)そこから...そのピースに基づいて新しいハードコードされた座標に設定します

ピースごとにそれをしなければならない... それは間違った考え方のように思えます。

他の考えはありますか?

4

6 に答える 6

1

2 つのオプションがあります (形状の保存方法によって異なります)。

  • 形状ブロックを再配置して、回転ランタイムを実行します (形状ポイントをマトリックスに保持し、中心を中心に回転します)。
  • シェイプの 4 つのフェーズ (または回転不変シェイプの場合は 2 つまたは 1 つ) を格納し、シェイプが存在するフェーズのみを増減します。

最初のバージョンでは、実行時間を計算したり、形状の中心を見つけたりする必要があります。

2 番目のバージョンでは、事前計算を行い、形状をハードコーディングする必要があります。

固定数のピースと固定数のフェーズがあるため、2番目のアプローチの方が優れていると思います。しかし、それはあなた次第です。

于 2013-04-03T14:45:39.293 に答える
1

ピースをマトリックスとして保存している場合は、一般的な関数を使用してマトリックスを回転できます。[[1, 1, 1], [0, 0, 0], [0, 0, 0]] を左に 90 度回転させたいとします -> [[1,0,0], [1,0 ,0]、[1,0,0]]。それは役に立ちますか?

于 2013-04-03T14:36:39.380 に答える
1

おそらく、PieceType オブジェクトごとに 1 ~ 4 個の Orientation オブジェクトが必要です。各 Orientation は、実際のブロックの位置を定義します (いくつかのピボットを基準にして)。例えば

PieceType "L":

    Orientation 1:
    #
    #
    ##

    Orientation 2:
    ###
    #

    Orientation 3:
    ##
     #
     #

    Orientation 4:
      #
    ###

PieceType "I":

    Orientation 1:
    #
    #
    #
    #

    Orientation 2:
    ####

各 PieceType は、考えられる「方向の変更」(つまり、回転) ごとに必要なスペースに関する情報も保持できます。これはすべて静的な情報なので、ゲーム中にブロックを移動する必要はまったくありません。ピースの方向を変更するだけで、方向オブジェクトがブロックの位置を教えてくれます。

于 2013-04-03T14:56:56.257 に答える
1

そのサンプル コードは、作成中の悪夢のように見えます。

これを行うもう1つの方法は非常に簡単で、ボードを一定数のセルとして扱い、各「回転」を各ピースの位置をどれだけシフトする必要があるかを計算する方法として扱い、再配置するだけですピースはいわば自分で描くので、ピースの観点からは、「OK、あなたは今 A5 にいます」と言われるだけです。

最初の例を見ると、新しい位置は単に中心からの現在のオフセットと目的の回転方向の関数です。

このアプローチの最も良い点は、おぞましい case ステートメントを大量に実行したり、完全に持続不可能な神オブジェクト コードを作成したりしないことです。

于 2013-04-03T18:56:31.503 に答える
0

私見、最も簡単な方法は、ブロックを回転または変換するのではなく、ブロックの形状をそれぞれの状態 (通常、rotated_90_degrees、rotated_180_degrees、rotated_270_degrees) で覚えておくことです。

于 2013-04-03T14:37:17.760 に答える