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

ぷよを消すには?

以下はぷよを下に移動させるメソッドです。これ以上下には移動できない場合、ぷよを固定させることになりますが、テトリスとちがって下になにもない空間ができてはいけません。このようなとき、赤いぷよは切り離されて下に落ちます。

ではもう一度、PuyoMoveDownIfCanメソッドをみてみましょう。

FixPuyoメソッドとOnFixedメソッド

これ以上、2つセットになった状態で下に移動できない場合はFixPuyoメソッドとOnFixedメソッドが呼び出されます。これは以下のような処理になっています。

FixPuyoメソッドは簡単です。セルのIsFixedプロパティにtrueをセットしているだけです。これで上から落ちてきた別のぷよが当たったときに当たり判定ができるようになります。

OnFixedメソッドのなかでおこなわれる処理は以下のようなものです。

まず、ぷよが固定されたときにプヨの下に空洞があるか調べます。そして空洞がある場合はそれをうめるように上のぷよを下に下げます。

それから4つつながっているぷよがあったら消します。ぷよが消された結果、空洞ができるかもしれません。そこでさらに空洞をうめる処理をおこないます。するとまた連鎖がおきるかもしれないので、空洞がなくなるまで処理をくりかえします。

DownPuyoIfSpacesメソッドとDownPuyoIfSpaceメソッド

DownPuyoIfSpacesメソッドは空洞をうめるための処理をくりかえすためのものです。実際にぷよの直下に空洞があるかどうか調べて、あれば上にあるぷよを下に下げる処理をおこなうのはDownPuyoIfSpaceメソッドです。処理がおこなわれたときはtrueを返すので、falseを返すまでこれを繰り返します。

それでは実際にぷよが固定されたときに呼び出されるOnFixedメソッドを示します。

処理中はキー操作ができないようにして、4つ以上つながっているプヨがあったら消して空洞ができたら上のぷよを移動させます。移動する必要がないぷよだけになったら処理は終了です。上から新しいぷよを降らせます。

4つ以上つながっているプヨを探すために自作メソッド GetConectedCellを使用しています。再帰呼び出しをしているのですが、同じぷよを複数回数えないようにチェックをつけながら調べています。GetConectedCellメソッドが終わったらClearCheckメソッドでチェックをはずします。