Example #1
0
        public static HashSet <Point> generateMaze(int width, int height)
        {
            var V          = new HashSet <Point>();
            var discovered = RecursiveBacktrackerAlgorithm.ReturnDict(width, height);
            var maze       = new HashSet <Point>();

            var weights = returnWeights(discovered.Keys.ToList());

            var startV   = new Point(5, 3);
            var currentV = startV;

            discovered[startV] = true;

            var r = new Random();

            var mazeEntry = new Point(5, 2);

            maze.Add(mazeEntry);
            maze.Add(currentV);

            while (true)
            {
                var availableVertices = Program.returnUnvisitedNeighbours(discovered, currentV);

                foreach (var vertex in availableVertices.Where(vertex => !V.Contains(vertex)))
                {
                    V.Add(vertex);
                }

                if (V.Count == 0)
                {
                    break;
                }

                var lowestWeightVertex = ExtractMinV(V, weights);

                var visitedNeighbours = returnVisitedNeighbours(discovered, lowestWeightVertex);

                var newVertex = visitedNeighbours[r.Next(visitedNeighbours.Count)];

                var wallV = RecursiveBacktrackerAlgorithm.pointMidPoint(newVertex, lowestWeightVertex);

                maze.Add(wallV);
                maze.Add(lowestWeightVertex);

                currentV = lowestWeightVertex;

                V.Remove(currentV);

                discovered[currentV] = true;
            }

            var mazeExit = RecursiveBacktrackerAlgorithm.returnExit(width, height);

            maze.Add(mazeExit);

            return(maze);
        }
