Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 极小极大函数给了我错误的结果_Java_Tic Tac Toe_Minimax - Fatal编程技术网

Java 极小极大函数给了我错误的结果

Java 极小极大函数给了我错误的结果,java,tic-tac-toe,minimax,Java,Tic Tac Toe,Minimax,我一直在尝试为“进化”的tic-tac-toe(9x9)编写一个miniMax算法。然而,似乎每当我调用这个算法时,它都会在mini部分崩溃。getAvailableMoves函数为每个移动分配一个“分数”。如果给第一名球员带来优势,分数会更高。如果我采取第一步似乎有些效果,但是,如果我是Mini(第二个采取行动的人),它总是会采取第一步。我一直在试图找出我做错了什么,但我看不出问题所在。有人有什么想法吗 public Move mini( Field field, int depth, int

我一直在尝试为“进化”的tic-tac-toe(9x9)编写一个miniMax算法。然而,似乎每当我调用这个算法时,它都会在mini部分崩溃。getAvailableMoves函数为每个移动分配一个“分数”。如果给第一名球员带来优势,分数会更高。如果我采取第一步似乎有些效果,但是,如果我是Mini(第二个采取行动的人),它总是会采取第一步。我一直在试图找出我做错了什么,但我看不出问题所在。有人有什么想法吗

public Move mini( Field field, int depth, int player )
    {
        if( depth == 0 || field.isFull() )
        {
            ArrayList<Move> moves = field.getAvailableMoves(-player);
            if( moves.isEmpty() ) return null;
            int miniProfit = moves.get(0).getBenefit(), index = 0;
            for( int i = 1 ; i < moves.size() ; i++ )
            {
                if( miniProfit < moves.get(i).getBenefit() )
                {
                    miniProfit = moves.get(i).getBenefit();
                    index = i;
                }
            }
            moves.get(index).benefit = - moves.get(index).benefit;
            return moves.get(index);
        }
        ArrayList<Move> moves = field.getAvailableMoves(player);
        Move miniMove = new Move();
        miniMove.benefit = Move.Inf;
        for( Move move : moves )
        {
            field.applyMove(move, player);
            Move move2 = maxi( field, depth - 1, -player );
            if( move2 == null ) continue;
            int mini = move2.getBenefit();
            if( mini <= miniMove.benefit )
            {
                miniMove = move;
            }
            field.unapplyMove(move, player);    
        }
        return miniMove;
    }

    public Move maxi( Field field, int depth, int player )
    {
        if( depth == 0 || field.isFull() )
        {
            ArrayList<Move> moves = field.getAvailableMoves(player);
            if( moves.isEmpty() ) return null;
            int maxiProfit = moves.get(0).getBenefit(), index = 0;
            for( int i = 1 ; i < moves.size() ; i++ )
            {
                if( maxiProfit < moves.get(i).getBenefit() )
                {
                    maxiProfit = moves.get(i).getBenefit();
                    index = i;
                }
            }
            return moves.get(index);
        }
        ArrayList<Move> moves = field.getAvailableMoves(player);
        Move maxiMove = new Move();
        maxiMove.benefit = 0 - Move.Inf;
        for( Move move : moves )
        {
            field.applyMove(move, player);
            Move move2 = mini( field, depth - 1 , -player );
            if( move2 == null ) continue;
            int maxi = move2.getBenefit();
            if( maxi >= maxiMove.benefit )
            {
                maxiMove = move;
            }
            field.unapplyMove(move, player);    
        }
        return maxiMove;
    }

    public Move makeTurn(Field field) {
            int depth = 5;
            if( myId == 1 )
            {
                return maxi(field, depth, 1);
            }
            else
            {
                return mini(field, depth, -1);
            }
        }
public Move mini(场域、整数深度、整数播放器)
{
if(depth==0 | | field.isFull())
{
ArrayList moves=field.getAvailableMoves(-player);
if(moves.isEmpty())返回null;
int miniProfit=moves.get(0.getBenefit(),index=0;
对于(int i=1;i
“它在小部件上崩溃”-像崩溃一样的“抛出异常”或像崩溃一样的“未交付预期结果”?测试时您的输入是什么?不提供预期结果(它总是计算为第一个移动不完整。关键部分是getAvailableMoves(),它如何分配给-player?“它在小部分上崩溃”-类似崩溃的“抛出异常”或类似崩溃的“未提供预期结果”?测试时您的输入是什么?没有提供预期的结果(它总是计算为第一个移动不完整。关键部分是getAvailableMoves(),它如何分配给-player?