テトリス
フィールドの作成
TetrisFieldクラスでは積み上げられているブロックや現在落下中のブロックといったフィールドの管理を行います。 フィールドのイメージは下図のようになります。
フィールドでは図にあるような3種類の状態を持ちます。 そこで、それぞれの状態を表す定数を次のように作成します。
static final int WALL = -1, SPACE = 0, BLOCK = 1;
また、フィールドを表現するために次のような配列を作成します。
int[][] field = new int[HEIGHT][WIDTH];
HEIGHTとWIDTHは定数として作っておきます。
static final int HEIGHT = 20 + 1;//高さ
static final int WIDTH = 10 + 2; //幅
これで、テトリスのフィールドのサイズは縦20×横10となります。 高さに+1、幅に+2としているのは図に示している壁を含めているためです。
次に、ブロックの情報を得るために次の変数を作成します。 今はTetrisBlockクラスが無いため1行目をコメントアウトしておいてください。
01 private TetrisBlock blc = new TetrisBlock();
02 private int blockX = 5, blockY = 0; //ブロック左上の座標
2行目の変数はブロックのフィールド上の位置を管理するために使用します。
また、描画領域のサイズとブロックの一辺の長さも定数として作成しておきます。
static final int CANVAS_HEIGHT = 600, CANVAS_WIDTH = 350;
static final int BLOCK_SIZE = 25; //1ブロックの描画サイズ
初期化
コンストラクタでは初期化を行うメソッドを呼び出します。 3行目はコメントアウトしておいてください。
01 TetrisField(){
02 resetField(); //フィールドをリセット
03 resetBlock(); //ブロックのリセット
04 }
resetFieldクラスではfieldを全て空白にしてから、上辺を除く外枠を壁にします。
01 private void resetField(){
02 for(int i=0; i<HEIGHT; i++){
03 for(int j=0; j<WIDTH; j++){
04 field[i][j] = SPACE;
05
06 if(i==HEIGHT-1 || j==0 || j==WIDTH-1){
07 field[i][j] = WALL;
08 }
09 }
10 }
11 }
描画
TetrisMainクラスのpaintメソッドから呼び出されるdrawFieldメソッドを作成します。
01 public void drawField(Graphics g){
02 //一旦画面を塗りつぶす
03 g.setColor(Color.black);
04 g.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
05
06 for(int i=0; i<HEIGHT; i++){
07 for(int j=0; j<WIDTH; j++){
08 switch(field[i][j]){
09 case SPACE: //空白(黒色)
10 g.setColor(Color.black);
11 break;
12 case WALL: //壁(灰色)
13 g.setColor(Color.gray);
14 break;
15 }
16 g.fillRect(j*BLOCK_SIZE+BLOCK_SIZE,
17 i*BLOCK_SIZE+BLOCK_SIZE*2,
18 BLOCK_SIZE, BLOCK_SIZE);
19 g.setColor(Color.lightGray);
20 g.drawRect(j*BLOCK_SIZE+BLOCK_SIZE,
21 i*BLOCK_SIZE+BLOCK_SIZE*2,
22 BLOCK_SIZE, BLOCK_SIZE);
23 }
24 }
25 }
2,3行目で画面を一旦画面を黒色で塗りつぶしてから、 8〜15行目のswitch文で配列fieldの要素の状態によって塗る色を変更し、 16〜19行目で描画を行っています。
ここまでのプログラムをコンパイルし実行すると画面にフィールドが描画されます。
次回はTetrisBlockクラスの作成を行います。
Copylight (c) ガメラボ 2006 - All Rights Reserved