连接 4 个代码与最小最大值查找独特的问题



我正在寻找解决Connect 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 在完美玩时获胜)。 您可以在Connect-Four的基于知识的方法中阅读有关解决方案如何完成的所有信息。 这是一本非常引人入胜的读物,因为他们是在计算资源更难获得的时候这样做的。

一般的想法是建立一个包含已知值位置的巨大数据库,然后使用 alpha-beta 修剪进行 min-max,直到您到达数据库中的其中一个位置。 由于当时的计算和存储资源,构建这个数据库很困难,但今天你可能可以用更少的努力实现类似的东西。

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

最新更新