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