用最小最大查找唯一问题连接4个代码

时间:2019-01-16 12:18:44

标签: java performance artificial-intelligence connect minmax

我正在寻找一种解决连接4的方法,现在尝试使用深度为6的min max进行操作,它无法正常工作,并保持结果相同的列(第一个)。

我非常绝望,如果您能找到错误,我将非常高兴。

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-为空

1 个答案:

答案 0 :(得分:0)

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

通常的想法是建立一个巨大的已知值头寸数据库,然后用alpha-beta修剪最小-最大值,直到达到数据库中的一个头寸。由于发生这种情况时需要大量的计算和存储资源,因此构建该数据库很困难,但是今天您可以轻松完成类似的事情。

尽管这不能直接回答您的问题,但希望该参考书将是您开始研究的好地方,因为它包括对Connect 4中许多常见情况的分析,可用于帮助您改善评估功能。