Randomized Maze Generator using Prim's Algorithm
daggaz
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
//PRIM's ALGORITHM: RANDOMIZED MAZE GENERATOR
//coded by Ian Allen, 13, June, 2013
function maze_maker(dim_x,dim_y)
variable dim_x, dim_y // maze dimensions, recommended to use odd values but even does work
//initiate the maze
make/o/d/n=(dim_x,dim_y) maze = 1
make/o/d/n=(dim_x,dim_y) cell_logic = 0
make/o/d/n=(1,4) wall_list = 0 // [x_coord,y_coord,delta_x,delta_y] delta is where to check for the adjacent cell
variable/g num_walls = 0
variable i
for(i=0;i<dim_x;i+=2)
maze[i][] = 0
maze[][i] = 0
endfor
//newimage cell_logic
newimage maze
dowindow/c/w=graph0 maze_win
//pick a seed cell to begin process
variable x_coord = floor((enoise(.4999) + .5)*((dim_x - 2)/2)) * 2 + 1
variable y_coord = floor((enoise(.4999) + .5)*((dim_y - 2)/2)) * 2 + 1
variable wall_num
print x_coord,y_coord
cell_logic[x_coord][y_coord] = 1
//add the walls to the list
maze_maker_add_walls(x_coord,y_coord,dim_x,dim_y)
do
//roll for a wall and check it
wall_num = floor((enoise(.4999) + .5)*num_walls)
maze_maker_check_wall(wall_num,dim_x,dim_y)
while (num_walls > 0)
end
//---subroutine 1----//
function maze_maker_add_walls(x_coord,y_coord, dim_x,dim_y)
variable x_coord,y_coord, dim_x,dim_y //x y coord are cell coordinates not wall coordinates
nvar num_walls
wave wall_list,maze
//add the walls to the list if they exist and are not edge walls
if ( x_coord -1 != 0 && maze[x_coord-1][y_coord] == 0) // LEFT wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord - 1
wall_list[0][1] = y_coord
wall_list[0][2] = -1
wall_list[0][3] = 0
num_walls +=1
endif
if ( x_coord + 1 != (dim_x -1) && maze[x_coord+1][y_coord] == 0) // RIGHT wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord + 1
wall_list[0][1] = y_coord
wall_list[0][2] = 1
wall_list[0][3] = 0
num_walls +=1
endif
if ( y_coord - 1 != 0 && maze[x_coord][y_coord -1] == 0) // TOP wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord
wall_list[0][1] = y_coord -1
wall_list[0][2] = 0
wall_list[0][3] = -1
num_walls +=1
endif
if ( y_coord + 1 != (dim_y -1) && maze[x_coord][y_coord +1] ==0) // BOTTOM wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord
wall_list[0][1] = y_coord + 1
wall_list[0][2] = 0
wall_list[0][3] = 1
num_walls +=1
endif
print num_walls
end
//---subroutine2---//
function maze_maker_check_wall(wall_num,dim_x,dim_y)
variable wall_num,dim_x,dim_y
nvar num_walls
wave wall_list,cell_logic,maze
variable x_coord = wall_list[wall_num][0] // wall coordinates
variable y_coord = wall_list[wall_num][1]
variable new_x = x_coord + wall_list[wall_num][2] // adjacent room coordinates
variable new_y = y_coord + wall_list[wall_num][3]
if (cell_logic[new_x][new_y] == 0)
maze[x_coord][y_coord] = 1
//insert update command here when you figure it out
doupdate/w=maze_win
cell_logic[new_x][new_y] = 1
deletepoints (wall_num),1,wall_list
num_walls -= 1
maze_maker_add_walls(new_x,new_y, dim_x,dim_y)
else
deletepoints (wall_num),1,wall_list
num_walls -=1
endif
end
//PRIM's ALGORITHM: RANDOMIZED MAZE GENERATOR
//coded by Ian Allen, 13, June, 2013
function maze_maker(dim_x,dim_y)
variable dim_x, dim_y // maze dimensions, recommended to use odd values but even does work
//initiate the maze
make/o/d/n=(dim_x,dim_y) maze = 1
make/o/d/n=(dim_x,dim_y) cell_logic = 0
make/o/d/n=(1,4) wall_list = 0 // [x_coord,y_coord,delta_x,delta_y] delta is where to check for the adjacent cell
variable/g num_walls = 0
variable i
for(i=0;i<dim_x;i+=2)
maze[i][] = 0
maze[][i] = 0
endfor
//newimage cell_logic
newimage maze
dowindow/c/w=graph0 maze_win
//pick a seed cell to begin process
variable x_coord = floor((enoise(.4999) + .5)*((dim_x - 2)/2)) * 2 + 1
variable y_coord = floor((enoise(.4999) + .5)*((dim_y - 2)/2)) * 2 + 1
variable wall_num
print x_coord,y_coord
cell_logic[x_coord][y_coord] = 1
//add the walls to the list
maze_maker_add_walls(x_coord,y_coord,dim_x,dim_y)
do
//roll for a wall and check it
wall_num = floor((enoise(.4999) + .5)*num_walls)
maze_maker_check_wall(wall_num,dim_x,dim_y)
while (num_walls > 0)
end
//---subroutine 1----//
function maze_maker_add_walls(x_coord,y_coord, dim_x,dim_y)
variable x_coord,y_coord, dim_x,dim_y //x y coord are cell coordinates not wall coordinates
nvar num_walls
wave wall_list,maze
//add the walls to the list if they exist and are not edge walls
if ( x_coord -1 != 0 && maze[x_coord-1][y_coord] == 0) // LEFT wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord - 1
wall_list[0][1] = y_coord
wall_list[0][2] = -1
wall_list[0][3] = 0
num_walls +=1
endif
if ( x_coord + 1 != (dim_x -1) && maze[x_coord+1][y_coord] == 0) // RIGHT wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord + 1
wall_list[0][1] = y_coord
wall_list[0][2] = 1
wall_list[0][3] = 0
num_walls +=1
endif
if ( y_coord - 1 != 0 && maze[x_coord][y_coord -1] == 0) // TOP wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord
wall_list[0][1] = y_coord -1
wall_list[0][2] = 0
wall_list[0][3] = -1
num_walls +=1
endif
if ( y_coord + 1 != (dim_y -1) && maze[x_coord][y_coord +1] ==0) // BOTTOM wall
insertpoints 0,1, wall_list
wall_list[0][0] = x_coord
wall_list[0][1] = y_coord + 1
wall_list[0][2] = 0
wall_list[0][3] = 1
num_walls +=1
endif
print num_walls
end
//---subroutine2---//
function maze_maker_check_wall(wall_num,dim_x,dim_y)
variable wall_num,dim_x,dim_y
nvar num_walls
wave wall_list,cell_logic,maze
variable x_coord = wall_list[wall_num][0] // wall coordinates
variable y_coord = wall_list[wall_num][1]
variable new_x = x_coord + wall_list[wall_num][2] // adjacent room coordinates
variable new_y = y_coord + wall_list[wall_num][3]
if (cell_logic[new_x][new_y] == 0)
maze[x_coord][y_coord] = 1
//insert update command here when you figure it out
doupdate/w=maze_win
cell_logic[new_x][new_y] = 1
deletepoints (wall_num),1,wall_list
num_walls -= 1
maze_maker_add_walls(new_x,new_y, dim_x,dim_y)
else
deletepoints (wall_num),1,wall_list
num_walls -=1
endif
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
and you will discover a problem on the Right wall (rtGlobals=3).
June 13, 2013 at 04:04 pm - Permalink