java中的Gomoku求值函数

java中的Gomoku求值函数,java,alpha,beta,minimax,gomoku,Java,Alpha,Beta,Minimax,Gomoku,我已经实现了一个Gomoku玩家类,它使用alpha-beta剪枝来为计算机选择最好的移动,但是我在解决如何编写评估函数以正确地为棋盘上的每个位置打分时遇到了困难 我有一个“evaluateBoard”方法来评估董事会的位置,并更新每行、每列和每对角线中的黑色、白色或空白位置的数量。我的“scoreChange”方法为每个位置打分,这就是我感觉我的程序出错的地方,因为当我连续得到3或4分时,它不会阻止我 我如何正确评估和评分每个职位 public int evaluateBoard(Color[

我已经实现了一个Gomoku玩家类,它使用alpha-beta剪枝来为计算机选择最好的移动,但是我在解决如何编写评估函数以正确地为棋盘上的每个位置打分时遇到了困难

我有一个“evaluateBoard”方法来评估董事会的位置,并更新每行、每列和每对角线中的黑色、白色或空白位置的数量。我的“scoreChange”方法为每个位置打分,这就是我感觉我的程序出错的地方,因为当我连续得到3或4分时,它不会阻止我

我如何正确评估和评分每个职位

public int evaluateBoard(Color[][] board, Color computer) {
    int score = 0;
    //Check all the rows
    for (int i = 0; i < 8; ++i) {
        int blank = 0;
        int black = 0;
        int white = 0;
        for (int j = 0; j < 8; ++j) {
            if (board[i][j] == null) {
                blank++;
            } else if (board[i][j] == Color.black) {
                black++;
            } else {
                white++;
            }
        } 
        score+=scoreChange(black, white, computer); 
    }

    //Check all the columns
    for (int j = 0; j < 8; ++j) {
        int blank = 0;
        int black = 0;
        int white = 0;
        for (int i = 0; i < 8; ++i) {
            if (board[i][j] == null) {
                blank++;
            } else if (board[i][j] == Color.black) {
                black++;
            } else {
                white++;
            } 
        }
        score+=scoreChange(black, white, computer);
    }

    int blank = 0;
    int black = 0;
    int white = 0;
    //Check diagonal (first)
    for (int i = 0, j = 0; i < 8; ++i, ++j) {
        if (board[i][j] == Color.black) {
            black++;
        } else if (board[i][j] == Color.white) {
            white++;
        } else {
            blank++;
        }
    }
    score+=scoreChange(black, white, computer);

    blank = 0;
    black = 0;
    white = 0;
    //Check Diagonal (Second)
    for (int i = 7, j = 0; i > -1; --i, ++j) {
        if (board[i][j] == Color.black) {
            black++;
        } else if (board[i][j] == Color.white) {
            white++;
        } else {
            blank++;
        }
    }
    score+=scoreChange(black, white, computer);
    return score;
}

private int scoreChange(int black, int white){
    int change;
    if (black == 5) {
        change = -10000;
    } else if (black == 4 && white == 0) {
        change = -1000;
    } else if (black == 3 && white == 0) {
        change = -100;
    } else if (black == 2 && white == 0) {
        change = -10;
    } else if (black == 1 && white == 0) {
        change = -1;
    } else if (white == 5) {
        change = 10000;
    } else if (white == 4 && black == 0) {
        change = 1000;
    } else if (white == 3 && black == 0) {
        change = 100;
    } else if (white == 2 && black == 0) {
        change = 10;
    } else if (white == 1 && black == 0) {
        change = 1;
    } else {
        change = 0;
    } 
    return change;
}
public int evaluateBoard(彩色[]板,彩色计算机){
智力得分=0;
//检查所有行
对于(int i=0;i<8;++i){
int blank=0;
int黑色=0;
int-white=0;
对于(int j=0;j<8;++j){
如果(板[i][j]==null){
blank++;
}else if(板[i][j]==颜色.黑色){
黑色++;
}否则{
白色++;
}
} 
分数+=分数变化(黑色、白色、计算机);
}
//检查所有列
对于(int j=0;j<8;++j){
int blank=0;
int黑色=0;
int-white=0;
对于(int i=0;i<8;++i){
如果(板[i][j]==null){
blank++;
}else if(板[i][j]==颜色.黑色){
黑色++;
}否则{
白色++;
} 
}
分数+=分数变化(黑色、白色、计算机);
}
int blank=0;
int黑色=0;
int-white=0;
//检查对角线(第一个)
对于(int i=0,j=0;i<8;++i,++j){
如果(板[i][j]==颜色.黑色){
黑色++;
}else if(板[i][j]==颜色.白色){
白色++;
}否则{
blank++;
}
}
分数+=分数变化(黑色、白色、计算机);
空白=0;
黑色=0;
白色=0;
//检查对角线(秒)
对于(int i=7,j=0;i>-1;--i,++j){
如果(板[i][j]==颜色.黑色){
黑色++;
}else if(板[i][j]==颜色.白色){
白色++;
}否则{
blank++;
}
}
分数+=分数变化(黑色、白色、计算机);
返回分数;
}
私有整数分数更改(整数黑色、整数白色){
智力变化;
如果(黑色==5){
变化=-10000;
}else if(黑色==4&&white==0){
变化=-1000;
}else if(黑色==3&&white==0){
变化=-100;
}else if(黑色==2&&white==0){
变化=-10;
}else if(黑色==1&&白色==0){
变化=-1;
}否则如果(白色==5){
变化=10000;
}else if(白色==4&&black==0){
变化=1000;
}else if(白色==3&&black==0){
变化=100;
}else if(白色==2&&黑色==0){
变化=10;
}else if(白色==1&&黑色==0){
变化=1;
}否则{
变化=0;
} 
回报变化;
}

几年前,当我为大学编写一个类似的程序时,我在一个结构中有一个方形板,但也有另一个结构,带有间接层,求值函数使用的是192x5。A1..A5在第一排,A2..A6在第二排,依此类推。这是AI用来考虑的结构(是的,A2的一个剧本看起来像一个三个位置的游戏(两个水平,一个垂直,一个对角线)。所以我应该把所有可能的获胜组合存储在一个二维数组中,然后看看哪个位置接近一个完整的行、列或对角线,还要检查对手是否也接近成功?