Java minimax鲍鱼实现

时间:2014-04-22 16:45:41

标签: java minimax

我想在我的鲍鱼游戏中实现Minimax,但我不知道该怎么做。 确切地说,我不知道算法何时需要最大化或最小化玩家。 如果我理解了逻辑,我需要缩小玩家并最大化AI?

这是维基百科的伪代码

    function minimax(node, depth, maximizingPlayer)
    if depth = 0 or node is a terminal node
        return the heuristic value of node
    if maximizingPlayer
        bestValue := -∞
        for each child of node
            val := minimax(child, depth - 1, FALSE))
            bestValue := max(bestValue, val);
        return bestValue
    else
        bestValue := +∞
        for each child of node
            val := minimax(child, depth - 1, TRUE))
            bestValue := min(bestValue, val);
        return bestValue

(* Initial call for maximizing player *)
minimax(origin, depth, TRUE)

我的实施

private Integer minimax(Board board, Integer depth, Color current, Boolean maximizingPlayer) {
    Integer bestValue;
    if (0 == depth)
        return ((current == selfColor) ? 1 : -1) * this.evaluateBoard(board, current);

    Integer val;
    if (maximizingPlayer) {
        bestValue = -INF;
        for (Move m : board.getPossibleMoves(current)) {
            board.apply(m);
            val = minimax(board, depth - 1, current, Boolean.FALSE);
            bestValue = Math.max(bestValue, val);
            board.revert(m);
        }
        return bestValue;
    } else {
        bestValue = INF;
        for (Move m : board.getPossibleMoves(current)) {
            board.apply(m);
            val = minimax(board, depth - 1, current, Boolean.TRUE);
            bestValue = Math.min(bestValue, val);
            board.revert(m);
        }
        return bestValue;
    }
}

我的评估功能

private Integer evaluateBoard(Board board, Color player) {
    return board.ballsCount(player) - board.ballsCount(player.other());
}

3 个答案:

答案 0 :(得分:1)

这取决于您的评估功能;在你的情况下,假设目标是在棋盘上拥有比对手更多的球,则玩家将最大化&人工智能将最小化。

答案 1 :(得分:0)

2场比赛中的常用方法是始终最大化,但否定价值 因为它被传递给父母。

答案 2 :(得分:0)

您的评估功能对于minimax搜索不是很有用,因为它对于游戏的大多数动作都是恒定的。鲍鱼的举动远没有象棋那么引人注目。尝试使用所有玩家弹珠之间的距离之和。此功能使minimax可以使用。

您还需要确保selfColor是在首次调用minimax时要移动的播放器的颜色。

还可以编写递归结束

if (0 == depth)
        return this.evaluateBoard(board, selfColor);

超出问题范围,但可能与您有关:我发现negamax更易于使用。