Exemple #1
0
    /// <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);
    }