Maze generation: Difference between revisions

(→‎{{header|C}}: reimplemented)
(→‎{{header|C}}: cleanup)
Line 303:
enum { U = 1, D = 2, L = 4, R = 8, WALL = 16, V = 32 };
 
wchar_t *grids = L" "
" "
" ╵╷│╼┘┐┤╺└┌├─┴┬┼"
" ┆┆┆┄╯╮ ┄╰╭ ┄ "
" ┆ ╯╮ ╰╭ ┄ ";
;
 
int irand(int n)
Line 325 ⟶ 323:
x[i] = x[i - 1] + w;
return x;
 
cell ** new_maze(int w, int h)
int i, j;
cell **m = array2(2 * w + 1, 2 * h + 1);
FOR(i, 2*h) FOR(j, 2*w) m[i][j] = U|D|L|R|WALL;
 
FOR(i, h) FOR(j, w) {
if (i && j) m[2*i - 1][2*j - 1] = 0;
if (i) m[2*i - 1][2*j] = U|D|WALL;
if (j) m[2*i][2*j - 1] = L|R|WALL;
}
FOR(i, 2*h) m[i][0] &= ~L, m[i][2*w] &= ~R;
FOR(j, 2*w) m[0][j] &= ~U, m[2*h][j] &= ~D;
 
return m;
}
 
Line 353 ⟶ 334:
if (c == ' ' && DOUBLE_SPACE) c = L' ';
color = m[i][j] & V;
 
printf("%s%lc%s", color ? "\033[31m":"", c,
color ? "\033[m":"");
Line 384 ⟶ 366:
continue;
 
visited = j;
/* tear down the wall */
switch(d[i]) {
Line 404 ⟶ 385:
break;
}
 
if ((visited = j) + 1 == w*h) break;
}
return visited;
 
cell ** new_maze(int w, int h)
int i, j;
cell **m = array2(2 * w + 1, 2 * h + 1);
FOR(i, 2*h) FOR(j, 2*w) m[i][j] = U|D|L|R|WALL;
 
FOR(i, h) FOR(j, w) {
if (i && j) m[2*i - 1][2*j - 1] = 0;
if (i) m[2*i - 1][2*j] = U|D|WALL;
if (j) m[2*i][2*j - 1] = L|R|WALL;
}
FOR(i, 2*h) m[i][0] &= ~L, m[i][2*w] &= ~R;
FOR(j, 2*w) m[0][j] &= ~U, m[2*h][j] &= ~D;
 
build(m, 1, 1, w, h, 0);
FOR(i, 2*h) FOR(j, 2*w) m[i][j] &= ~V;
 
return m;
}
 
