# C# Recursive Backtracking maze generator in console



## DragonCz (May 11, 2012)

Hello there, I am fairy new to C#, soo our teacher gave us homework to create a backtracking program in console to solve mazes. But really hate writing it by hand, soo I wanted to make a mze generator, but I cannot realize how make it do these things:
It will run in console
You will specify width and height
You will set filepath
Then you will press enter and you are done
It will write a height*width maze into a file, where 0 is empty space, 1 is a wall, 2 is a start and 3 is the end

This is NOT a homework, it is just to add some special features to it, and no, I will not show it to our teacher, because he want to explain everything, and I dont know how this program will be made.

I dont want it 100% recursive backtracking method, but I want to learn something on it too by myself.

Regards, DragonCz

Here is my code, it is in Czech language at the end, where it ends.
http://pastebin.com/At30CFf5

I know its not optimal or recursive, but works
You have to edit the path, too


----------



## AphexDreamer (May 11, 2012)

Google yo? 

http://weblog.jamisbuck.org/2010/12/27/maze-generation-recursive-backtracking


----------



## DragonCz (May 11, 2012)

I have seen this, googled, but there is no C# code there, not made in console
At the end of the page there is a code: 
https://gist.github.com/828805

But it didnt work for me, dont understand it


----------



## AphexDreamer (May 11, 2012)

I've only just finished my intro to C++ class so I doubt I'm the guy your looking for. 

But... Are you sure you have the required libraries to make it work?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

??


----------



## DragonCz (May 11, 2012)

Yes, I am sure, but still it dont work, because it cant find the Main (entry) point of the program, and I have no idea where it is


----------



## Kreij (May 11, 2012)

The code at the end is written in C (not C#) and uses pointers and it's own memory management, which is considered unsafe in C# code.

You said your code works. What's issues are you having?

Also ... Please post code here using the [code][/code] tags, so it's listed in the thread. Makes it a little easier when helping someone.


----------



## DragonCz (May 11, 2012)

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Maze.Logic
{
	[Flags]
	public enum Directions
	{
		N = 1,
		S = 2,
		E = 4,
		W = 8
	}

	public class Grid
	{
		private const int _rowDimension = 0;
		private const int _columnDimension = 1;

		public int MinSize { get; private set; }
		public int MaxSize { get; private set; }
		public int[,] Cells { get; private set; }

		public Grid() : this(3, 3)
		{

		}

		public Grid(int rows, int columns)
		{
			MinSize = 3;
			MaxSize = 10;
			Cells = Initialise(rows, columns);
		}

		public int[,] Initialise(int rows, int columns)
		{
			if (rows < MinSize)
				rows = MinSize;

			if (columns < MinSize)
				columns = MinSize;

			if (rows > MaxSize)
				rows = MaxSize;

			if (columns > MaxSize)
				columns = MaxSize;

			var cells = new int[rows, columns];

			for (int i = 0; i < rows; i++)
			{
				for (int j = 0; j < columns; j++)
				{
					cells[i, j] = 0;
				}				
			}

			return cells;
		}

		private Dictionary<Directions, int> DirectionX = new Dictionary<Directions, int>
		{
			{ Directions.N, 0 },
			{ Directions.S, 0 },
			{ Directions.E, 1 },
			{ Directions.W, -1 }
		};

		private Dictionary<Directions, int> DirectionY = new Dictionary<Directions, int>
		{
			{ Directions.N, -1 },
			{ Directions.S, 1 },
			{ Directions.E, 0 },
			{ Directions.W, 0 }
		};

		private Dictionary<Directions, Directions> Opposite = new Dictionary<Directions, Directions>
		{
			{ Directions.N, Directions.S },
			{ Directions.S, Directions.N },
			{ Directions.E, Directions.W },
			{ Directions.W, Directions.E }
		};

		public int[,] Generate()
		{
			var cells = Cells;
			CarvePassagesFrom(0, 0, ref cells);
			return cells;
		}

		public void CarvePassagesFrom(int currentX, int currentY, ref int[,] grid)
		{
			var directions = new List<Directions>
			{
				Directions.N,
				Directions.S,
				Directions.E,
				Directions.W
			}
			.OrderBy(x => Guid.NewGuid());

			foreach (var direction in directions)
			{
				var nextX = currentX + DirectionX[direction];
				var nextY = currentY + DirectionY[direction];

				if (IsOutOfBounds(nextX, nextY, grid))
					continue;

				if (grid[nextY, nextX] != 0) // has been visited
					continue;

				grid[currentY, currentX] |= (int)direction;
				grid[nextY, nextX] |= (int)Opposite[direction];

				CarvePassagesFrom(nextX, nextY, ref grid);
			}
		}

		private bool IsOutOfBounds(int x, int y, int[,] grid)
		{
			if (x < 0 || x > grid.GetLength(_rowDimension) - 1)
				return true;

			if (y < 0 || y > grid.GetLength(_columnDimension) - 1)
				return true;

			return false;
		}

		public void Print(int[,] grid)
		{
			var rows = grid.GetLength(_rowDimension);
			var columns = grid.GetLength(_columnDimension);

			// Top line
			Console.Write(" ");
			for (int i = 0; i < columns; i++)
				Console.Write(" _");
			Console.WriteLine();

			for (int y = 0; y < rows; y++)
			{
				Console.Write(" |");

				for (int x = 0; x < columns; x++)
				{
					var directions = (Directions)grid[y, x];

					var s = directions.HasFlag(Directions.S) ? " " : "_";

					Console.Write(s);

					s = directions.HasFlag(Directions.E) ? " " : "|";

					Console.Write(s);					
				}

				Console.WriteLine();
			}
		}
	}
}
```
This code works (no errors), BUT it does not have an entry point (Main), soo it cant run


----------



## Kreij (May 11, 2012)

So give it an entry point (main).
You currently just have a public class sitting there and nothing that is instancing it or call it's methods.

If you are using Visual Studio (or Visual C# Express), just create a new console app and it will auto-generate the entry point (main method in a class called "Program"). You can then stuff in your class and add the calls you need.


----------



## FordGT90Concept (May 11, 2012)

Main looks like this:

```
internal static void Main(string[] args)
{
}
```
or (if you don't want arguments)

```
internal static void Main()
{
}
```
You could name it anything and change it under the project properties -> Application -> Startup object.  (Not set) will default it to Main.


----------



## DragonCz (May 11, 2012)

I know, but what write to the main?


----------



## FordGT90Concept (May 12, 2012)

Whatever you want the program to do which is likely execute the code you pasted before.


----------

