最低限ルールを守る思考ルーチン

開発目標

このページの目標は、思考ルーチンに、リバーシのルールを教えることです。これで、何とかコンピュータと対戦できるようになります。

置けるなら置く

そこに置いてよいかを調べるて、置いてよいときは置くメソッドを作ります。今の場合は置いてよいかどうか調べるだけで良いんですが、後のことを考えて置く処理も加えておきます。

ReversiAI.java

//リバーシ思考ルーチン
//2011/09/25  by boco.hp3200.com
//--------------------------------------------------------------------------
package com.hp3200.boco.reversi;

public class ReversiAI {
    private final int WALL = -1;
    private final int BLANK = 0;
    private final int PLAYER = 1;
    private final int COM = 2;
    private final int[] MOVE = {-11, -10, -9, -1, 1, 9, 10, 11};
    
    private int[] board = new int[100];
    private int bestPlace;

    //コンストラクタ
    public ReversiAI() {
    }

    //処 理:盤を初期化する
    //引 数:startBoard……初めの盤
    //戻り値:なし
    public void setBoard(int[] startBoard) {
        for(int i=0;i<100;i++) {
            board[i] = startBoard[i];
        }
    }

    //処 理:最善手を返す
    //引 数:なし
    //戻り値:最善手
    public int getPlace() {
        return bestPlace;
    }
    
    //処 理:最善手を考える
    //引 数:myCoin……PLAYER or COM
    //戻り値:なし
    public void think(int myCoin) {
        int i;
        
        for(i=11;i<=88;i++) {
            if(board[i]==BLANK) {
                if(reverse(myCoin,i)==true) {
                    bestPlace = i;
                }
            }
        }
    }

    //処 理:そこに置けるなら、置いて裏返す
    //引 数:myCoin……PLAYER or COM、p……置く場所
    //戻り値:置けなかったらfalse
    boolean reverse(int myCoin, int p) {
        int yourCoin = PLAYER;
        int i, j, k;
        boolean putting = false;

        //相手の石を設定
        if(myCoin==PLAYER) yourCoin = COM;

        //置いて裏返す
        if(board[p]==BLANK) {
            for(i=0;i<8;i++) {
                if(board[p+MOVE[i]]==yourCoin) {
                    for(j=2;j<8;j++) {
                        if(board[p+MOVE[i]*j]==myCoin) {
                            putting = true;
                            for(k=1;k<j;k++) {
                                board[p+MOVE[i]*k] = myCoin;
                            }
                            break;
                        } else if(board[p+MOVE[i]*j]==yourCoin) {
                        } else {
                            break;
                        }
                    }
                }
            }
            if(putting==true) board[p] = myCoin;
        }
        
        //可否を返す
        return putting;
    }

}

開発結果

これで思考ルーチンがリバーシのルールを覚えてくれました。確認してみます。

すごく弱いですが、ちゃんとルールは守ってくれています。次回は、もっと思考ルーチンを育てます。ちょっとは考えるようになってくれます。