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);
        }