Line 420 ⟶ 422:
FOR(i, 4) {
switch(i) {
case 0: if ( x <= 1 || (m[y][x-1] & (U|D))) continue; break;
break;
case 1: if (x+1 >= 2*w || (m[y][x+1] & (U|D))) continue; break;
case 21: if (yx+1 <>= 12*w || (m[y-1][x+1] & (LU|RD))) continue; break;
break;
case 32: if ( y+1 ><= 2*h1 || (m[y+-1][x] & (L|R))) continue; break;
break;
case 13: if (xy+1 >= 2*wh || (m[y+1][x+1] & (UL|DR))) continue; break;
break;
case 4: m[y][x] &= ~V; return 0;
}
Line 432 ⟶ 438:
 
switch(i) {
case 0: m[y][ x ] |= V|L; m[y][x-1] |= V|L|R; m[y][x-2] |= V|R;
m[y][x-1] |= V|L|R;
m[y][x-2] |= V|R;
break;
case 1: m[y][ x ] |= V|R; m[y][x+1] |= V|L|R; m[y][x+2] |= V|L;
m[y][x+1] |= V|L|R;
m[y][x+2] |= V|L;
break;
case 2: m[ y ][x] |= V|U; m[y-1][x] |= V|D|U; m[y-2][x] |= V|D;
m[y-1][x] |= V|D|U;
m[y-2][x] |= V|D;
break;
case 3: m[ y ][x] |= V|D; m[y+1][x] |= V|D|U; m[y+2][x] |= V|U;
m[y+1][x] |= V|D|U;
m[y+2][x] |= V|U;
break;
}
Line 455 ⟶ 453:
{
setlocale(LC_CTYPE, "");
srand(time(0));
 
int w = atoi(v[1]), h = atoi(v[2]), i, j;
cell **m = new_maze(w, h);
build(m, 1, 1, w, h, 0);
 
FOR(i, 2*h) FOR(j, 2*w) m[i][j] &= ~V;
solve(m, w, h, 1, 1, 2*w - 1, 2 * h - 1);
 
show_maze(m, w, h);
 
/* free(m) */
return 0;
}</lang>Running:<lang>┌─────┬───┬─────┬───────┬─────────┐
}</lang>output<lang>% ./a.out 17 8
│┄┄┄┄╮│╭┄╮│  ╭┄╮│╭┄┄┄┄┄╮│    ╭┄┄┄╮│
┌─┬───────┬─────┬─────┬───┬───────┐
├───╼┆│┆╷┆├─╼┆╷┆│┆┌─┬─╼┆│ ╺─┐┆┌─┐┆│
│┆│  ╭┄┄┄╮│  ╭┄╮│     │   │       │
│╭┄┄┄╯│┆│┆│╭┄╯│┆│┆│ │╭┄╯│   │┆│ │┆│
│┆│ ╷┆╺─┐┆└─╼┆╷┆└───┐ │ ╷ │ ┌─┬─╼ │
│┆┌───┘┆│┆│┆┌─┘┆│┆│ │┆┌─┘ ┌─┘┆│ ╵┆│
│┆│ │╰┄╮│╰┄┄┄╯│╰┄┄┄╮│ │ │ │ │ │   │
│┆│╭┄┄┄╯│┆│┆│╭┄╯│┆│ │┆│   │╭┄╯│╭┄╯│
│┆└─┴─╼┆├─────┴───┐┆│ ╵ │ ╵ ╵ │ ╺─┤
│┆╵┆┌───┤┆╵┆│┆╺─┘┆│ │┆└───┤┆┌─┘┆╺─┤
│╰┄┄┄┄┄╯│         │┆│   │     │   │
│╰┄╯│   │╰┄╯│╰┄┄┄╯│ │╰┄┄┄╮│┆│  ╰┄╮│
├─────┬─┘ ╺─────┐ │┆├───┴─┬───┼─╼ │
├───┘ ╷ ├───┼─────┤ └───┐┆│┆└─┬─┐┆│
│     │         │ │┆│╭┄┄┄╮│   │   │
├─╼│     │ ╺─────┐ └─┤┆│┆┌─┐┆│  │     │     │┆│╰┄╮│ │┆│
│ ┌───┘ └─╼ │ ╺─┐ ╵ ┌─╼ │┆└─┐┆│ ╵┆│
│   │ │       │   │┆│┆│ │┆│ │ │ │ │
│ ╺─┴─┴─┐│      ┌───┴─╼ │┆╵┆│ ╵┆│ │   │   │   │╰┄╮│┆│╭┄╯│
│ ├───┐ ┌───┴─╼ ├───┘ ╷ └─┐┆╵┆│┆┌─┤
│       │ │       │╰┄╯│╭┄╯│ │   │ │
│┆│  ╭┄┄┄╮│  ╭┄╮│        │     │   │╰┄╯│┆│ │
│ ╺─┬─┐ ╵ │ ╺─────┴───┤┆╺─┤ └───┴─┤
│ ╵ ╷ └─┘ ╺─────┤ ╺───┴───┴───┘┆╵ │
│   │ │   │           │╰┄╮│       │
│╰┄┄┄┄┄╯│   │        │┆│   │              ╰┄┄│
├─╼ ╵ └───┴─────────┐ └─╼┆└─────╼ │
└───┴───────────┴─────────────────┘</lang>
│                   │    ╰┄┄┄┄┄┄┄┄│
└───────────────────┴─────────────┘</lang>
 
=={{header|D}}==
Anonymous user