1

我正在用 C++ 制作一个国际象棋引擎,使用这个算法,我得到预期的最大深度设置为 1 的游戏。然而,除此之外,它忽略了处于危险中的棋子,甚至似乎愿意将自己置于危险之中。

这是我的代码:

int negamax(int depth, int alpha, int beta)
{
    int max = -INFINITY;

    MoveList legalMoves;
    MoveGeneration::generateCaptureMoves(&legalMoves);
    MoveGeneration::generateQuietMoves(&legalMoves);

    // No legal moves
    if(legalMoves.count == 0)
    {
        if(Position::isCheck())
        {
            // Checkmate
            if(Position::activeColor == WHITE)
                return VAL_VICTORY;
            else
                return -VAL_VICTORY;
        }
        else
        {
            // Stalemate
            return 0;
        }
    }

    // Go through legal moves
    for(int i = 0; i < legalMoves.count; i++)
    {
        // Get move score
        Position::doMove(legalMoves[i]);

        int score;
        if(depth == 0)
            score = quiescence(MAX_QUIESCENCE_DEPTH, alpha, beta);
        else
            score = -negamax(depth - 1, alpha, beta);

        Position::undoMove();

        // Pruning
        if(Position::activeColor == WHITE && score > beta) break;
        if(Position::activeColor == BLACK && score < alpha) break;

        if(Position::activeColor == WHITE && score > alpha) alpha = score;
        if(Position::activeColor == BLACK && score < beta) beta = score;

        // Best so far?
        if(score > max)
        {
            max = score;

            if(depth == MAX_DEPTH)
                bestMove = legalMoves[i];
        }
    }
    return max;
}
4

1 回答 1

1

尝试:

score = -negamax(depth - 1, -beta, -alpha);
于 2014-03-28T01:23:58.553 回答