Step 05 of 12
壁と床の衝突判定
ブロックが盤面を飛び出さないようにします。
canMove(col, row) という boolean を返すヘルパーメソッドを書き、
落下・キー入力の両方から共通で呼ぶのがポイント。
「状態変更の前にチェック」は、バグを減らす定石です。
About this step
canMove という小さな関門
canMove(int col, int row) は
「その座標はセーフか?」を true / false で返すだけのメソッド。
ロジックを小さく切り出すことで、読みやすくなり、
同じ判定を何度も書かずに済みます。
今回のチェックは4つ。col < 0(左の壁)、
col >= COLS(右の壁)、row < 0(天井、今は起きないけど将来に備える)、
row >= ROWS(床)。どれか1つでも当てはまれば false。
「変更の前にチェック」パターン
update でも onKey でも、
blockRow++ / blockCol-- する直前に canMove を呼んで確かめてから動かしています。
これで「一度はみ出してから戻す」ような面倒な処理が不要になります。
短絡評価(&&)を使って「キーが LEFT で、かつ動ける場合だけ」を1行に書けるのも Java らしい表現。
動かしてみる
左右に動かしても壁で止まる、下まで落ちても床で止まるのを確認してください。 次のステップ (Step 6) では、床に着いたブロックをその場に固定して新しいブロックを出す処理を追加します。 それで初めて「積み上がる」ようになります。