private Move FindBestMove(MoveSearchHelper moveSearch) { var tempSearch = moveSearch; var search = moveSearch; while (tempSearch.father != null) { search = tempSearch; tempSearch = tempSearch.father; } return(search.move); }
/// <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)); }
/// <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)); }
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); }