Step 10 of 12
ライン消去
横一列がすべて埋まったら、その行を消して上の行を下に落とします。 ここで初めてテトリスとしての達成感が出ます。 ループしながら配列の要素を消す書き方の「罠」も体験します。
About this step
3つのメソッドに分ける
ライン消去のロジックを 3つの小さなメソッドに分けました:
isRowFull(row)— その行が埋まっているか?removeRow(row)— その行を消して上の行を下にシフトclearLines()— 全体を見て、埋まっている行を全部処理
それぞれ責務が明確だと、考えるのもデバッグするのも楽です。
ループ中削除の罠
clearLines の中で while (row >= 0) を使うのがミソ。
素直に for (int row = ROWS - 1; row >= 0; row--) と書くと、
行を消した直後に row が 1 減ってしまい、
シフトで下りてきた行のチェックが飛ばされます。
例:row = 18 を消す → 今 row = 18 には元 row = 17 の内容がある → for ループは次に row = 17 に進んでしまう → 元 row = 17 は見られない。
while ループなら「消した時は decrement しない」と書けて、罠を回避できます。
シフトの書き方
removeRow では、消したい行から上に向かってコピーしていきます:
board[r] ← board[r - 1] (r は row から 1 まで)
最後に一番上の行(row = 0)を 0 で埋めて完成。
複数行が一度に揃った時も、clearLines が繰り返し呼ぶので自動で処理されます。
試し方
左右 + 回転でミノをうまく詰めていって、横一列揃えてみてください。 消えた瞬間、ブロックが一気に下に落ちるはず。 4行同時消し(テトリス!)もちゃんと動きます。