Step 11 of 12

スコアとレベル

消したライン数からスコアを計算し、10行ごとにレベルアップ。 レベルが上がると落下が速くなります。 盤面の右側にスコア・レベル・ライン数を表示するため、キャンバスを少し広げます。

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

About this step

ゲーム状態が増えてきた

ここまでは「ブロックと盤面」だけを追いかけていましたが、 Step 11 で scorelinesClearedlevel という ゲーム全体の状態が加わります。

これらは「ブロックの位置」とは別の軸で動く値です。 状態が増えると変更のタイミングを見失いやすくなるので、 「誰が、どのイベントで、この値を変えるか」を整理する癖をつけましょう。

スコアの計算式

標準的な Tetris のスコア:

1 行消し100 × level
2 行消し300 × level
3 行消し500 × level
4 行消し (テトリス!)800 × level

配列リテラル int[] points = {0, 100, 300, 500, 800} を使って points[n] で一発参照するのが気持ちいい書き方。 points[0] は未使用(保険)。

レベルで速くなる

dropSeconds() がメソッドになりました。固定値 1.0 ではなく、 レベルに応じて計算する形。レベル 1 → 1.0秒、レベル 5 → 0.6秒、レベル 10 → 0.1秒。

これで Step 11 以降、DROP_SECONDS 定数は dropSeconds() メソッド呼び出しに置き換わります。

キャンバス拡張

表示エリアを 240px → 340px に広げ、右側に screen.text でスコア等を描きます。 これまで当たり前のように盤面 = キャンバス全域だった前提が崩れる、地味だけど大事な瞬間。 座標は「盤面の右端 + 14px 」から始めています。

次のステップ

Step 12 でゲームオーバー判定とリスタートを入れて、全体を締めます。 スポーン位置にブロックが重なったら「もう置けない」 = ゲームオーバー、 R で最初からやり直し。