完成品はこんな感じになります。

ぷよを落下させる

前回からはじまった「C#でぷよぷよもどきを作る」。前回はフィールドをつくるところをやりました。今回はぷよを落下させます。

まずゲームがはじまったら、新しいぷよを画面の上部に描画します。この処理をするのがCreateNewPuyoメソッドです。

ぷよは2つ組み合わさった状態でおちてきます。回転するときは一方を軸に回転するので、このぷよの位置を現在位置とします。これをフィールド変数puyoPositionXとpuyoPositionYに保存しておきます。

それからぷよにはいくつかの種類があります。ここでは4種類とします。乱数でどのようなタイプのぷよをつくるか決定し、それをフィールド変数に保存します。回転軸になるぷよのタイプを Puyo列挙型フィールド変数 DropingPuyoに、他方をSubDropingPuyoに保存します。

ゲームオーバーの処理

それからゲームオーバーの処理も必要です(コメントで指摘されるまで気づかないって)。これを先にやっておきましょう。ゲームオーバーかどうかの判定はCreateNewPuyoメソッドを実行するときに新しいぷよが出てきたときにすでに別のぷよが設置されているかどうかで判断できます。

もしゲームオーバーであった場合はタイマーを止め、キー操作不能にします。またゲームをもう一度するときにはIsGameOver = falseに戻すとともに全セルを初期化します。

次にぷよを落下の処理ですが、タイマーをつかって一定時間の経過とともに下に移動させます。ただいまの段階では↓キーをおすと下に移動するようにします。またゲームオーバーの場合はキー操作をしてもなにもおきません。

ここでは下への移動だけを考えます。

PuyoMoveLeftIfCan()
PuyoMoveRightIfCan()
PuyoRotateIfCan()

これらはぷよを回転させる C#でぷよぷよもどきを作るを参照してください。

GetSubPuyoPositionメソッド

ぷよは二つで組になっていて、片方が回転軸になっています。回転軸ではないぷよの位置を取得するのがGetSubPuyoPositionメソッドです。

回転角度は「まったく回転していない」「時計回りに90度」「同180度」「同270度」のどれかです。回転軸になるぷよの位置と現在の回転角度がわかればもうひとつのぷよの位置も知ることができます。

Positionクラスは以下のようになっています。

PuyoMoveDownIfCanメソッド

PuyoMoveDownIfCanメソッドは名前のとおり「もし可能であればぷよを下に移動させる」メソッドです。

考え方は現在の位置がフィールド変数として保存されているので、これを取得、そして実際に下に移動できるかどうかを確認します。下に移動できない場合として、ぷよが床に接触している、すでに設置されているぷよと重なってしまう場合が考えられます。

回転軸のぷよとそうでないほうのぷよ、両方とも下に移動できる場合のみが移動可能な状態です。

CanMoveDownメソッドがtrueを返した場合は、まだ下に移動させることができるので、ぷよの新しい位置を設定します。そしてFieldを再描画します。CanMoveDownメソッドがfalseを返した場合はこれ以上、下に移動することができないので設置の処理をおこないます。

CanMoveDownメソッド

そして実際に下に移動できるかどうかを判定しているのがCanMoveDownメソッドです。ぷよがすでに床に接触している場合や設置されているぷよと重なってしまう場合は移動できないということになります。

FixPuyo(int colum, int row)はぷよを固定するためのものであり、OnFixed()は固定されたあとつながったぷよを消す、消えたあとできた空洞をうめる処理をおこなうメソッドです。この部分についてはぷよを消す C#でぷよぷよもどきを作るを参照してください。