人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



ブロックの作成

ブロックを作ってみます。テトリスには7種類のブロックがありますが、ここでは一番簡単な四角ブロックだけ実装します。

tetris02.jar

ブロックの実装

ブロックは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)ですので下の図の位置にブロックがあります

f:id:aidiary:20090905091551g:plain

最後に描画です。

    /**
     * ブロックの描画
     * 
     * @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;

と定義しています。