コード例 #1
0
        private MazeGenerationResults InitializeTree(ICollection <Point> path, MazeGenerationResults results, Tree tree)
        {
            Point startingPoint;
            ICell startingCell;

            do
            {
                // TODO: This one is retarded. Need to think of a better way.
                startingPoint = MazeGenerationUtils.PickStartingPoint(Map, RNG);
                startingCell  = Map.GetCell(startingPoint);
            } while (startingCell.State == CellState.Empty);
            path.Add(startingPoint);
            ChangeCell(results, startingPoint, CellState.Empty, CellDisplayState.Path);
            CellsTreeDict.Add(startingPoint, tree);
            return(results);
        }
コード例 #2
0
        public override MazeGenerationResults Generate()
        {
            var results = new MazeGenerationResults();

            if (CurrentIteration == 0)
            {
                InitializeMap();
            }

            var treeIndex = CurrentIteration % RunningTrees.Count;
            var tree      = RunningTrees[treeIndex];
            var path      = tree.Path;

            CurrentIteration++;
            if (path.Count == 0)
            {
                return(InitializeTree(path, results, tree));
            }

            var doBreadth              = RNG.NextDouble() < Breadth;
            var doFirstChanceLooping   = RNG.NextDouble() < FirstChanceLooping;
            var doLastChanceLooping    = RNG.NextDouble() < LastChanceLooping;
            var dontGoBackAfterLooping = RNG.NextDouble() < DontGoBackAfterLooping;
            var doBlocking             = RNG.NextDouble() < Blocking;

            var currentCoordinateIndex = doBreadth && path.Count > 1 ? RNG.Next(1, path.Count / Sparseness + 1) * Sparseness : path.Count - 1;
            var currentPoint           = path[currentCoordinateIndex];

            var offsets = currentPoint.GetAxisOffsets();
            var biases  = GetCurrentOffsetProbabilities(tree.LastOffset);

            var lastChanceLooping = false;

            while (offsets.Count > 0)
            {
                var offsetIndex = PickNextDirection(biases, offsets);
                var offset      = offsets[offsetIndex];
                var points      = new List <Point>(Sparseness);
                {
                    for (var i = 1; i <= Sparseness; i++)
                    {
                        var point = currentPoint + (offset * i);
                        points.Add(point);
                    }
                }
                var firstPoint     = points[0];
                var lastPoint      = points[points.Count - 1];
                var lastCellExists = Map.CellExists(lastPoint);
                var testCell       = lastCellExists ? Map.GetCell(lastChanceLooping ? firstPoint : lastPoint) : null;

                if (testCell == null || doBlocking || (!doFirstChanceLooping && testCell.State != CellState.Filled))
                {
                    offsets.RemoveAt(offsetIndex);
                    biases.RemoveAt(offsetIndex);
                    if (!lastChanceLooping && offsets.Count == 0)
                    {
                        offsets           = currentPoint.GetAxisOffsets();
                        biases            = Biases.ToList();
                        lastChanceLooping = true;
                    }
                    continue;
                }

                var cells    = points.Select(x => Map.GetCell(x)).ToList();
                var lastCell = cells[cells.Count - 1];

                var wouldLoop = lastCell.State == CellState.Empty;

                Tree otherTree;
                var  treeJoinForceConnect = CellsTreeDict.TryGetValue(lastPoint, out otherTree) && TreeTree.Connect(tree, otherTree);

                if (wouldLoop)
                {
                    if (!doLastChanceLooping && !treeJoinForceConnect)
                    {
                        break;
                    }
                }

                tree.LastOffset = offset;

                if (!dontGoBackAfterLooping && LastLooped && wouldLoop)
                {
                    // TODO: Fix going back with first chance looping.
                    break;
                }

                if (!treeJoinForceConnect && !wouldLoop)
                {
                    CellsTreeDict.Add(lastPoint, tree);
                }

                LastLooped = wouldLoop;

                for (var i = 0; i < points.Count; i++)
                {
                    var point = points[i];
                    var cell  = cells[i];
                    cell.State = CellState.Empty;
                    if (wouldLoop)
                    {
                        cell.DisplayState = CellDisplayState.Path;
                    }
                    else
                    {
                        cell.DisplayState = CellDisplayState.PathWillReturn;
                        path.Push(point);
                    }
                    var result = new MazeGenerationResult(point, cell.State, cell.DisplayState);
                    results.Add(result);
                }

                return(results);
            }

            if (path.Count <= 1)
            {
                return(CompleteTree(treeIndex, results));
            }

            if (currentCoordinateIndex != 0)
            {
                for (var i = 0; i < Sparseness; i++)
                {
                    var coord = path[currentCoordinateIndex - i];
                    path.RemoveAt(currentCoordinateIndex - i);
                    var lastCell = Map.GetCell(coord);
                    lastCell.DisplayState = CellDisplayState.Path;
                    var lastResult = new MazeGenerationResult(coord, lastCell.State, lastCell.DisplayState);
                    results.Results.Add(lastResult);
                }
            }
            return(results);
        }