MinMax AI for Checkers

时间:2013-04-12 20:02:30

标签: java artificial-intelligence minimax

我使用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,因为我需要扩展它)或者你能帮我解决这个问题吗?它一定是小事。 谢谢!

2 个答案:

答案 0 :(得分:0)

你写的只是返回最佳值,即return bestVal;如果你想让它们全部归还,请将它们存储在某种List中并相应地更改方法签名。 / p>

答案 1 :(得分:0)

编辑:所以这不是我最初想到的签名问题。

我已经快速搜索了MinMax algorythm,这就是我找到的an article

从这个页面来看,我认为很重要的是:

  

此处的值表示移动的好坏程度。因此MAX播放器将尝试最终选择具有最高值的移动。

因此,如果我很严格,MinMax将仅返回一个移动,即bestValue移动。