如何在 Java 中将 MinMax 算法与 Tic Tac Toe 一起使用?

问题描述

我一直在尝试用 Java 创建一个 Tic Tac Toe 游戏,并将 MinMax 算法用于 AI。我查看了互联网上的一些示例,但似乎无法找到我的错误所在。游戏正在运行,但 AI 根本玩得不好。 我有一组 JButton,当我与 AI 对战时,它应该始终选择最佳解决方案(为他自己)。 当玩家移动时,调用 moveAI()。他调用 minmaxBestMove(),它递归调用 minmax() 来找到当前的最佳移动。之后,调用 check() 以查看游戏是否结束。 (check() 的布尔值 minmax 参数用于在检查最佳移动 -minmax true- 或检查游戏是否应该结束 -minmax false- 之间切换)。

我确信有办法把它写得更好或更干净,但这是我目前想到的。 感谢您的帮助!

以下是我创建的方法

    private void moveAI()
    {
      
       int bestField = minimaxBestMove();
       buttons[bestField].setText("O");
       buttons[bestField].setForeground(Color.BLUE);
                
       switchToX();
       check(false,player1_turn);
       player1_turn = true;
    }
private int minimaxBestMove()
    {
        int best = -1000;
        int bestField=-1;
        for(int i=0; i<9; i++)
        {
            if(buttons[i].getText().equals(""))
            {
                buttons[i].setText("O");
                int moveVal = minimax(0,false);
                buttons[i].setText("");

                if(moveVal>best)
                {
                    best = moveVal;
                    bestField = i;
                }
            }
        }
        return bestField;
    }
private int minimax(int depth,boolean playerTurn){
        int score = check(true,playerTurn);

        if(score==10 || score==-10 || score==0)
            return score;

        if(playerTurn){
            int best = -1000;
            for(int i =0; i<9;i++)
            {
                if(buttons[i].getText().equals(""))
                {
                    buttons[i].setText("O");
                    best = Math.max(best,minimax(depth+1,false));

                    buttons[i].setText("");
                }
            }
            return best;
        }

        else{
            int best =1000;

            for(int i=0; i<9; i++)
            {
                if(buttons[i].getText().equals(""))
                {
                    buttons[i].setText("X");
                    best = Math.min(best,true));

                    buttons[i].setText("");
                }
            }
            return best;
        }
    }
public int check(boolean minimax,boolean playerTurn){

        for(int i=0; i<3; i++)
        {
            if(
                    ((buttons[3*i].getText().equals("X") || (buttons[3*i].getText().equals("O")))) &&
                            (buttons[3*i].getText().equals(buttons[1 + 3*i].getText())) &&
                            (buttons[1 + 3*i].getText().equals(buttons[2 + 3*i].getText()))
            ){
                if(!minimax)
                    win(3*i,1 + 3*i,2 + 3*i);
                if(playerTurn)
                    return 10;
                else
                    return -10;
            }
        }

        for(int i=0; i<3; i++)
        {
            if(
                    ((buttons[i].getText().equals("X") || (buttons[i].getText().equals("O")))) &&
                            (buttons[i].getText().equals(buttons[i+3].getText())) &&
                            (buttons[3+i].getText().equals(buttons[6 + i].getText()))
            ){
                if(!minimax)
                    win(i,3 + i,6 + i);
                if(playerTurn)
                    return 10;
                else
                    return -10;
            }
        }

        if(
                ((buttons[0].getText().equals("X") || (buttons[0].getText().equals("O")))) &&
                (buttons[0].getText().equals(buttons[4].getText())) &&
                        (buttons[4].getText().equals(buttons[8].getText()))
        ){
            if(!minimax)
                win(0,4,8);
            if(playerTurn)
                return 10;
            else
                return -10;
        }

        if(
                ((buttons[2].getText().equals("X") || (buttons[2].getText().equals("O")))) &&
                (buttons[2].getText().equals(buttons[4].getText())) &&
                        (buttons[4].getText().equals(buttons[6].getText()))
        ){
            if(!minimax)
                win(2,6);
            if(playerTurn)
                return 10;
            else
                return -10;
        }


        if (!isMoveLeft()) {
            if(!minimax)
                win(-1,-1,-1);
            return 0;
        }

        return -1;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)