テトリミノを移動させます。左右の矢印キーをおすと左右に移動するようになります。

移動するときは本当に移動できるのかを調べる必要があります。移動したらフィールドの外にはみ出してしまう場合や他のテトリミノの存在する場所に移動することはできません。

落下中のテトリミノを構成するブロックがどの位置にあるかはフィールド変数のMovingTetorosに保存されています。そこでLINQのSelectメソッドをつかって移動後の位置を取得して、これとFixedTetoroとの積集合を調べてそのような要素があるかを調べることにします。

まず左に移動する場合。MovingTetorosのX座標の最小値をしらべて0があれば、これ以上左に移動させることはできないことがわかります。

移動後にMovingTetorosに格納されるデータはLINQのSelectメソッドを使えば取得できます。これをいったんnewPosという変数に格納します。newPosとFixedTetoroの積集合の要素数が0でない場合はそこには移動できません。

問題なく移動できるのであれば移動させます。まずMovingTetorosに格納されていたデータをもとに現在表示されているテトリミノをいったん消去します。この処理をするのが自作メソッド ClearOldTetoroです。

落下中のテトリミノを消去したら、newPosの情報をもとに新しい位置にテトリミノを描画します。そしてMovingTetorosの内容をnewPosの内容にいれかえます。

移動できない場合はなにもしないで returnします。

同様にして右に移動させるメソッドと下に移動させるメソッドを作成します。

テトリミノを回転させる

スペースキーがおされたらテトリミノを時計方向に回転させます。回転させるためには

ブロックの元の座標と新しい座標の関係は以下のようになります。

しかしこれはテトリミノの左上の座標が(0,0)だった場合の話です。実際にはテトリミノは左右や下に移動しているので、この公式をそのまま使うことはできません。

いったんテトリミノの左上の座標を(0,0)に移動させたことにして、そこで上記公式で回転の処理をして、最後にもとの位置に戻しています。