XO游戏中的评价功能

问题描述 投票:0回答:1

我在cpp中编写了一个XO游戏ai与玩家,并使用minimax和alpha beta剪枝,我用经典XO游戏编写的这个游戏的不同之处在于玩家和ai可以在每轮中玩任何标记。这意味着人工智能可以在第一轮中玩x,而玩家可以像第一轮中的ai一样玩x,这样他们就可以在每一轮中玩任何东西。人工智能的目标是阻止玩家获胜。所以我写了这个游戏,但问题是我不确定评估函数,因为我无法处理标记可以是动态的:

int evaluate()
{

    // Check for all the rows and columns for win
    for (int i = 0; i < 3; i++) {
        if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
        {
            if (board[i][0] == aiMark && board[i][0] == playerMark)
                return +20;
            else if (board[i][0] == playerMark && board[i][0] != aiMark)
                return -10;
        }
    }

    for (int i = 0; i < 3; i++) {
        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
        {
            if (board[0][i] == aiMark && board[0][i] == playerMark)
                return +20;
            else if (board[0][i] == playerMark && board[0][i] != aiMark)
                return -10;
        }
    }

    // Check for the diagonals for win
    if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
    {
        if (board[0][0] == aiMark && board[0][0] == playerMark)
            return +20;
        else if (board[0][0] == playerMark && board[0][0] != aiMark)
            return -10;

    }

    if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
    {

        if (board[0][2] == aiMark && board[0][2] == playerMark)
            return +20;
        else if (board[0][2] == playerMark && board[0][2] != aiMark)
            return -10;
    }


    // no winner
    return 0;

int minimax(vector<vector<char>>& board, int depth, bool isMax, int alpha, int beta)
{

    int score = evaluate();
    if (score == 20) return score - depth;
    if (score == -10) return score + depth;
    if (isBoardFull()) return 0;

    if (isMax)
    {
        int best = -1000;

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (board[i][j]==' ')
                {
                    board[i][j] = aiMark;

                    int val = minimax(board, depth+10, !isMax, alpha, beta);
                    best = max(best, val);
                    alpha = max(alpha, best);

                    board[i][j] = ' ';

                    // Alpha Beta Pruning
                    if (beta <= alpha)
                        break;
                }
            }
        }
        return best;
    }

    else
    {
        int best = 1000;

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {

                if (board[i][j] == ' ')
                {
                    board[i][j] = playerMark;

                    int val = minimax(board, depth+10, !isMax, alpha, beta);
                    best = min(best, val);
                    beta = min(beta, best);

                    board[i][j] = ' ';

                    // Alpha Beta Pruning
                    if (beta <= alpha)
                        break;
                }
            }
        }
        return best;
    }
}

}

不确定评估函数,正在寻找基于极小极大和动态标记的良好评估函数。

c++ artificial-intelligence minimax alpha-beta-pruning
1个回答
0
投票

你可以尝试类似的事情:

int evaluate() {
    int xScore = 0, oScore = 0;

    // Evaluate the score for 'X' and 'O' separately
    xScore += evaluateMark('X');
    oScore += evaluateMark('O');

    // Deduct points if the opponent has a winning opportunity
    // This could be adjusted based on the strategic preference of blocking over winning
    if (playerCanWinNext('X')) xScore -= 50;
    if (playerCanWinNext('O')) oScore -= 50;

    // The final score is a combination of both 'X' and 'O' evaluations
    // This could be weighted if you want the AI to prefer one mark over the other
    return xScore + oScore;
}
© www.soinside.com 2019 - 2024. All rights reserved.