最大最小搜索:
int MinMax(int depth)
{
if(SideToMove() == WHITE)
{
return Max(depth);//白方是"最大者"
}
else
{
return Min(depth);//黑方是"最小者"
}
}
int Max(int depth)
{
int best = -INFINITY;
if(depth <= 0)
{
return Evaluate();
}
GenerateLegalMoves();
while(MovesLeft())
{
MakeNextMove();
val = Min(depth-1);
UnmakeMove();
if(val > best)
{
best = val;
}
}
return best;
}
int Min(int depth)
{
int best = INFINITY;//区别与Max()
if(depth <= 0)
{
return Evaluate();
}
GenerateLegalMoves();
while(MovesLeft())
{
MakeNextMove();
val = Max(depth-1);
UnmakeMove();
if(val < best)
{
best = val;
}
}
return best;
}
改进的最大最小搜索:
int MaxMinSearch(int depth,int player_mode)
{
int best = INFINITY;
if(depth <= 0)
{
return evaluate();//评估函数
}
GenerateLegalMoves();//生成当前所有着法
while(MovesLeft())//遍历所有着法
{
MakeNextMove();//实施着法
val = -MaxMin(depth-1);//换位思考
UnmakeMove();//撤销着法
if(val > best)
{
best = val;
}
}
return best;
}
Alpha-Beta搜索:
int AlphaBeta(int depth,int alpha,int beta)
{
if(depth == 0)
{
return Evaluate();
}
GenerateLegalMoves();//生成所有着法
while(MovesLeft())//遍历所有着法
{
MakeNextMove();//实施着法
val = -AlphaBeta(depth-1,-beta,-alpha);//换位
UnmakeMove();//撤销着法
if(val >= beta)
{
return beta;
}
if(val > alpha)
{
alpha = val;
}
}
return alpha;
}