// basic Alpha-Beta search;
move bestmove;
int alphabeta(int depth, int alpha, int beta, bool isMyTurn) ...{
if (gameOver || depth == 0) ...{
return evaluation();
}
generateLegalMoves();
// you may change the search order to make the search faster
for (each move m) ...{
do move m;
score = -alphabeta(depth - 1, -beta, -alpha, ! isMyTurn );
if (score > alpha) ...{
alpha = score;
if(at the Level 1)
bestmove = m;
}
undo move-m;
if (alpha >= beta) ...{
break;
}
}
return alpha;
}
Initial call : alphabeta(depth, - infinite, infinite, isMyTurn);
不理解上面的代碼的話,看看下面的極小極大搜尋
極小極大搜尋
//極大搜尋
int Max(int depth)
...{
int best = -INFINITY;
if (depth == 0)
...{
return evaluation();
}
generateLegalMoves();
for (each move m) ...{
...{
do move m;
val = Min(depth - 1); // call the Min search
undo move m;
if (val > best)
...{
best = val;
}
}
return best;
}
int Min(int depth) // Min search
...{
int best = INFINITY;
if (depth <= 0)
...{
return evaluation();
}
GenerateLegalMoves();
for (each move m) ...{
do move m;
val = Max(depth - 1); // call the Max search
undo move m;
if (val < best)
...{
best = val;
}
}
return best;
}
負極大搜尋
極小極大搜尋可以統一用負極大搜尋代替
int NegaMax(int depth)
...{
int best = -INFINITY;
if (depth == 0)
...{
return evaluation();
}
GenerateLegalMoves();
for (each move m) ...{
do move m;
val = - NegaMax(depth - 1);
undo move m;
if (val > best)
...{
best = val;
}
}
return best;
}