Maze generation: Difference between revisions
Content added Content deleted
mNo edit summary |
Johnicholas (talk | contribs) |
||
Line 3,328: | Line 3,328: | ||
-- Fisher-Yates shuffle from http://santos.nfshost.com/shuffling.html |
-- Fisher-Yates shuffle from http://santos.nfshost.com/shuffling.html |
||
function shuffle(t) |
function shuffle(t) |
||
for i = 1, #t - 1 do |
|||
local r = math.random(i, #t) |
|||
t[i], t[r] = t[r], t[i] |
|||
end |
|||
end |
end |
||
-- builds a width-by-height grid of |
-- builds a width-by-height grid of trues |
||
function initialize_grid(w, h) |
function initialize_grid(w, h) |
||
local a = {} |
|||
for i = 1, h do |
|||
table.insert(a, {}) |
|||
for j = 1, w do |
|||
table.insert(a[i], true) |
|||
end |
|||
end |
|||
return a |
|||
end |
end |
||
-- average of a and b |
-- average of a and b |
||
function avg(a, b) |
function avg(a, b) |
||
return (a + b) / 2 |
|||
end |
end |
||
dirs = { |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
|||
function make_maze(w, h) |
function make_maze(w, h) |
||
w = w or 16 |
|||
h = h or 8 |
|||
local map = initialize_grid(w*2+1, h*2+1) |
|||
function walk(x, y) |
|||
map[y][x] = false |
|||
local d = { 1, 2, 3, 4 } |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
local xx = x + dirs[dirnum].x |
|||
⚫ | |||
local yy = y + dirs[dirnum].y |
|||
⚫ | |||
⚫ | |||
} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
|||
local xx = dir.x |
|||
⚫ | |||
local yy = dir.y |
|||
⚫ | |||
⚫ | |||
-- out of bounds north or south |
|||
elseif map[yy][xx] == nil then |
|||
-- out of bounds east or west |
|||
elseif map[yy][xx] then |
|||
-- already visited |
|||
else |
|||
if xx == x then |
|||
⚫ | |||
else -- by elimination, yy == y |
|||
map[y][avg(x, xx)] = true |
|||
⚫ | |||
⚫ | |||
end |
|||
⚫ | |||
end |
|||
walk(math.random(1, w)*2, math.random(1, h)*2) |
|||
local s = {} |
|||
for i = 1, h*2+1 do |
|||
for j = 1, w*2+1 do |
|||
if map[i][j] then |
|||
table.insert(s, '#') |
|||
else |
|||
table.insert(s, ' ') |
|||
end |
|||
end |
|||
table.insert(s, '\n') |
|||
end |
|||
return table.concat(s) |
|||
end |
end |
||