前回の続きです。

PictureBoxに頼らずC#でテトリスをつくる (その1)

MovingTetriminoクラスを示します。

まずミノの位置とこれを構成するブロックに関するプロパティとメソッドを示します。

GetBlocks(TetriminoAngle angle)メソッドは現在のテトリミノの種類とその位置からそれを構成するブロックを返すものです。

次にテトリミノの移動に関するメソッドを示します。回転処理はあとまわしにして左右、下に移動する処理を考えます。

最初にGetMoveLeft()、GetMoveRight()、GetMoveDown()の各メソッドで移動先のブロックを取得して、これが壁にあたったりすでに設置されているブロックと重ならないか調べています。問題なければ移動させます。

次に回転処理を考えます。回転は右回りと左回りがあります。Oミノは回転しないので考える必要はないのですが、それ以外のミノは単純に回転させたときに壁やすでに設置されているブロックにぶつかってしまう場合、回転後に別の方向にそのままずらせないか考えます。

左回転の場合

普通の方法で回転できるか?
できないのであれば・・・

(1)
0度,270度の場合は右へ1マス移動
90度、180度の場合は左へ1マス移動

これで回転できない場合は

(2)
その状態から
90度,270度の場合は上へ1マス移動
0度,180度の場合は下へ1マス移動

それでも回転できない場合は

(3)
元に戻し
90度,270度の場合は下へ2マス移動
0度,180度の場合は上へ2マス移動

それでも回転できない場合は

(4)
その状態から
0度,180度、270度の場合は右へ1マス移動
90度、180度の場合は左へ1マス移動

それでも回転できない場合は回転できないと判断します。

また右回転の場合は・・・

(1)
0度,90度の場合は左へ1マス移動
180度、270度の場合は右へ1マス移動

(2)
その状態から
90度,270度の場合は上へ1マス移動
0度,180度の場合は下へ1マス移動

(3)
元に戻し
90度,270度の場合は下へ2マス移動
0度,180度の場合は上へ2マス移動

(4)
その状態から
0度,90度の場合は左へ1マス移動
180度、270度の場合は右へ1マス移動

・・・となります。

それを判定する処理を書くと長くなるので別のクラス(SuperRotationクラス)にしました。

さて問題のSuperRotationクラスですが、そのまえに処理の結果を返すときに必要になるSuperRotationResultクラスを先に示します。

このクラスはどれだけ回転軸をずらすかを示すものです。SuperRotationResult.MoveX == 0 && SuperRotationResult.MoveY == 0であれば通常回転で問題ないということですし、それ以外の値であればその方向にずらすということです。もしnullが返ってきたら回転はできないということになります。

SuperRotationクラスを示します。

急速落下(ハードドロップ)させる場合はHardDrop()メソッドが呼び出されます。これは瞬時に下までミノが落下して固定されてしまいます。またドロップポイントが加算されます。

ハードドロップする場合は落下先のブロックを求めます。それがGetHardDropedBlocks(ref int count)メソッドです。このメソッドは何回下へ移動させることができるかをカウントしてその分だけ下にずらした場合のブロックのリストを返します。

ミノが設置して固定されたらFixTetrimino()メソッドが呼び出され、TetriminoFixedイベントが発生します。

次に現在のミノと次以降のミノの管理するためのメソッドを示します。

Typeプロパティは現在落下中のミノの種類を示します。新しい値をセットするとミノの座標が上部の出現場所である(3,-3)に変更されます。

フィールド変数 NextTetoroTypesには次以降に落ちてくるTetriminoTypesが格納されます。7種類1個ずつで1セット(バッグという)が構成され、残りが少なくなると乱数で新しいバッグがつくられます。

Init()メソッドではNextTetoroTypesがクリアされ、新しいバッグが作り直されます。

それから新しいミノを(3,-3)に出現させてみたものの、すでに設置されているブロックと重なってしまった場合は上部までミノが積み上がっていると判断します。そのときはForm1クラスでゲームオーバーの処理をおこなわせるためにCantPutNewTetriminoイベントが発生します。

描画に関する処理をおこなうメソッドを示します。Draw(Graphics g)メソッドは落下中のミノを描画するメソッドであり、DrawGohst(Graphics g)メソッドはハードドロップするとどこに設置されるかを示すゴーストを描画します。

TetriminoColorクラスはTetriminoTypesからミノの色を取得するための静的クラスです。

PlaySoundeffectクラスは効果音を鳴らすための静的クラスです。