ブロックの作成
ブロックを作ってみます。テトリスには7種類のブロックがありますが、ここでは一番簡単な四角ブロックだけ実装します。
ブロックの実装
ブロックはBlockクラスで定義してます。テトリスのブロックはいろいろな形のものがありますがすべて4x4の大きさに収まります。なので4x4の二次元配列でブロックを表現します。
// ブロックのサイズ public static final int ROW = 4; public static final int COL = 4; // ブロックの形を格納 private int[][] block = new int[ROW][COL];
四角ブロックだとこんな感じでブロック配列blockに格納します。
// 四角いブロックを作成 // □□□□ // □■■□ // □■■□ // □□□□
□が0で■が1です。まずブロック配列blockをすべて0で初期化してから■のところだけ1で埋めます。
public Block() { init(); block[1][1] = 1; block[1][2] = 1; block[2][1] = 1; block[2][2] = 1; pos = new Point(4, 4); } /** * ブロックの初期化 */ public void init() { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { block[i][j] = 0; } } }
block[行][列]ですので注意してください。たとえば、block[1][2]は1行目、2列目ですので下の■の位置になります。
0 1 2 3 (列) 0 □□□□ 1 □□■□ 2 □□□□ 3 □□□□ (行)
ここで出てくるposはブロックの左上隅のマス(0,0)のフィールド上での位置を表します。たとえば、pos=(x,y)でしたらフィールド上のy行目、x列目にブロックの左上隅のマスがあります。xは列にあたり、yは行に当たるので注意してください。XY方式と行列方式は表記の順番が逆なので結構ややこしいです。C言語の配列構造に毒されてるのかも・・・上の例ですとpos=(4,4)ですので下の図の位置にブロックがあります
最後に描画です。
/** * ブロックの描画 * * @param g 描画オブジェクト */ public void draw(Graphics g) { g.setColor(Color.MAGENTA); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (block[i][j] == 1) { // posの位置を基準とする点に注意! g.fillRect((pos.x + j) * TILE_SIZE, (pos.y + i) * TILE_SIZE, TILE_SIZE, TILE_SIZE); } } } }
posの位置を基準に4x4のブロックで■(blockの値が1)のマスのみフィールドに描画しています。□(blockの値が0)のマスは描画しません。TILE_SIZEはフィールドの1マスの大きさと同じで
// 1マスのサイズ private static final int TILE_SIZE = Field.TILE_SIZE;
と定義しています。