private MapNodeDecisionTree BuildDecisionTree(MapNode head, int recurseLevel) { MapNodeDecisionTree decisionNode = new MapNodeDecisionTree(head); if (recurseLevel > 0) { foreach (MapNode neighbor in head.GetNeighbors().Distinct(new MapNodeColorComparer())) { MapNode headClone = head.Clone(); headClone.PickColor(neighbor.Color); //make the move MapNodeDecisionTree childNode = BuildDecisionTree(headClone, recurseLevel - 1); decisionNode.Children.Add(childNode); } } return(decisionNode); }
public override SuggestedMoves ChooseColor(Color[,] board) { MapNode head = MapBuilder.BuildMap(board); MapNodeDecisionTree decisionTree = BuildDecisionTree(head.Clone(), _lookAheadLevel); Stack <Color> currentDecisionTreePath = new Stack <Color>(); SurfaceAreaResult bestSurfaceArea = GetBest(decisionTree, new SurfaceAreaResult { SurfaceArea = 0, Path = new Color[0] }, currentDecisionTreePath); //convert the result to SuggestedMove SuggestedMoves moves = new SuggestedMoves(); for (int i = 0; i < bestSurfaceArea.Path.Length - 1; i++) { moves.AddFirst(new SuggestedMove(bestSurfaceArea.Path[i])); } return(moves); }