我正在尝试实现 negamax 算法,这就是我认为应该的方式:
public Move getBestMove(Board board){
List<Move> possibleMoves = board.getPossibleMoves();
Move optimalMove;
int maxScore;
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
int score = negamax(newBoard, DEPTH, Integer.MAX, Integer.MIN, 1);
if (score > maxScore){
optimalMove = move;
maxScore = score;
}
}
}
以及对应的negamax函数
public int negamax(Board board, int depth, int alpha, int beta, int sign){
if(depth == null || board.getPossibleMovesNumber(colour) == 0){
return calculateBoardFunction(board);
}
else{
List<Move> possibleMoves = board.getPossibleMoves();
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
alpha = Math.max(alpha, -negamax(newBoard, depth-1, -beta, -alpha, -sign);
if(alpha >= beta){
break;
}
}
return alpha;
}
是的,我知道它没有编译,但我只是想对其进行一些伪编码。
编辑
calculateBoardFunction(Board board) 将始终评估棋盘的最佳移动计算颜色。
另外,我试图让它通用,所以它对每场比赛(国际象棋,黑白棋,围棋)等都一样......(但这不是问题的一部分)
我还以维基百科的 negamax 伪代码为例。但是使用我>>认为<<我可以使用正确的启发式值很好地创建游戏树的代码。但我在getBestMove
函数中有代码的原因是要弄清楚什么动作实际上是最好的。
但我不确定我是否能做到这一点。