当玩家可以连续移动两次时,搜索执行不起作用

我正在尝试使用Negamax在Java中搜索名为Nine Men's Morris的游戏。

如果一个玩家连续有三个棋子(这里称为磨坊),他在切换转牌圈之前移除一个对手的棋子('额外'移动)。

此外,在所有最初的棋子被放置之后,还有一个棋子阶段和一个棋子阶段。

我的实现如下所示:

public int[] negamaxSet(int depth, int alpha, int beta, int color) {
    if (depth == 0 || board.isGameOver()) {
        return new int[] { color *  evaluateBoard(color};
    }

    int stonesSet = color == -1 ? board.blackStonesSet : board.whiteStonesSet;
    // set piece phase
    if (stonesSet < Game.initialPieces) {
        List<Piece> moves = board.getEmpty();

        int bestValue = Integer.MIN_VALUE;
        int bestMoveX = -1;
        int bestMoveY = -1;

        for (Piece piece : moves) {
            Piece move = new Piece(color, piece.x, piece.y);
            board.setPiece(move);

            int value[] = null;

            //Player made Mill, move again
            if(board.checkMill(move)){
                value = negamaxRemove(depth - 1, alpha, beta, color);               
            }
            //normal move, switch turn
            else {
                value = negamaxSet(depth - 1, -beta, -alpha, -color);
                value[0] = -value[0];
            }
            if (value[0] > bestValue) {
                bestValue = value[0];
                bestMoveX = move.x;
                bestMoveY = move.y;
            }
            if (value[0] > alpha) {
                alpha = value[0];
            }

            board.revertLastMove();

    //      if (alpha >= beta)
    //          break;
        }
        return new int[] { bestValue, bestMoveX, bestMoveY };
    } else {

        //move phase

        List<Piece>  moves = board.getPiecesByColor(color); 

        int bestValue = Integer.MIN_VALUE;
        int bestMoveX = -1;
        int bestMoveY = -1;
        int bestMoveX2 = -1;
        int bestMoveY2 = -1;

        for (Piece piece : moves) {

            List<Piece> adjPieces = board.getAdjacentEmtpy(piece);
            for(Piece adjPiece : adjPieces){

                Piece newFrom = new Piece(color, piece.x, piece.y);
                Piece newTo = new Piece(color, adjPiece.x, adjPiece.y);

                board.movePiece(newFrom, newTo);

                int[] value = null;

                //Player made Mill, move again

                if(board.checkMill(newTo, false)){
                    value = negamaxRemove(depth - 1, alpha, beta, color);

                } else {
                    value = negamaxSet(depth - 1, -beta, -alpha, -color);
                    value[0] = -value[0];
                }

                if (value[0] > bestValue) {
                    bestValue = value[0];
                    bestMoveX = newFrom.x;
                    bestMoveY = newFrom.y;
                    bestMoveX2 = newTo.x;
                    bestMoveY2 = newTo.y;
                }
                if (value[0] > alpha) {
                    alpha = value[0];
                }

                board.revertLastMove();

    //          if (alpha >= beta)
    //              break;

            }


        }
        return new int[] { bestValue, bestMoveX, bestMoveY, bestMoveX2, bestMoveY2 };       
    }
}

最好不要改变基本的Negamax算法,并封装设置一块石头并在一次操作中移动一块石头,以便在算法本身中不区分这两者,但从我的理解来看,它仍然应该像这样工作。

函数negamaxRemove与negamaxSet基本相同,但没有检查磨机(不可能)并寻找要移除的部分。

使用与调用函数相同的参数调用negamaxRemove并且不切换符号(从而再次最大化)是否正确?

AI玩家不会阻止对手形成一个磨坊(如果可能的话,他自己组成一个)。

算法是否正确,我应该在代码的其他地方查找错误? 还是我误解了Negamax应该如何工作? (我注释掉alpha-beta修剪,所以错误地设置alpha或beta在这里没有什么区别)

我真的很感激一些指针!


我已经实现了这个游戏。 将您的移动定义从“执行操作,授予另一个操作”更改为“执行多部分操作”。 然后,您不必进行2次“移动”,您只需完成如下所示的移动from: 3, to: 0, remove: 17from: 3, to: 0, remove 19等。对于不移除的移动一块,你只需将删除设置为-1

链接地址: http://www.djcxy.com/p/9643.html

上一篇: search implementation not working when player can move twice in a row

下一篇: C++ Negamax alpha