人工知能に関する断創録

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

マウスで石を打つ

盤面に白石と黒石を交互に打てるようにします。打ったときにはカチッっと気持ちい音が鳴るようにもしています。

othello02.jar

マウスで石を打つ

盤面をマウスでクリックしたとき石が打たれるようにするためにmouseClicked()を実装します。

    public void mouseClicked(MouseEvent e) {
        // どこのマスかを調べる
        int x = e.getX() / GS;
        int y = e.getY() / GS;
        // その場所に石を打つ
        putDownStone(x, y);
        // 音を鳴らす
        kachi.play();
        // 盤面が変化したので再描画する
        repaint();
    }

マウスのある座標を1マスの大きさで割るとマスの位置(0〜7)が得られます。たとえば、マウスでクリックした場所が(50,48)だとします。 GS(=32)で割ると(1,1)、つまり(1,1)のマスになります。整数の割り算はあまりを切り捨てる点に注意してください。ちなみにこの処理はマップエディタを作るときにも使えます。実際に(x,y)のマスに石を打っているのはputDownStone()です。

    private void putDownStone(int x, int y) {
        int stone;

        // どっちの手番か調べて石の色を決める
        if (flagForWhite) {
            stone = WHITE_STONE;
        } else {
            stone = BLACK_STONE;
        }
        // 石を打つ
        board[y][x] = stone;
        // 手番を変える
        flagForWhite = !flagForWhite;
    }

どっちの手番か調べてからboardに値を設定しています。flagForWhiteは白番のときtrueで黒番のときfalseとなります。手番を変える処理はflagForWhiteがtrueだったらfalse、falseだったらtrueにすればよいので上のように簡潔に書けます。

初期配置

オセロの初期配置は

    private void initBoard() {
        ・・・
        board[3][3] = board[4][4] = WHITE_STONE;
        board[3][4] = board[4][3] = BLACK_STONE;

        flagForWhite = false;
    }

の部分です。オセロやるときは真ん中に白黒を交互に適当に打ってたんですが、上から白黒・黒白の順に打つのが正しいようです。 flagForWhiteはfalse、つまり黒番から始めます。

石の描画

石を描いているのはdrawStone()です。

    private void drawStone(Graphics g) {
        for (int y = 0; y < MASU; y++) {
            for (int x = 0; x < MASU; x++) {
                if (board[y][x] == BLANK) {
                    continue;
                } else if (board[y][x] == BLACK_STONE) {
                    g.setColor(Color.BLACK);
                } else {
                    g.setColor(Color.WHITE);
                }
                g.fillOval(x * GS + 3, y * GS + 3, GS - 6, GS - 6);
            }
        }
    }

boardを見て打たれている石を判断し、色をセットしてから円(石)を書いてます。円の大きさはマスより少し小さくしています。実行してみるとわかりますが現段階では盤面上のどこにでも石が打ててしまいます。次回はこの点を改良していきます。