/// <summary> /// Deletes rooms that aren't attached to the main room /// </summary> /// <param name="staringMap"></param> /// <returns></returns> private bool[][] _KillOrphans(bool[][] startingMap) { // Start with an all-false map of the same shape as the starting map bool[][] Filled = startingMap.Select(bs => bs.Select(val => true).ToArray()).ToArray(); // Pick a random point on the map that's open int row, col, iters = 0, maxiters = 10000; do { row = rand.Next(Height); col = rand.Next(Width); iters++; } while (startingMap[row][col] && iters < maxiters); if (iters == maxiters) { throw new Exception("Couldn't find a valid starting point to fill the main room from"); } // Expand from there var Visited = new HashSet <Tuple <int, int> >(); var ToVisit = new HashSet <Tuple <int, int> >(); ToVisit.Add(new Tuple <int, int>(row, col)); while (ToVisit.Any()) { var NextToVisit = new HashSet <Tuple <int, int> >(); foreach (var Current in ToVisit) { Visited.Add(Current); } //ToVisit.AsParallel().ForAll(Current => foreach (var Current in ToVisit) { if (!startingMap[Current.Item1][Current.Item2]) { Filled[Current.Item1][Current.Item2] = false; NextToVisit.AddIfNotIn(new Tuple <int, int>(Current.Item1 + 1, Current.Item2), Visited); NextToVisit.AddIfNotIn(new Tuple <int, int>(Current.Item1 - 1, Current.Item2), Visited); NextToVisit.AddIfNotIn(new Tuple <int, int>(Current.Item1, Current.Item2 + 1), Visited); NextToVisit.AddIfNotIn(new Tuple <int, int>(Current.Item1, Current.Item2 - 1), Visited); } }//); ToVisit = NextToVisit; } return(Filled); }