|
|
a5e8d6 |
|
|
|
a5e8d6 |
#include <helianthus.h></helianthus.h>
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
#define ROWS 12
|
|
|
a5e8d6 |
#define COLS 18
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int map[ROWS][COLS][3];
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int visit(int r, int c) {
|
|
|
a5e8d6 |
if (r < 0 || c < 0 || r >= ROWS || c >= COLS) return FALSE;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
if (map[r][c][2]) return randomFloat()*100 < 2;
|
|
|
a5e8d6 |
map[r][c][2] = TRUE;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int ways[4] = {0, 1, 2, 3};
|
|
|
a5e8d6 |
for(int i = 0; i < 4; ++i) {
|
|
|
a5e8d6 |
int a = randomNumber(0, 3);
|
|
|
a5e8d6 |
int b = randomNumber(0, 3);
|
|
|
a5e8d6 |
int n = ways[a];
|
|
|
a5e8d6 |
ways[a] = ways[b];
|
|
|
a5e8d6 |
ways[b] = n;
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
for(int i = 0; i < 4; ++i) {
|
|
|
a5e8d6 |
switch(ways[i]) {
|
|
|
a5e8d6 |
case 0:
|
|
|
a5e8d6 |
if (visit(r, c-1)) map[r ][c ][0] = TRUE;
|
|
|
a5e8d6 |
break;
|
|
|
a5e8d6 |
case 1:
|
|
|
a5e8d6 |
if (visit(r, c+1)) map[r ][c+1][0] = TRUE;
|
|
|
a5e8d6 |
break;
|
|
|
a5e8d6 |
case 2:
|
|
|
a5e8d6 |
if (visit(r-1, c)) map[r ][c ][1] = TRUE;
|
|
|
a5e8d6 |
break;
|
|
|
a5e8d6 |
case 3:
|
|
|
a5e8d6 |
if (visit(r+1, c)) map[r+1][c ][1] = TRUE;
|
|
|
a5e8d6 |
break;
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
return TRUE;
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void generate() {
|
|
|
a5e8d6 |
for(int r = 0; r < ROWS; ++r)
|
|
|
a5e8d6 |
for(int c = 0; c < COLS; ++c)
|
|
|
a5e8d6 |
for(int i = 0; i < 3; ++i)
|
|
|
a5e8d6 |
map[r][c][i] = 0;
|
|
|
a5e8d6 |
visit(0, 0);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void init() {
|
|
|
a5e8d6 |
generate();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void draw() {
|
|
|
a5e8d6 |
double w = windowGetWidth();
|
|
|
a5e8d6 |
double h = windowGetHeight();
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
if (keyWentDown("space")) generate();
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
saveState();
|
|
|
a5e8d6 |
translate(w/2, h/2);
|
|
|
a5e8d6 |
zoom(w/(COLS + 1));
|
|
|
a5e8d6 |
translate(-COLS/2.0, -ROWS/2.0);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
strokeWidth(0.1);
|
|
|
a5e8d6 |
for(int r = 0; r < ROWS; ++r) {
|
|
|
a5e8d6 |
for(int c = 0; c < COLS; ++c) {
|
|
|
a5e8d6 |
if (!map[r][c][0]) line(c, r, c, r+1);
|
|
|
a5e8d6 |
if (!map[r][c][1]) line(c, r, c+1, r);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
line(COLS, 0, COLS, ROWS);
|
|
|
a5e8d6 |
line(0, ROWS, COLS, ROWS);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
restoreState();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int main() {
|
|
|
a5e8d6 |
windowSetVariableFrameRate();
|
|
|
a5e8d6 |
windowSetResizable(TRUE);
|
|
|
a5e8d6 |
windowSetInit(&init);
|
|
|
a5e8d6 |
windowSetDraw(&draw);
|
|
|
a5e8d6 |
windowRun();
|
|
|
a5e8d6 |
}
|