/// <summary> /// 静态(Quiescence)搜索过程 /// </summary> /// <param name="alpha"></param> /// <param name="beta"></param> /// <returns></returns> public int SearchQuiesc(int alpha, int beta) { //静态搜索分为以下几个阶段 //1.检查重复局面 int value = situation.RepStatus(); if (value != 0) { return(situation.RepValue(value)); } //2.到达极限深度就返回局面评价 if (situation.Distance == LIMIT_DEPTH) { return(situation.Evaluate()); } //3.初始化最佳值 int bestValue = -ChessLogic.MATE_VALUE; //这样可以知道,是否一个走法都没走过(杀棋) int[] mvs = new int[ChessLogic.MAX_GENERATE_MOVES]; int genMoves = 0; if (situation.InCheck()) { //4.如果被将军,则生成全部走法 genMoves = situation.GenerateMoves(out mvs); System.Array.Sort(mvs, 0, genMoves, new HistoryCompare(historyTable)); } else { //5.如果不被将军,先做局面评价 value = situation.Evaluate(); if (value > bestValue) { bestValue = value; if (value >= beta) { return(value); } if (value > alpha) { alpha = value; } } //6.如果局面评价没有截断,再生成吃子走法 genMoves = situation.GenerateMoves(out mvs, GEN_CAPTURE); System.Array.Sort(mvs, 0, genMoves, new MvvLvaCompare(this)); } //7.逐一走这些走法,并进行递归 for (int i = 0; i < genMoves; i++) { if (situation.MakeMove(mvs[i])) { value = -SearchQuiesc(-beta, -alpha); situation.UndoMakeMove(); //8.进行Alpha-Beta大小判断和截断 if (value > bestValue) //找到最佳值(但不能确定是Alpha、PV还是beta走法) { bestValue = value; //bestValue是目前要返回的最佳值,可能超出Alpha-Beta边界 if (value >= beta) //找到一个Beta走法 { return(value); //Beta截断 } if (value > alpha) //找到一个PV走法 { alpha = value; //缩小Alpha-Beta边界 } } } } //9.所有走法都搜索完了,返回最佳值 return(bestValue == -ChessLogic.MATE_VALUE ? situation.Distance - ChessLogic.MATE_VALUE : bestValue); }