private static MazeSegment[,] CreateMaze(CommandLineArgs args) { var results = new MazeSegment[args.Columns, args.Rows]; var id = 0; var factor = 1UL; for (var y = 0; y < args.Rows; y++) { for (var x = 0; x < args.Columns; x++) { results[x, y] = new MazeSegment(++id, x, y); //Left if (x > 0) { results[x, y].LeftFactor = results[x - 1, y].RightFactor; } //Top if (y > 0) { results[x, y].TopFactor = results[x, y - 1].BottomFactor; } //Bottom if (y < args.Rows - 1) { results[x, y].BottomFactor = factor; factor *= 2; } //Right if (x < args.Columns - 1) { results[x, y].RightFactor = factor; factor *= 2; } results[x, y].Commit(); } } return(results); }
private static bool ValidateMaze( MazeSegment[,] maze, CommandLineArgs args ) { var visits = 0; var queue = new Queue<MazeSegment>(); queue.Enqueue( maze[0, 0].Mark( -1 ) ); while ( true ) { if ( queue.Count == 0 ) { break; } var segment = queue.Dequeue(); visits += 1; if ( segment.IsClosed ) { break; } if ( !segment.Top && maze[segment.X, segment.Y - 1].ID != segment.ParentID ) { if ( maze[segment.X, segment.Y - 1].Visited ) { break; } queue.Enqueue( maze[segment.X, segment.Y - 1].Mark( segment.ID ) ); } if ( !segment.Right && maze[segment.X + 1, segment.Y].ID != segment.ParentID ) { if ( maze[segment.X + 1, segment.Y].Visited ) { break; } queue.Enqueue( maze[segment.X + 1, segment.Y].Mark( segment.ID ) ); } if ( !segment.Bottom && maze[segment.X, segment.Y + 1].ID != segment.ParentID ) { if ( maze[segment.X, segment.Y + 1].Visited ) { break; } queue.Enqueue( maze[segment.X, segment.Y + 1].Mark( segment.ID ) ); } if ( !segment.Left && maze[segment.X - 1, segment.Y].ID != segment.ParentID ) { if ( maze[segment.X - 1, segment.Y].Visited ) { break; } queue.Enqueue( maze[segment.X - 1, segment.Y].Mark( segment.ID ) ); } } return visits == ( args.Columns * args.Rows ); }
private static MazeSegment[,] CreateMaze( CommandLineArgs args ) { var results = new MazeSegment[args.Columns, args.Rows]; var id = 0; var factor = 1UL; for ( var y = 0; y < args.Rows; y++ ) { for ( var x = 0; x < args.Columns; x++ ) { results[x, y] = new MazeSegment( ++id, x, y ); //Left if ( x > 0 ) { results[x, y].LeftFactor = results[x - 1, y].RightFactor; } //Top if ( y > 0 ) { results[x, y].TopFactor = results[x, y - 1].BottomFactor; } //Bottom if ( y < args.Rows - 1 ) { results[x, y].BottomFactor = factor; factor *= 2; } //Right if ( x < args.Columns - 1 ) { results[x, y].RightFactor = factor; factor *= 2; } results[x, y].Commit(); } } return results; }
private static void PrintMaze( MazeSegment[,] maze, CommandLineArgs args ) { Console.WriteLine(); Console.Write( " " ); for ( var x = 0; x < args.Columns; x++ ) { Console.Write( " _" ); } Console.WriteLine(); for ( var y = 0; y < args.Rows; y++ ) { Console.Write( " " ); for ( var x = 0; x < args.Columns; x++ ) { var segment = maze[x, y]; if ( x == 0 ) { Console.Write( '|' ); } Console.Write( ( segment.Bottom ) ? '_' : ' ' ); Console.Write( ( segment.Right ) ? '|' : ' ' ); } Console.WriteLine(); } }
private static void BuildWalls( MazeSegment[,] maze, CommandLineArgs args, ulong mazeId ) { for ( var y = 0; y < args.Rows; y++ ) { for ( var x = 0; x < args.Columns; x++ ) { var segment = maze[x, y]; for ( var i = 0; i < 4; i++ ) { if ( segment.Factors[i] > 0 ) { segment.Values[i] = ( mazeId & segment.Factors[i] ) == segment.Factors[i]; } else { segment.Values[i] = true; } } } } }