annotate trunk/mazegen.d @ 0:4b2e8e8a633e

Repository setup.
author revcompgeek
date Mon, 03 Mar 2008 19:28:10 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
1 /++++++++++++++++++++++++++++++++++++++++++++++++
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
2 + Maze Generation +
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
3 + Author: Matt P. +
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
4 + Version: 1.0 +
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
5 + +
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
6 + Generates a simple maze with odd dimensions. +
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
7 ++++++++++++++++++++++++++++++++++++++++++++++++/
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
8
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
9 module mazegen;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
10
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
11 import tango.math.Random;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
12 import tango.io.Stdout;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
13 import Integer = tango.text.convert.Integer;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
14
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
15 void usage(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
16 Stdout(
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
17 "Usage: mazegen width height [options]\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
18 "Width and height must be odd and greater than or equal to 5.\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
19 "Options:\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
20 " -e char\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
21 " Set the empty block character to char.\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
22 " -f char\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
23 " Set the filled block character to char.\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
24 " -b\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
25 " Disables printing of the border.\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
26 " -i\n"
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
27 " Prints out how many possible mazes there are for that size and quit.\n").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
28 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
29
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
30 bool[][] generateMaze(uint width, uint height){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
31 bool[][] maze;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
32
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
33 maze.length = width;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
34
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
35 for (auto i = 0; i < width; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
36 maze[i].length = height;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
37 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
38
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
39 bool rowStart = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
40 bool vertical;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
41 for (auto i = 1; i < width; i+=2){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
42 vertical = rowStart;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
43 rowStart = !rowStart;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
44
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
45 for (auto j = 1; j < height; j+=2){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
46 maze[i][j] = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
47 if (vertical)
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
48 maze[i + ((Random.shared.next(2)-1)?-1:1)][j] = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
49 else
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
50 maze[i][j + ((Random.shared.next(2)-1)?-1:1)] = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
51 vertical = !vertical;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
52 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
53 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
54
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
55 return maze;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
56 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
57 void printMaze(bool[][] m,char e = ' ', char f = 'X', bool outline = true){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
58 if (outline){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
59 Stdout("+");
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
60 for (auto j = 0; j < m[0].length; j++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
61 Stdout("-");
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
62 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
63 Stdout("+").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
64 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
65
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
66 for (auto i = 0; i < m.length; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
67 if (outline) Stdout("|");
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
68 for (auto j = 0; j < m[i].length; j++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
69 if(m[i][j]) Stdout(""~f).flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
70 else Stdout(""~e).flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
71 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
72 if (outline) Stdout("|").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
73 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
74 if (outline){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
75 Stdout("+");
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
76 for (auto j = 0; j < m[0].length; j++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
77 Stdout("-");
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
78 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
79 Stdout("+").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
80 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
81 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
82
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
83 void main(char[][] args){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
84 char empty = ' ';
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
85 char filled = 'X';
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
86
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
87 if(args.length < 3){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
88 usage();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
89 return;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
90 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
91
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
92 uint width = Integer.parse(args[1]);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
93 uint height = Integer.parse(args[2]);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
94 bool frame = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
95
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
96 if (width % 2 != 1 || height % 2 != 1 || width < 5 || height < 5){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
97 usage();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
98 return;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
99 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
100
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
101 for (auto i = 3; i < args.length; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
102 char[] arg = args[i];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
103 switch (arg){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
104 case "-h":
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
105 usage();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
106 return;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
107 case "-e":
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
108 empty = args[++i][0];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
109 break;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
110 case "-f":
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
111 filled = args[++i][0];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
112 break;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
113 case "-i":
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
114 Stdout("There are 2^")( (( width - 1 ) / 2 ) * (( height - 1 ) / 2 ) )(" different maze types for that size.").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
115 return;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
116 case "-b":
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
117 frame = false;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
118 default:
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
119 Stdout.format("Unknown parameter: {}",arg).newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
120 usage();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
121 return;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
122 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
123 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
124
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
125 bool[][] maze = generateMaze(width,height);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
126
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
127 printMaze(maze,empty,filled,frame);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
128 }