Пример #1
0
        private Move FindBestMove(MoveSearchHelper moveSearch)
        {
            var tempSearch = moveSearch;
            var search     = moveSearch;

            while (tempSearch.father != null)
            {
                search     = tempSearch;
                tempSearch = tempSearch.father;
            }
            return(search.move);
        }
Пример #2
0
        /// <summary>
        /// 困难AI
        /// </summary>
        /// <param name="color">AI的颜色</param>
        /// <returns></returns>
        public Move GetHardNextMove(int color)
        {
            int otherColor = 1 - color;                     //玩家的颜色
            int depth      = 4;                             //搜索树的深度

            MoveSearchHelper root = new MoveSearchHelper(); //根节点

            root.board     = App.ChessLogic.CopyBoard();    //原始盘面
            root.nextColor = color;
            var alpha      = -9999;
            var beta       = 9999;
            var bestSearch = SearchBestMove(depth, alpha, beta, root, true);

            return(FindBestMove(bestSearch));
        }
Пример #3
0
        /// <summary>
        /// 中等AI
        /// </summary>
        /// <param name="color">AI的颜色</param>
        /// <returns></returns>
        public Move GetNormalNextMove(int color)
        {
            int otherColor = 1 - color; //玩家的颜色
            int depth      = 2;         //搜索树的深度
            var moves      = App.ChessLogic.GetAllMoves(color);

            if (moves.Count == 0)
            {
                return(null);
            }
            MoveSearchHelper root = new MoveSearchHelper(); //根节点

            root.board     = App.ChessLogic.CopyBoard();    //原始盘面
            root.nextColor = color;
            var alpha      = -9999;
            var beta       = 9999;
            var bestSearch = SearchBestMove(depth, alpha, beta, root, true);

            return(FindBestMove(bestSearch));
        }
Пример #4
0
        private MoveSearchHelper SearchBestMove(int depth, double alpha, double beta, MoveSearchHelper root, bool isEval = false)
        {
            if (depth == 0)
            {
                root.value = CalBoardStaticValue(root.nextColor, root.board, isEval);
                return(root);
            }

            var moves     = App.ChessLogic.GetBoardAllMoves(root.board, root.nextColor);//可走位置
            var nextColor = 1 - root.nextColor;

            var bestSearch = new MoveSearchHelper();

            bestSearch.value = -9999;
            bestSearch.move  = null;
            //白色取最小值
            if (root.nextColor == 0)
            {
                foreach (var move in moves)
                {
                    var nextLeaf  = new MoveSearchHelper();
                    var nextBoard = GetBoardAfterMove(move, root.board);//移动完的盘面
                    nextLeaf.board     = nextBoard;
                    nextLeaf.nextColor = nextColor;
                    nextLeaf.move      = move;
                    nextLeaf.father    = root;

                    var moveSearch = SearchBestMove(depth - 1, alpha, beta, nextLeaf, true);
                    if (bestSearch.move == null)
                    {
                        bestSearch = moveSearch;
                    }
                    if (moveSearch.value < bestSearch.value)
                    {
                        bestSearch = moveSearch;
                    }
                    //else if(moveSearch.value == bestSearch.value)
                    //{
                    //    //如果相等 而且不为空 随机选一个
                    //    System.Random ran = new System.Random();
                    //    int key = ran.Next(0, 10);
                    //    Debug.Log("White Key:============" + key);
                    //    if (key > 5)
                    //    {
                    //        bestSearch = moveSearch;
                    //    }
                    //}

                    //beta = bestSearch.value;
                    //if (beta <= alpha)
                    //{
                    //    return bestSearch;
                    //}
                }
            }
            //黑色取最大值
            else if (root.nextColor == 1)
            {
                foreach (var move in moves)
                {
                    var nextLeaf  = new MoveSearchHelper();
                    var nextBoard = GetBoardAfterMove(move, root.board);//移动完的盘面
                    nextLeaf.board     = nextBoard;
                    nextLeaf.nextColor = nextColor;
                    nextLeaf.move      = move;
                    nextLeaf.father    = root;

                    var moveSearch = SearchBestMove(depth - 1, alpha, beta, nextLeaf, true);
                    if (bestSearch.move == null)
                    {
                        bestSearch = moveSearch;
                    }
                    if (moveSearch.value > bestSearch.value)
                    {
                        bestSearch = moveSearch;
                    }
                    //else if (moveSearch.value == bestSearch.value)
                    //{
                    //    //如果相等 而且不为空 随机选一个
                    //    System.Random ran = new System.Random();
                    //    int key = ran.Next(0, 10);
                    //    Debug.Log("Key:============" + key);
                    //    if (key > 5)
                    //    {
                    //        bestSearch = moveSearch;
                    //    }
                    //}
                    //alpha = bestSearch.value;
                    //if (beta <= alpha)
                    //{
                    //    return bestSearch;
                    //}
                }
            }
            return(bestSearch);
        }