Beispiel #1
0
        /// <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);
        }