Any comments and critique is welocme.
Program class:
class Program { static void Main(string[] args) { int defaultHeight = Console.WindowHeight; int defaultWidth = Console.WindowWidth; Console.Title = "Maze Factory"; Console.WriteLine("Welcome to Maze Factory!"); Console.WriteLine(); bool exit = false; do { int rows, columns; rows = getNumber("rows"); columns = getNumber("columns"); Maze maze = new Maze(columns, rows); maze.Draw(); exit = exitProgram(); resetConsole(defaultWidth, defaultHeight); } while (!exit); } private static bool exitProgram() { do { Console.Write("Would you like to create another maze ([y]es,|[n]o): "); ConsoleKeyInfo key = Console.ReadKey(); if (key.KeyChar == 'y' || key.KeyChar == 'Y') return false; else if (key.KeyChar == 'n' || key.KeyChar == 'N') return true; Console.WriteLine(); } while (true); } private static int getNumber(string numOfWhat) { int number; bool OK = false; do { Console.WriteLine(); Console.Write("Enter number of {0} (2-50): ", numOfWhat); if (int.TryParse(Console.ReadLine().ToString(), out number)) { if (number < 2 || number > 50) Console.WriteLine("Sorry, that's an invalid number. Please try a number between 2 and 50."); else OK = true; } else Console.WriteLine("You have not entered a number! Please try a number between 2 and 50."); } while (!OK); return number; } private static void resetConsole(int width, int height) { Console.Clear(); Console.WindowWidth = width; Console.WindowHeight = height; } }
Maze class:
class Maze { #region Fields int x, y; Room[][] RoomSets; Room[] Rooms; Wall[] Walls; Room[,] Table; #endregion #region Constructor public Maze(int x, int y) { this.x = x; this.y = y; int numOfRooms = x * y; Rooms = new Room[numOfRooms]; RoomSets = new Room[numOfRooms][]; Table = new Room[x, y]; //fill Rooms, RoomSets and Table with rooms for (int i = 0; i < (x * y); i++) { Rooms = new Room(i, i); RoomSets = new Room[1] { Rooms }; Table = Rooms<span style="font-weight:bold;">;<br> }<br><br> <span class="cpp-comment">//fill Walls list</span><br> <span class="cpp-keyword">int</span> numOfWalls = x * (y - <span class="cpp-literal"><span class="cpp-number">1</span></span>) + y * (x - <span class="cpp-literal"><span class="cpp-number">1</span></span>);<br> Walls = <span class="vb-function">new</span> Wall[numOfWalls];<br> <span class="cpp-keyword">int</span> thisRoom = <span class="cpp-literal"><span class="cpp-number">0</span></span>;<br> <span class="cpp-keyword">int</span> nextRoom = <span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> i = <span class="cpp-literal"><span class="cpp-number">0</span></span>; i < numOfWalls; i++)<br> {<br> Walls<span style="font-weight:bold;"> = <span class="vb-function">new</span> Wall(Rooms[thisRoom], Rooms[nextRoom]);<br> thisRoom++;<br> nextRoom++;<br> <span class="cpp-keyword">if</span> (nextRoom % x == <span class="cpp-literal"><span class="cpp-number">0</span></span>)<br> {<br> <span class="cpp-keyword">if</span> (nextRoom - x == thisRoom)<br> nextRoom -= (x - <span class="cpp-literal"><span class="cpp-number">1</span></span>);<br> <span class="cpp-keyword">else</span><br> thisRoom -= (x - <span class="cpp-literal"><span class="cpp-number">1</span></span>);<br> }<br> }<br><br> <span class="cpp-comment">//create perfect maze</span><br> Random random = <span class="vb-function">new</span> Random();<br> <span class="cpp-keyword">while</span> (Walls.Length > <span class="cpp-literal"><span class="cpp-number">0</span></span>)<br> {<br> <span class="cpp-keyword">int</span> randomWall = random.Next(Walls.Length - <span class="cpp-literal"><span class="cpp-number">1</span></span>);<br> <span class="cpp-keyword">if</span> (Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Set != Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Set)<br> {<br> deleteRoomsWall(Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">1</span></span>, Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">2</span></span>);<br> copyRoomsToOneSet(Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Set, Walls[randomWall].Room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Set);<br> }<br> <span class="cpp-keyword">this</span>.Walls = deleteWall(randomWall);<br> }<br> } <br> <span class="cpp-directive">#endregion</span><br><br> <span class="cpp-directive">#region</span> <span class="cpp-keyword">Public</span> Methods<br> <span class="cpp-keyword">public</span> <span class="cpp-keyword">void</span> Draw()<br> {<br> <span class="cpp-comment">//check bounds</span><br> <span class="cpp-comment">//x</span><br> <span class="cpp-keyword">int</span> width = <span class="cpp-keyword">this</span>.x * <span class="cpp-literal"><span class="cpp-number">2</span></span> + <span class="cpp-literal"><span class="cpp-number">3</span></span>;<br> <span class="cpp-keyword">if</span> (Console.BufferWidth<width)<br> Console.BufferWidth = width;<br> <span class="cpp-keyword">if</span> (Console.WindowWidth < width)<br> {<br> <span class="cpp-keyword">if</span> (Console.LargestWindowWidth < width)<br> Console.WindowWidth = Console.LargestWindowWidth;<br> <span class="cpp-keyword">else</span><br> Console.WindowWidth = width;<br> }<br> <span class="cpp-comment">//y</span><br> <span class="cpp-keyword">int</span> height = <span class="cpp-keyword">this</span>.y + <span class="cpp-literal"><span class="cpp-number">2</span></span>;<br> <span class="cpp-keyword">if</span> (Console.BufferHeight < height)<br> Console.BufferHeight = height;<br> <span class="cpp-keyword">if</span> (Console.WindowHeight < height)<br> {<br> <span class="cpp-keyword">if</span> (Console.LargestWindowHeight < height)<br> Console.WindowHeight = Console.LargestWindowHeight;<br> <span class="cpp-keyword">else</span><br> Console.WindowHeight = height;<br> }<br> <br> <span class="cpp-comment">//draw</span><br> Console.Clear();<br> <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> x = <span class="cpp-literal"><span class="cpp-number">0</span></span>; x < <span class="cpp-keyword">this</span>.x; x++)<br> {<br> <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> y = <span class="cpp-literal"><span class="cpp-number">0</span></span>; y < <span class="cpp-keyword">this</span>.y; y++)<br> {<br> drawSquare(Table[x, y]);<br> }<br> }<br> Console.CursorLeft = <span class="cpp-literal"><span class="cpp-number">0</span></span>;<br> Console.CursorTop = <span class="cpp-keyword">this</span>.y+<span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> } <br> <span class="cpp-directive">#endregion</span><br><br> <span class="cpp-directive">#region</span> <span class="cpp-keyword">Private</span> Methods<br> <span class="cpp-keyword">private</span> <span class="cpp-keyword">void</span> copyRoomsToOneSet(<span class="cpp-keyword">int</span> set<span class="cpp-literal"><span class="cpp-number">1</span></span>, <span class="cpp-keyword">int</span> set<span class="cpp-literal"><span class="cpp-number">2</span></span>)<br> {<br> <span class="cpp-keyword">int</span> numOfCombinedRooms = <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">1</span></span>].Length + <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">2</span></span>].Length;<br> Room[] rooms = <span class="vb-function">new</span> Room[numOfCombinedRooms];<br> <span class="cpp-keyword">int</span> i = <span class="cpp-literal"><span class="cpp-number">0</span></span>;<br> <span class="cpp-keyword">foreach</span> (Room room <span class="cpp-keyword">in</span> <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">1</span></span>])<br> {<br> room.Set = set<span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> rooms<span style="font-weight:bold;"> = room;<br> i++;<br> }<br> <span class="cpp-keyword">foreach</span> (Room room <span class="cpp-keyword">in</span> <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">2</span></span>])<br> {<br> room.Set = set<span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> rooms<span style="font-weight:bold;"> = room;<br> i++;<br> }<br> <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">1</span></span>] = rooms;<br> <span class="cpp-keyword">this</span>.RoomSets[set<span class="cpp-literal"><span class="cpp-number">2</span></span>] = <span class="vb-function">new</span> Room[<span class="cpp-literal"><span class="cpp-number">0</span></span>];<br> }<br><br> <span class="cpp-keyword">private</span> <span class="cpp-keyword">void</span> deleteRoomsWall(Room room<span class="cpp-literal"><span class="cpp-number">1</span></span>, Room room<span class="cpp-literal"><span class="cpp-number">2</span></span>)<br> {<br> <span class="cpp-keyword">if</span> (room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Number + <span class="cpp-literal"><span class="cpp-number">1</span></span> == room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Number)<br> {<br> room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>RightWall = <span class="cpp-literal">false</span>;<br> room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>LeftWall = <span class="cpp-literal">false</span>;<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span> (room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Number == room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Number + <span class="cpp-literal"><span class="cpp-number">1</span></span>)<br> {<br> room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>RightWall = <span class="cpp-literal">false</span>;<br> room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>LeftWall = <span class="cpp-literal">false</span>;<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span> (room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Number - x == room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Number)<br> {<br> room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>BottomWall = <span class="cpp-literal">false</span>;<br> room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>TopWall = <span class="cpp-literal">false</span>;<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span> (room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>Number - x == room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>Number)<br> {<br> room<span class="cpp-literal"><span class="cpp-number">2</span>.</span>BottomWall = <span class="cpp-literal">false</span>;<br> room<span class="cpp-literal"><span class="cpp-number">1</span>.</span>TopWall = <span class="cpp-literal">false</span>;<br> }<br> }<br><br> <span class="cpp-keyword">private</span> Wall[] deleteWall(<span class="cpp-keyword">int</span> wallToDelete)<br> {<br> Wall[] Walls = <span class="vb-function">new</span> Wall[<span class="cpp-keyword">this</span>.Walls.Length - <span class="cpp-literal"><span class="cpp-number">1</span></span>];<br> <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> i = <span class="cpp-literal"><span class="cpp-number">0</span></span>; i < <span class="cpp-keyword">this</span>.Walls.Length; i++)<br> {<br> <span class="cpp-keyword">if</span> (i != wallToDelete)<br> {<br> <span class="cpp-keyword">if</span> (i < wallToDelete)<br> Walls<span style="font-weight:bold;"> = <span class="cpp-keyword">this</span>.Walls<span style="font-weight:bold;">;<br> <span class="cpp-keyword">else</span><br> Walls = <span class="cpp-keyword">this</span>.Walls<span style="font-weight:bold;">;<br> }<br> }<br> <span class="cpp-keyword">return</span> Walls;<br> }<br><br> <span class="cpp-keyword">private</span> <span class="cpp-keyword">void</span> drawSquare(Room room)<br> {<br> <span class="cpp-keyword">int</span> x, y;<br> x = room.Number % <span class="cpp-keyword">this</span>.x;<br> y = room.Number / <span class="cpp-keyword">this</span>.x;<br> x *= <span class="cpp-literal"><span class="cpp-number">2</span></span>;<br> Console.CursorLeft = x + <span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> Console.CursorTop = y;<br> <span class="cpp-keyword">if</span> (room.TopWall)<br> Console.Write(<span class="cpp-literal">'_'</span>);<br> Console.CursorLeft = x;<br> Console.CursorTop = y + <span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> <span class="cpp-keyword">if</span> (room.LeftWall)<br> Console.Write(<span class="cpp-literal">'|'</span>);<br> <span class="cpp-keyword">else</span><br> Console.CursorLeft++;<br> <span class="cpp-keyword">if</span> (room.BottomWall)<br> Console.Write(<span class="cpp-literal">'_'</span>);<br> <span class="cpp-keyword">else</span><br> Console.CursorLeft++;<br> <span class="cpp-keyword">if</span> (room.RightWall)<br> Console.Write(<span class="cpp-literal">'|'</span>);<br> } <br> <span class="cpp-directive">#endregion</span><br><br> <span class="cpp-directive">#region</span> Nested Types<br> <span class="cpp-keyword">class</span> Room<br> {<br> <span class="cpp-keyword">public</span> <span class="cpp-keyword">int</span> Number;<br> <span class="cpp-keyword">public</span> <span class="cpp-keyword">int</span> Set;<br> <span class="cpp-keyword">public</span> <span class="cpp-keyword">bool</span> LeftWall, RightWall, TopWall, BottomWall;<br><br> <span class="cpp-keyword">public</span> Room(<span class="cpp-keyword">int</span> Number, <span class="cpp-keyword">int</span> Set)<br> {<br> <span class="cpp-keyword">this</span>.Number = Number;<br> <span class="cpp-keyword">this</span>.Set = Set;<br> LeftWall = RightWall = TopWall = BottomWall = <span class="cpp-literal">true</span>;<br> }<br> }<br> <span class="cpp-keyword">class</span> Wall<br> {<br> <span class="cpp-keyword">public</span> Room Room<span class="cpp-literal"><span class="cpp-number">1</span></span>, Room<span class="cpp-literal"><span class="cpp-number">2</span></span>;<br><br> <span class="cpp-keyword">public</span> Wall(Room Room<span class="cpp-literal"><span class="cpp-number">1</span></span>, Room Room<span class="cpp-literal"><span class="cpp-number">2</span></span>)<br> {<br> <span class="cpp-keyword">this</span>.Room<span class="cpp-literal"><span class="cpp-number">1</span></span> = Room<span class="cpp-literal"><span class="cpp-number">1</span></span>;<br> <span class="cpp-keyword">this</span>.Room<span class="cpp-literal"><span class="cpp-number">2</span></span> = Room<span class="cpp-literal"><span class="cpp-number">2</span></span>;<br> }<br> }<br> <span class="cpp-directive">#endregion</span><br> }<br></pre></div><!–ENDSCRIPT–>