人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

フィールドの作成

まずは、テトリスの舞台となるフィールドを作成します。まあ盤面を書くだけだから簡単ですね。

tetris01.jar

フィールドのデータ構造

フィールドってのは下のことです。テトリスの盤面です。

f:id:aidiary:20090905091218g:plain

このフィールドはFieldクラスで定義しています。テトリスに正式なルールがあるかはよくわからないんですがとりえあえずフィールドの大きさは25行×10列としています。左右と下に壁(図の灰色部分)を作るため26×12の大きさを取っています。

    // フィールドのサイズ(単位:マス)
    public static final int COL = 12;
    public static final int ROW = 26;

フィールドは26×12の二次元配列で表します。

    // フィールド
    private int[][] field;
    field = new int[ROW][COL];

各マスにブロックがあったら1でなかったら0を入れます。周囲の壁もブロックと同じ扱いです。なのでフィールドの初期化処理で周囲のマスに1を入れます。

    /**
     * フィールドを初期化する
     */
    public void init() {
        for (int y = 0; y < ROW; y++) {
            for (int x = 0; x < COL; x++) {
                // 壁をつくる
                if (x == 0 || x == COL - 1) {
                    field[y][x] = 1;
                } else if (y == ROW - 1) {
                    field[y][x] = 1;
                } else {
                    field[y][x] = 0;
                }
            }
        }
    }

フィールドの描画

フィールドの描画はdraw()です。

    /**
     * フィールドを描画
     */
    public void draw(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, MainPanel.WIDTH, MainPanel.HEIGHT);

        g.setColor(Color.LIGHT_GRAY);
        for (int y = 0; y < ROW; y++) {
            for (int x = 0; x < COL; x++) {
                if (field[y][x] == 1) {
                    g.fillRect(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE,
                            TILE_SIZE);
                }
            }
        }
    }

背景を真っ黒に塗りつぶしてからブロックがあるマスのみ灰色で塗りつぶしています。