java - 极小极大问题——连接四个。

标签 java algorithm minimax

我正在努力进行 minimax 练习,我只是想用它连接四个 ai。我的仅在深入探索一个节点时有效,但我无法弄清楚为什么一旦深入就会搞砸。

private int minimax(Gameboard gameBoard, int alpha, int depth, char color) {
    Gameboard gb = new Gameboard(gameBoard);
    int value = 0;
    int bestChoice = 0;
    int bestValue = alpha;
    // determine which use the value is for
    if (gb.computerColor == color) {
        value = 1;
    } else {
        value = -1;
    }
    if (gb.CheckForWinner(gb.lastSpacePlayed)) {
        if(gb.winner == gb.computerColor){
            bestValue = (1000000000 - depth);
        }else{
            bestValue = (-1000000000 - depth);
        }

    }

    // get the bestValue at our maximum recrusion depth
    else if (depth == maxDepth) {
        int moveWeight = (threatLevel(gb, color));
        if (moveWeight != 0) {
            bestValue = value * (moveWeight - depth);
        } else {
            bestValue = moveWeight;
        }
    } else {
        // Generate moves for each col and find the best score from each of
        // the generated moves.
        for (int c = 0; c < 7; c++) {
            Gameboard game = new Gameboard(gb);
            int selectedPlace = game.PlacePiece(c, color);

            // Recursive call the generated game grid and compare the
            // current value to move value
            // If move is higher, make it the new current value.

            if (selectedPlace != -1) {
                char tempColor;
                // change the user for the child node after a piece is played
                if (color == 'Y') {
                    tempColor = 'R';
                } else {
                    tempColor = 'Y';
                }
                // call the function so we can explore to maximum depth
                if (depth < maxDepth) {
                    int v = minimax(new Gameboard(game), -1000000, depth + 1, tempColor);
                    if (v > bestValue) {
                        bestChoice = c;
                        bestValue = v;
                    }
                    System.out.println(v);
                }
            }
        }
    }
    if (depth == 0) {
        if (threatLevel(gb, gb.lastSpacePlayed.getColor()) == 0) {
            return gb.spaces.get(0).get(3).getColor() == gb.playerColor ? 2
                    : 3;
        } else {
            return bestChoice;
        }
    } else {
        return bestValue;
    }

}

我是这样开始的 return minimax(gameBoard, -1000000, 0, gameBoard.computerColor);

我的理解是遍历所有子节点并返回一个值,如果节点与父节点相同,则返回最大值,如果节点不同,则返回最小值。任何方向将不胜感激。

最佳答案

private int minimax(Gameboard gameBoard, int depth, char color) {
    Gameboard gb = new Gameboard(gameBoard);
    int bestChoice = 0;
    int bestValue = 0;

    //If we've won, return highest possible value. If we've lost, return lowest.
    if (gb.CheckForWinner(gb.lastSpacePlayed)) {
        if(gb.winner == color){
            return Integer.MAX_VALUE
        }else{
            return Integer.MIN_VALUE
        }

    }
    //if we hit maximum depth, resort to our heuristic method.
    else if (depth == maxDepth) {
        return threatLevel(gb, color);
    } else {
        // Generate moves for each col and find the best score from each of
        // the generated moves. Keep track of the worst one.
        int worstBestResponse = Integer.MAX_INT
        boolean tie = true;
        for (int c = 0; c < 7; c++) {
            Gameboard game = new Gameboard(gb);
            int selectedPlace = game.PlacePiece(c, color);

            // Recursive call the generated game grid and compare the
            // current value to move value
            // If move is higher, make it the new current value.

            if (selectedPlace != -1) {
                tie = false;
                char tempColor;
                // change the user for the child node after a piece is played
                if (color == 'Y') {
                    tempColor = 'R';
                } else {
                    tempColor = 'Y';
                }
                // call the function so we can explore to maximum depth
                if (depth < maxDepth) {
                    int v = minimax(new Gameboard(game), depth + 1, tempColor);
                    if (v < worstBestResponse) {
                        worstBestResponse = v;
                    }
                }
            }
        }

        if(tie) {
            //if game is a tie, we return 0, to show no favour.
            return 0;
        } else {
            //After determining the value of the opponents best response, we return the negative value of it. That is, what's bad for them is good for us and visa versa.
            return -worstBestResponse;
        }
    }
}

我相信这样的东西更符合您的需求。这是假设 threatLevel 是一种启发式方法,用于大致确定谁在给定游戏中获胜。

我已经删除了该方法可能拥有的关于它支持谁的任何信息。它应该只支持“颜色”是谁。我还清理了任意大的整数以显示输赢。 MAX_VALUE 和 MIN_VALUE 更优雅。

无论如何,试试这个,并用深度为 0 调用它。如果您有任何问题,请告诉我

关于java - 极小极大问题——连接四个。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007906/

相关文章:

java - 发出 JMX 通知的最佳实践

c# - 比较不同对象但具有相同字段的 2 个列表

Python:ValueError:需要超过 0 个值才能解包 - 国际象棋的 Negamax 算法

java - 剪枝算法

java - 添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的 native 库

java - NoClassDefFoundError 只有一些设备,只能来自 playstore?这甚至可能吗?

c++ - 文本相似度算法/库

language-agnostic - 极小极大算法

java BufferedReader 回滚到上一行

algorithm - 寻找二叉树最大深度时的最坏情况