前回はテトリミノを下に移動させるために以下のようなメソッドを作成しました。

テトリミノがこれ以上、下に移動することができない場合、着地したとみなし、そのときにどのような処理をするべきか考えます。この処理は自作メソッド TetoroDownedでおこないます。

ここでやっていることはMovingTetorosの要素をFixedTetoroに追加し、横のラインがそろっていないか、そろっている場合はラインを消す処理をおこなっています(MovingTetorosに格納されているデータはShowNewTetoro()内でクリアされます)。

自作メソッドGetDeleteLineは横のラインがそろっているかチェックして、そのラインのナンバーをリストにして返します。各ラインのブロックを取得してFIELD_INNER_WIDTH個あれば全部そろっていると判定します。

次に自作メソッドDeleteLineIfNeedについて。これはそろっているラインがあればラインを削除します。

まずFixedTetoroに格納されるデータを入れ替える必要があります。横一列にそろったものは取り除きます。そして消された列より上にあるものを下に下げます。

それから視覚的に上にあったブロックが下がってくるように見せかけるためにブロックの色を変えています。

それからゲームオーバーになったときの処理も考えなければなりません。

これはShowNewTetoroメソッド内で新しいデータがMovingTetorosに格納されたときに、FixedTetoroとの積集合を調べて要素数が1以上の場合、ゲームオーバーになっていると判断するという考え方でよいと思われます。

タイマーイベントをつかってテトリスらしくする

テトリスは↓キーをおさなくても少しずつテトリミノは下に移動しています。タイマーイベントをつかってMoveDownTetoroメソッドを呼び出せばできそうです。

タイマーはゲーム開始とともにスタートさせ、ゲームオーバー時に止めます。

これで1秒おきにひとつずつテトリミノは下がっていきます。

←・→キーを押したときにMoveLeftTetoro、MoveRightTetoroメソッドを呼べばテトリミノを左右に動かすことができます。

↓キーがおされたときにはテトリミノが急速で落下します。タイマーイベントの間隔を変更すれば急速落下をさせることができます。そしてテトリミノが着地したタイミングでタイマーイベントの間隔をもとに戻せばよいのです。

とりあえず完成です。ビジュアル的に問題がある、得点が表示されないなどの問題がありますが、今後改良していくことにします。