Step 07 of 12

7種類のミノ

I, O, T, S, Z, L, J — テトリスの7種類のミノを定義します。 enum に色とセル配列を持たせる Java らしいパターンで、 衝突判定と描画は「各ミノの各マス」をループして処理します。

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

About this step

データを持つ enum

Shape は 7つの値 (I, O, T, S, Z, L, J) を持つ enum。 Java の enum はフィールドとコンストラクタを持てます。今回は 各ミノに「色」と「セル配列」を持たせました。

I(Color.CYAN, new int[][]{...}) の書き方は一見不思議ですが、 これが enum の値を定義するときの Java の構文。コンストラクタを裏で呼んでいます。

ミノは 2次元配列

例えば T ミノは 3×3 の int[][]

{0, 1, 0}
{1, 1, 1}
{0, 0, 0}

1 が「埋まっているセル」、0 が空白。 ミノの左上を (pieceCol, pieceRow) として、 各 (r, c) が埋まっているかをループで見れば、 盤面のどこに描くか・どこに当たるかが計算できます。

canMove と lockPiece の進化

衝突判定と固定処理は、ミノの 各セルに対してループするように拡張しました。 空のセル (== 0) はスキップ、埋まっているセルだけチェック。

ミノのサイズが 2×2 (O) から 4×4 (I) までバラバラでも、 cells.lengthcells[r].length を使えば全部同じコードで処理できる — 配列の長さを聞ける Java らしい書き方です。

次は?

今は I → O → T → S → Z → L → J の順にミノが出てきます。 Step 8 で java.util.Random を使って、ランダム抽選に変えます。