Example #2
0
        public static HashSet <Point> generateMaze(int width, int height)
        {
            var startV   = new Point(5, 3);
            var currentV = startV;
            var prev     = startV;

            var maze = new HashSet <Point>
            {
                new Point(5, 2),
                currentV
            };

            var r = new Random();

            var visited = RecursiveBacktrackerAlgorithm.ReturnDict(width, height);

            Program.setBothColours(ConsoleColor.White);

            visited[currentV] = true;

            while (unvisitedVertices(visited))
            {
                var surroundingVertices = returnNeighbours(visited, currentV);

                var temporaryVertex = surroundingVertices[r.Next(surroundingVertices.Count)];

                if (!visited[temporaryVertex])
                {
                    var wallV = RecursiveBacktrackerAlgorithm.pointMidPoint(currentV, temporaryVertex);

                    visited[temporaryVertex] = true;

                    maze.Add(wallV);
                    maze.Add(temporaryVertex);
                }

                currentV = temporaryVertex;
            }


            var mazeExit = RecursiveBacktrackerAlgorithm.returnExit(width, height);

            maze.Add(mazeExit);


            return(maze);
        }
        public static HashSet <Point> generateMaze(int width, int height)
        {
            var startV   = new Point(5, 3);
            var currentV = startV;

            var visited = RecursiveBacktrackerAlgorithm.ReturnDict(width, height);

            var maze = new HashSet <Point>();

            var mazeEntry = new Point(5, 2);

            maze.Add(mazeEntry);

            visited[startV] = true;
            maze.Add(startV);

            var r = new Random();

            while (unvisitedVertices(visited))
            {
                var availableVertices = Program.returnUnvisitedNeighbours(visited, currentV);

                if (availableVertices.Count > 0)
                {
                    var temporaryV = availableVertices[r.Next(availableVertices.Count)];

                    visited[temporaryV] = true;

                    var wallV = RecursiveBacktrackerAlgorithm.pointMidPoint(currentV, temporaryV);

                    maze.Add(wallV);
                    maze.Add(temporaryV);

                    currentV = temporaryV;
                }
                else
                {
                    foreach (Point v in visited.Keys)
                    {
                        var visitedNeighbours = PrimsAlgorithm.returnVisitedNeighbours(visited, v);
                        if (visitedNeighbours.Count == 0 || visited[v])
                        {
                            continue;
                        }
                        else
                        {
                            var newVertex = visitedNeighbours[r.Next(visitedNeighbours.Count)];

                            var wallV = RecursiveBacktrackerAlgorithm.pointMidPoint(newVertex, v);

                            maze.Add(wallV);
                            maze.Add(v);

                            currentV = v;

                            break;
                        }
                    }
                    visited[currentV] = true;
                }
            }


            var mazeExit = RecursiveBacktrackerAlgorithm.returnExit(width, height);

            maze.Add(mazeExit);

            return(maze);
        }
        public static HashSet <Point> generateMaze(int width, int height)
        {
            var availableVertices = RecursiveBacktrackerAlgorithm.ReturnDict(width, height).Keys.ToList();

            var maze = new HashSet <Point>();

            var usedVertices = new HashSet <Point>();

            var weights = BoruvkasAlgorithm.returnEdgeWeights(width, height, availableVertices);
            var V       = BoruvkasAlgorithm.assignInitialSetNumbers(availableVertices);

            var mazeEntry = new Point(5, 2);

            maze.Add(mazeEntry);

            //pick random edge/lowest weight edge
            //combine set of connected trees IF NOT IN THE SAME SET
            //remove edge
            //repeat

            while (!BoruvkasAlgorithm.singleSet(V))
            {
                foreach (Point v in availableVertices)
                {
                    var lowestWeightEdge = BoruvkasAlgorithm.returnLowestWeightEdge(weights);

                    if (lowestWeightEdge.IsEmpty)
                    {
                        continue;
                    }

                    var connectedVertices = BoruvkasAlgorithm.returnNodes(availableVertices, lowestWeightEdge);

                    var setNumber1 = V[connectedVertices.First()];
                    var setNumber2 = V[connectedVertices.Last()];


                    if (setNumber1 != setNumber2)
                    {
                        V = BoruvkasAlgorithm.assignSetNumber(V, setNumber1, setNumber2);

                        weights.Remove(lowestWeightEdge);

                        if (!maze.Contains(connectedVertices.First()))
                        {
                            maze.Add(connectedVertices.First());
                        }
                        if (!maze.Contains(connectedVertices.Last()))
                        {
                            maze.Add(connectedVertices.Last());
                        }
                        maze.Add(lowestWeightEdge);
                    }
                    weights.Remove(lowestWeightEdge);
                }
            }

            var mazeExit = RecursiveBacktrackerAlgorithm.returnExit(width, height);

            maze.Add(mazeExit);

            return(maze);
        }
        public static HashSet <Point> generateMaze(int width, int height)
        {
            var r = new Random();

            var visited = RecursiveBacktrackerAlgorithm.ReturnDict(width, height);

            var cameFrom = resetCameFrom(visited);

            //Choose any vertex at random and add it to the UST.
            //Select any vertex that is not already in the UST and perform a random walk until you encounter a vertex that is in the UST.
            //Add the vertices and edges touched in the random walk to the UST.
            //Repeat 2 and 3 until all vertices have been added to the UST.

            var UST = new HashSet <Point>();

            var currentV = visited.Keys.ToList()[r.Next(visited.Keys.Count)];
            var prev     = currentV;

            visited[currentV] = true;

            var maze = new HashSet <Point>
            {
                new Point(5, 2),
                currentV
            };

            UST.Add(currentV);


            currentV = getUnvisitedVertex(visited);

            var firstCell = currentV;


            while (unvisitedVertices(visited))
            {
                var surroundingVertices = returnNeighbours(visited, currentV);

                var temporaryVertex = surroundingVertices[r.Next(surroundingVertices.Count)];

                cameFrom[prev] = temporaryVertex;


                if (UST.Contains(temporaryVertex))
                {
                    temporaryVertex = firstCell;

                    var verticesToBeAdded = new List <Point>
                    {
                        temporaryVertex
                    };


                    do
                    {
                        if (!cameFrom.ContainsKey(temporaryVertex))
                        {
                            break;
                        }

                        temporaryVertex = cameFrom[temporaryVertex];
                        verticesToBeAdded.Add(temporaryVertex);
                    } while (!UST.Contains(temporaryVertex));


                    for (int i = 0; i < verticesToBeAdded.Count - 1; i++)
                    {
                        var v1   = verticesToBeAdded[i];
                        var v2   = verticesToBeAdded[i + 1];
                        var wall = RecursiveBacktrackerAlgorithm.pointMidPoint(v1, v2);

                        visited[v1] = true;

                        maze.Add(wall);
                        maze.Add(v1);

                        UST.Add(v1);
                    }

                    cameFrom = resetCameFrom(visited);

                    if (!unvisitedVertices(visited))
                    {
                        break;
                    }

                    currentV = getUnvisitedVertex(visited);

                    prev = currentV;

                    firstCell = currentV;
                }
                else
                {
                    currentV = temporaryVertex;

                    cameFrom[prev] = currentV;

                    prev = currentV;
                }
            }

            var mazeExit = RecursiveBacktrackerAlgorithm.returnExit(width, height);

            maze.Add(mazeExit);

            return(maze);
        }