Step 10 of 12

ライン消去

横一列がすべて埋まったら、その行を消して上の行を下に落とします。 ここで初めてテトリスとしての達成感が出ます。 ループしながら配列の要素を消す書き方の「罠」も体験します。

MyTetris.java
Java runtime を初回読み込み中…
CheerpJ の JRE (数十 MB) をダウンロードしています。2回目以降はキャッシュから瞬時に立ち上がります。
preparing

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行同時消し(テトリス!)もちゃんと動きます。