人工知能に関する断創録

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

オセロ盤を作る

まず手始めにオセロ盤を描くところまで作ります。

othello01.jar

オセロ盤の構造

盤面の構成は下の図のようになってます。

f:id:aidiary:20100509191150g:plain

オセロ盤は2次元のint型並列で表現します。

    // 盤面
    private int[][] board = new int[MASU][MASU];

盤面に入る数字は何もないとき0、黒い石があるとき1、白い石があるとき-1としています(今の段階では石はないので0だけです。プログラム中で0 とか1とかいう数字を使うのは好ましくないので定数で定義しています。

    // 空白
    private static final int BLANK = 0;

盤面を初期化しているのがinitBoard()です。

    private void initBoard() {
        for (int y = 0; y < MASU; y++) {
            for (int x = 0; x < MASU; x++) {
                board[y][x] = BLANK;
            }
        }
    }

まだ石は打ってないので全部BLANKで初期化しています。盤面を描画するのはdrawBoard()です。

    private void drawBoard(Graphics g) {
        // マスを塗りつぶす
        g.setColor(new Color(0, 128, 128));
        g.fillRect(0, 0, WIDTH, HEIGHT);
        for (int y = 0; y < MASU; y++) {
            for (int x = 0; x < MASU; x++) {
                // マス枠を描画する
                g.setColor(Color.BLACK);
                g.drawRect(x * GS, y * GS, GS, GS);
            }
        }
    }

盤面全体を緑色で塗りつぶしています。オセロ盤というと緑色がすぐ浮かぶんですがどうなんでしょうね?その後のforループではマスの枠を黒色で描いています。マスの枠を描く処理はけっこうよく使うような気がします。覚えておくと便利です。

追記(2005/5/8)

もっと効率よくマス枠を描く処理をSAWさんに指摘してもらいました。

    g.setColor(Color.black);
    // 縦線を引く
    for(int i = 1; i < MASU; i++) {
        g.drawLine(i*GS, 0, i*GS, HEIGHT);
    }
    // 横線を引く
    for(int i = 1; i < MASU; i++) {
        g.drawLine(0, i*GS, WIDTH, i*GS);
    }
    // 外枠を引く
    g.drawRect(0, 0, WIDTH, HEIGHT);

よく見ると私の方法はかなり無駄があるなぁ。forループの中でsetColor()やる必要ないじゃん・・・forの外で1回やっとけばよかった。シリーズ物は間違いが後の回まで続くのでやっかいです・・・