Maze generation: Difference between revisions
Content added Content deleted
imported>BlueWren |
(FutureBasic solution added) |
||
Line 4,313: | Line 4,313: | ||
[[File:Fōrmulæ - Maze generation 07.png]] |
[[File:Fōrmulæ - Maze generation 07.png]] |
||
=={{header|FutureBasic}}== |
|||
<syntaxhighlight lang="futurebasic"> |
|||
_rows = 9 |
|||
_cols = 11 |
|||
_size = 32 |
|||
_mgn = 32 |
|||
_t = ( 1 << 0 ) |
|||
_l = ( 1 << 1 ) |
|||
_b = ( 1 << 2 ) |
|||
_r = ( 1 << 3 ) |
|||
_a = _t + _l + _b + _r |
|||
_window = 1 |
|||
void local fn BuildWindow |
|||
window _window, @"FutureBasic - Maze generation", (0,0,_cols*_size+_mgn*2,_rows*_size+_mgn*2), NSWindowStyleMaskTitled |
|||
end fn |
|||
local fn CellAvailable( r as long, c as long ) as BOOL |
|||
if ( r < 0 || c < 0 || r >= _rows || c >= _cols ) then exit fn |
|||
if ( mda_integer(r,c) == _a ) then exit fn = YES |
|||
end fn = NO |
|||
void local fn ProcessCell( r as long, c as long ) |
|||
long r1 = r, c1 = c, d(3), count, dir, opp |
|||
while ( 1 ) |
|||
BlockZero( @d(0), sizeof(long) * 4 ) |
|||
count = 0 |
|||
if ( fn CellAvailable( r - 1, c ) ) then d(count) = _t : count++ |
|||
if ( fn CellAvailable( r, c - 1 ) ) then d(count) = _l : count++ |
|||
if ( fn CellAvailable( r + 1, c ) ) then d(count) = _b : count++ |
|||
if ( fn CellAvailable( r, c + 1 ) ) then d(count) = _r : count++ |
|||
if ( count == 0 ) then break |
|||
dir = d(rnd(count)-1) |
|||
mda(r,c) = @(mda_integer(r,c) - dir) |
|||
select ( dir ) |
|||
case _t |
|||
r1 = r-1 : opp = _b |
|||
case _l |
|||
c1 = c-1 : opp = _r |
|||
case _b |
|||
r1 = r+1 : opp = _t |
|||
case _r |
|||
c1 = c+1 : opp = _l |
|||
end select |
|||
mda(r1,c1) = @(mda_integer(r1,c1) - opp) |
|||
fn ProcessCell( r1, c1 ) |
|||
wend |
|||
end fn |
|||
void local fn DrawMaze |
|||
long r, c, x = _mgn, y = _mgn, value |
|||
pen 2,, NSLineCapStyleRound |
|||
for r = 0 to _rows - 1 |
|||
for c = 0 to _cols - 1 |
|||
value = mda(r,c) |
|||
if ( value & _t ) then line x, y to x + _size, y |
|||
if ( value & _l ) then line x, y to x, y + _size |
|||
if ( value & _b ) then line x, y + _size to x + _size, y + _size |
|||
if ( value & _r ) then line x + _size, y to x + _size, y + _size |
|||
x += _size |
|||
next |
|||
x = _mgn |
|||
y += _size |
|||
next |
|||
end fn |
|||
void local fn BuildMaze |
|||
long r, c |
|||
for r = 0 to _rows - 1 |
|||
for c = 0 to _cols - 1 |
|||
mda(r,c) = _a |
|||
next |
|||
next |
|||
random |
|||
r = rnd(_rows) - 1 |
|||
c = rnd(_cols) - 1 |
|||
fn ProcessCell( r, c ) |
|||
fn DrawMaze |
|||
end fn |
|||
fn BuildWindow |
|||
fn BuildMaze |
|||
HandleEvents |
|||
</syntaxhighlight> |
|||
{{output}} |
|||
<pre style="height:40ex;"> |
|||
[[file:FutureBasic - Maze generation1.png]] |
|||
[[file:FutureBasic - Maze generation2.png]] |
|||
</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |