そこで、チェス ベースのパズル ゲームにミニマックス検索を実装しました。この場合、検索によって AI ピースの次の動きが決まります。
ミニマックス自体は正常に動作し、予想される動きを返しますが、アルファベータ剪定を実装すると、ミニマックスは各ターンごとに同じ 2 つの値を返します。たとえば、現在 (0,0) にある AI Rook は、ミニマックスから移動すると (1,0) を受け取り、次にミニマックスに移動を要求すると (0,0) を受け取ります。このループは、評価関数で何を変更しても発生します。
ゲームの状態は、ユーザーの位置、駒の位置、およびボード自体を表すタイルの配列で構成されます。ここでは、評価関数によって与えられたそれぞれの値で各タイルを格納するために、独自のノード クラス (実際にはペアと呼ばれる必要があります) を使用します。
アルファ ベータ プルーニングの実装方法に問題はありますか? どんなアドバイスでも大歓迎です。さらに情報が必要な場合は、お問い合わせください。できる限りの情報を提供します。
//Here is my call to the minimax
Min(depth, user, piece, new Node((int) (Double.NEGATIVE_INFINITY)), new Node((int) Double.POSITIVE_INFINITY), tiles));
Node Max(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
if(depth <= 0||gameOver(piece))
{
return new Node(evaluation(user,piece,tiles));
}
LinkedList<Tile> moves = user.getMoves(tiles,1);
for(Tile t:moves)
{
Tile temp= new Tile(user);
tiles= user.changePos(t,tiles);
Node val = Min(depth - 1, user, piece, alpha, beta, tiles);
val.addTile(t);
tiles= user.changePos(temp,tiles);
if(val.getValue()>=beta.getValue())
return beta;
if(val.getValue() >= alpha.getValue())
{
if(alpha.getTile()==null)
alpha = val;
else if(val.getValue()==alpha.getValue()){
if(r.nextInt(2)==1)//adds an element of randomness
alpha=val;
}
else
alpha=val;
}
}
return alpha;
}
Node Min(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
updateGoal(user);
if(depth <= 0||gameOver(piece))
{
return new Node(evaluation(user,piece,tiles));
}
LinkedList<Tile> moves = piece.getMoves(tiles,1);
for(Tile t:moves)
{
Tile temp= new Tile(piece);
tiles= piece.changePos(t,tiles);
Node val = Max(depth - 1, user, piece, alpha, beta,tiles);
val.addTile(t);
tiles= piece.changePos(temp,tiles);
if(val.getValue() <= alpha.getValue())
return alpha;
if(val.getValue() <= beta.getValue())
{
if(beta.getTile()==null)
beta = val;
else if(val.getValue()==beta.getValue()){
if(r.nextInt(2)==1)
beta=val;
}
else
beta=val;
}
}
return beta;
}