我使用minmax AI在Java中创建了简单的Checkers游戏,但我无法工作。我使用minmax的递归版本,但它一定有问题,因为它返回的移动不是最好的,但可能首先生成。
public int minmax(int [][] board, int depth, int curPlayer){
ArrayList<Move> moves = findMoves(curPlayer, board);
if (depth == 0 || moves.size() == 0){
return heurValue(curPlayer, board);
}
int bestVal = 0;
if (curPlayer == GameCore.BLACK){
bestVal = Integer.MIN_VALUE;
curPlayer = GameCore.RED;
}else{
bestVal = Integer.MAX_VALUE;
curPlayer = GameCore.BLACK;
}
for(int i = 0; i<moves.size(); i++){
Move m = moves.get(i);
int [][] boardNew = makeMove(m, board);
int value = minmax(boardNew, depth-1, curPlayer);
board = undoMove(m, boardNew);
// computer plays as black
if (curPlayer == GameCore.BLACK){
if (value < bestVal){
bestMove = m;
bestVal = value;
}
}else{
if (value >= bestVal){
bestMove = m;
bestVal = value;
}
}
}
return bestVal;
}
如果我使用depth = 1调用minmax,它应该“返回7个值(有7个可能的移动),但如果我从2,4移动到3,3只返回1 ...但是当我尝试调试时它,ArrayList移动的大小正确。所以我不知道它有什么问题。:(
编辑: 通过“返回”我错误地意味着第一个条件(当深度为0或移动为空时)仅发生一次,但如果它是正确的,它应该发生7次。抱歉我的英文不好。
你知道一些网站,minmax的正确递归伪代码在哪里(更好的alpha / beta,因为我需要扩展它)或者你能帮我解决这个问题吗?它一定是小事。 谢谢!
答案 0 :(得分:0)
你写的只是返回最佳值,即return bestVal;
如果你想让它们全部归还,请将它们存储在某种List
中并相应地更改方法签名。 / p>
答案 1 :(得分:0)
编辑:所以这不是我最初想到的签名问题。
我已经快速搜索了MinMax algorythm,这就是我找到的an article
从这个页面来看,我认为很重要的是:
此处的值表示移动的好坏程度。因此MAX播放器将尝试最终选择具有最高值的移动。
因此,如果我很严格,MinMax将仅返回一个移动,即bestValue
移动。