0

我有一个棋盘游戏,目前使用 Negamax 实现 AI 来搜索位置。开始新搜索时,我将棋盘对象传递给类并复制它。副本是类中的私有变量。我这样做是因为 java 不通过引用传递对象(正如我最近了解到的那样)。

在搜索类中,我有 2 个功能:

  1. NegamaxRoot 这是根。我得到初始移动,移动,调用递归 negamax 函数 (2),然后撤消移动。

  2. NegamaxRecur 这个函数是主要的递归函数。在这里,我得到(同一个棋盘副本的)移动,移动,递归调用自身,然后撤消移动。

这个过程基本上不起作用,因为在单步调试器中,我注意到在执行移动/撤消时对象变量不同步。

撤消是否也需要在递归函数中调用?

这是 negamax 类:

public class Negamax
{
    private IBoard board;

    public Negamax() {}

    public Move NegamaxRoot(IBoard board, int depth)
    {
        this.board = board.copy();

        int alpha = -999999999, beta = 999999999;
        int val = 0;

        //The move that will be returned
        Move bestMove = null;      
        List<Move> moves = this.board.getMoves();

        for (Move move : moves)
        {
            //IBoard newBoard = board.copy();

            //Make the move
            this.board.make(move, true);
                val = -negamaxRecur(depth - 1, -beta, -alpha);

            //Undo the move
            this.board.undo(move);

            //Keep best move
            if (val > alpha)
            {
                alpha = val;
                bestMove = move;
            }
        }

        //Return the move
        return bestMove;
    }

    private int negamaxRecur(int depth, int alpha, int beta)
    {
        if (depth == 0 || this.board.getWon() != 0)
            return this.board.getScore();

        int val;

        List<Move> moves = this.board.getMoves();
        for (Move move : moves)
        {
            //Make the move
            this.board.make(move, true);
                val = -negamaxRecur(depth - 1, -beta, -alpha);
            this.board.undo(move);

            //Alpha-Beta pruning
            if (val > alpha)
                alpha = val;

            if (alpha >= beta)
                return alpha;
        }

        return alpha;
    }
}
4

0 回答 0