-1

我正在探索如何在带有 alpha-beta 修剪的四人游戏中使用 Minimax 算法。

因此,我查看了有关 Connect4 播放器策略的源代码,发现了这个评估函数:

/**
* Get the score of a board
*/
public int score(){
    int score = 0;
    for (int r= 0; r < ROWS; r++) {
        if (r <= ROWS-4) {
            for (int c = 0; c < COLS; c++) {
                score += score(r, c);
            }
        } else {
            for (int c = 0; c <= COLS-4; c++) {
                score += score(r, c);
            }
        }
    }
    return score;
}


/**
* Helper method to get the score of a board
*/
public int score(int row, int col){
    int score = 0;
    boolean unblocked = true;
    int tally = 0;
    //int r, c;
    if (row < ROWS-3) {
        //check up
        unblocked = true;
        tally = 0;

        for (int r=row; r<row+4; r++) {
            if (board[r][col] == CHECKERS[1-playerToMoveNum]) {
                unblocked = false;
            }
            if (board[r][col] == CHECKERS[playerToMoveNum]) {
                tally ++;
            }
        }
        if (unblocked == true) {
            score = score + (tally*tally*tally*tally);
        }
        if (col < COLS-3) {
            //check up and to the right
            unblocked = true;
            tally = 0;
            for (int r=row, c=col; r<row+4; r++, c++) {
                if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
                    unblocked = false;
                }
                if (board[r][c] == CHECKERS[playerToMoveNum]) {
                    tally ++;
                }
            }
            if (unblocked == true) {
                score = score + (tally*tally*tally*tally);
            }
        }
    }
    if (col < COLS-3) {
        //check right
        unblocked = true;
        tally = 0;
        for (int c=col; c<col+4; c++) {
            if (board[row][c] == CHECKERS[1-playerToMoveNum]) {
                unblocked = false;
            }
            if (board[row][c] == CHECKERS[playerToMoveNum]) {
                tally ++;
            }
        }
        if (unblocked == true) {
            score = score + (tally*tally*tally*tally);
        }
        if (row > 2) {
            //check down and to the right
            unblocked = true;
            tally = 0;
            for (int r=row, c=col; c<col+4; r--, c++) {
                if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
                    unblocked = false;
                }
                if (board[r][c] == CHECKERS[playerToMoveNum]) {
                    tally ++;
                }
            }
            if (unblocked == true) {
                score = score + (tally*tally*tally*tally);
            }
        }
    }
    return score;
}

我在这个 PDF 中找到了所有这些代码:http ://ryanmaguiremusic.com/media_files/pdf/ConnectFourSource.pdf

我只是想了解此评估功能的工作原理并决定要采取的最佳行动……有人可以帮我吗?这将不胜感激。

4

1 回答 1

2

这是一个普遍的答案:

评估应该为更好的位置提供更好的值。在游戏中,通常通过以下方式计算分数来评估位置:为理想的配置/事件增加分数,为不受欢迎的配置/事件降低分数。决定评估的特征应该改变多少(=平衡权重)可能非常困难。

如果我们将其应用于连接四个,那么一个特征可能是存活威胁的数量。但是对于一个非常好的算法(解决 7x6),您必须查看获胜的移动是在奇数还是偶数线上。然后有一些规则,比如“如果第二名玩家有 2 个偶数威胁,他就赢得了比赛”(这一切都归结为当填满棋盘并强制移动时,给出的规则有点简化:第二名玩家将如果第一个玩家在那里有一个奇怪的威胁,他必须杀死一个偶数威胁,如果他不能填满其他列)。

给定规则的简单示例(O = 第一个玩家,X = 第二个玩家),X 获胜:

  * X X X *
O   O X O   O
1 2 3 4 5 6 7

曾经有一篇关于它的非常详细的科学论文。目前我能找到的最接近的:http ://web.mit.edu/sp.268/www/2010/connectFourSlides.pdf 应该给你一些想法。

顺便提一句。打开书籍(通常是任何形式的预定义智慧,例如 joseki、fuseki)和特殊的最终游戏评估器可以大大提高极小极大的性能。

于 2015-06-20T07:50:50.590 回答