将 4 个代码与 min max 连接起来,找到独特的问题

Connect 4 code with min max find uniqe problem

我正在寻找解决连接 4 的方法,现在尝试使用深度为 6 的最小最大值,它不起作用并保持相同的列(第一个)。

我很绝望,所以如果你能找到错误,我会很高兴。

public int findBestMove() {

        ArrayList<ArrayList<Integer>> myMoves = new ArrayList<ArrayList<Integer>>();

        for (int i = 0; i < mWidth; i++) {
            if (isColumnAvailable(i)) {
            ArrayList<Integer> t = new ArrayList<>();
            t.add(i);
            t.add(MinMax(6, mBoard, false));
            myMoves.add(t);

        }
        }

        int maxMoveScore = -10000;
        int bestMove = 0;

        for (int i = 0; i < myMoves.size(); i++) {
            int score = myMoves.get(i).get(1);
            if (score > maxMoveScore) {
                maxMoveScore = tryit;
                bestMove = myMoves.get(i).get(0);

            }

        }

        return bestMove;
    }

    private int MinMax(int depth,int[][] board, boolean maximizingPlayer) {
        if (depth <= 0)
            return 0;

        int winner =checkForWin() ;
        if (winner == 2)
            return depth;
        if (winner == 1)
            return -depth;
        if (isBoardFull()) {
            return 0;
        }

        int bestValue;

        if (maximizingPlayer)
            bestValue = -1;
        else
            bestValue = 1;
        for (int i = 0; i < mWidth; i++) {
            if (!isColumnAvailable(i))
                continue;
            int v = MinMax(depth - 1, board, !maximizingPlayer);
            bestValue = maximizingPlayer ? Math.max(bestValue, v) : Math.min(bestValue, v);

        }

        return bestValue;

    }

2-是AI的编号
1- 是人类玩家
0- 为空

Connect 4 是一款已解决的游戏(剧透,玩家 1 在完美玩的情况下获胜)。您可以在 A Knowledge-based Approach of Connect-Four 中阅读有关解决方案如何完成的所有信息。这是一本非常有趣的读物,因为他们是在计算资源更难获得的时候这样做的。

总体思路是建立一个巨大的已知值位置数据库,然后使用 alpha-beta 剪枝进行 min-max 直到到达数据库中的一个位置。由于发生这种情况时的计算和存储资源,构建这个数据库很困难,但你今天可以用更少的努力实现类似的东西。

虽然这不能直接回答您的问题,但希望该参考资料是您开始研究的好地方,因为它包括对 connect 4 中许多常见情况的分析,您可以使用这些分析来帮助您改进评估函数。