这个minimax算法有什么问题

xggvc2p6  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(286)

我不知道是什么问题。我一直在打印moveval,它打印0,并按水平顺序运行。
我一直在用google和youtube编辑一个修改代码的程序,但是,没有什么好结果

static class Move {
    int row, col;
}
private boolean equals(JButton a, JButton b, JButton c){
    return a.getText().equals(b.getText()) && b.getText().equals(c.getText()) && !a.getText().equals("");
}
private boolean isGameOver() {
    for (int i = 0; i < 3; i++) {
        if (equals(board[i][0], board[i][1], board[i][2])) {
            return true;
        }
    }
    for (int i = 0; i < 3; i++) {
        if (equals(board[0][i], board[1][i], board[2][i])) {
            return true;
        }
    }
    if (equals(board[0][0], board[1][1], board[2][2])) {
        return true;
    }
    else if (equals(board[2][0], board[1][1], board[0][2])) {
        return true;
    }
    int openSpots = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j].getText().equals("")) {
                openSpots++;
            }
        }
    }
    return openSpots == 0;
}
private int evaluate(JButton[][] b) {
    for (int row = 0; row < 3; row++)
    {
        if (b[row][0] == b[row][1] &&
                b[row][1] == b[row][2])
        {
            if (b[row][0].getText().equals(ai))
                return 20;
            else if (b[row][0].getText().equals(human))
                return -10;
        }
    }
    for (int col = 0; col < 3; col++)
    {
        if (b[0][col] == b[1][col] &&
                b[1][col] == b[2][col])
        {
            if (b[0][col].getText().equals(ai))
                return 20;

            else if (b[0][col].getText().equals(human))
                return -10;
        }
    }
    if (b[0][0] == b[1][1] && b[1][1] == b[2][2])
    {
        if (b[0][0].getText().equals(ai))
            return 20;
        else if (b[0][0].getText().equals(human))
            return -10;
    }
    if (b[0][2] == b[1][1] && b[1][1] == b[2][0])
    {
        if (b[0][2].getText().equals(ai))
            return 20;
        else if (b[0][2].getText().equals(human))
            return -10;
    }
    return 0;
}
private int minimax(JButton[][] position, int depth, boolean isMax) {
    if (isGameOver() || depth == 0){
        return evaluate(position);
    }

    else if (isMax)
    {
        int best = -1000000000;
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (position[i][j].getText().equals(""))
                {
                    position[i][j].setText(ai);
                    JButton[][] position1 = position;
                    best = Math.max(best, minimax(position1, depth - 1, false));
                    System.out.println(best);
                    position[i][j].setText("");
                }
            }
        }
        return best;
    }
    else
    {
        int best1 = 1000000000;
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (position[i][j].getText().equals(""))
                {
                    position[i][j].setText(human);
                    JButton[][] position1 = position;
                    best1 = Math.min(best1, minimax(position1, depth - 1, true));
                    position[i][j].setText("");
                }
            }
        }
        return best1;
    }
}
private void BestMove(JButton[][] board) {
    int bestVal = -1000000000;
    Move bestMove = new Move();
    bestMove.row = -1;
    bestMove.col = -1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (board[i][j].getText().equals(""))
            {
                board[i][j].setText(ai);
                int moveVal = minimax(board, 3, false);
                board[i][j].setText("");

                if (moveVal > bestVal)
                {
                    bestVal = moveVal;
                    bestMove.row = i;
                    bestMove.col = j;

                }  
            }
        }
    }
    board[bestMove.row][bestMove.col].setText(ai);
    playersTurn = true;
    CheckWinner();
}

任何想法&请帮助是需要过去3天我一直在调试我知道这段代码不是最好的事实上这段代码可能是最糟糕的你见过。
块引用

9vw9lbht

9vw9lbht1#

您只有3种可能的评估:
20,如果ai赢了
-如果人类赢了
0,在所有其他情况下
因为你只看4个回合(人工智能,人类,人工智能,人类),不可能找到一个获胜的位置,所以评价总是0。
你的minimax实现没有明显的问题,但是你的求值函数太简单了。
例如,您可以:
在创造一排2的位置上给更多的分数
在创建多行2的位置上打得更多点
对已经被封锁的职位给予较少的分数
然而,你能做的只有这么多。这场比赛显然是解决了,一个完美的球员总是可以得到一个平局玩任何一方。

相关问题