Messing around a little and thought I would post this code. It creates a simple "perfect maze" style dungeon. by changing mapwidth, mapheight you of course change the dimensions of the dungeon and by changing the density you get more corridors. You can fiddle with the number of rooms easily as well. A little slow because it draws the dungeon as it makes it but really quick if you shut that off.
sync on
set display mode 800,600,32
randomize timer()
type cell
visited as integer
xpos as integer
ypos as integer
xconnect as integer
yconnect as integer
room as integer
endtype
mapwidth=50
mapheight = 50
dens as float =.15
map_density=(mapwidth*mapheight)*dens
rooms=rnd(10)+10
dim maze(mapwidth,mapheight) as cell
startx=rnd(mapwidth):starty=rnd(mapheight)
maze(startx,starty).visited=1
maze(startx,starty).xpos=startx
maze(startx,starty).ypos=starty
maze(startx,starty).xconnect=startx
maze(startx,starty).yconnect=starty
repeat
blocked=0
if startx-1<=0
inc blocked
else
if maze(startx-1,starty).visited=1 then inc blocked
endif
if starty-1<=0
inc blocked
else
if maze(startx,starty-1).visited=1 then inc blocked
endif
if startx+1>=mapwidth
inc blocked
else
if maze(startx+1,starty).visited=1 then inc blocked
endif
if starty+1>=mapheight
inc blocked
else
if maze(startx,starty+1).visited=1 then inc blocked
endif
if blocked<4
repeat
open=1
direction=rnd(4)+1
select direction
case 1:
if starty-1>=0
if maze(startx,starty-1).visited=0
newx=startx:newy=starty-1
maze(newx,newy).visited=1
maze(newx,newy).xpos=newx
maze(newx,newy).ypos=newy
maze(newx,newy).xconnect=startx
maze(newx,newy).yconnect=starty
open=0
startx=newx:starty=newy
endif
endif
endcase
case 2:
if starty+1<=mapheight
if maze(startx,starty+1).visited=0
newx=startx:newy=starty+1
maze(newx,newy).visited=1
maze(newx,newy).xpos=newx
maze(newx,newy).ypos=newy
maze(newx,newy).xconnect=startx
maze(newx,newy).yconnect=starty
open=0
startx=newx:starty=newy
endif
endif
endcase
case 3:
if startx-1>=0
if maze(startx-1,starty).visited=0
newx=startx-1:newy=starty
maze(newx,newy).visited=1
maze(newx,newy).xpos=newx
maze(newx,newy).ypos=newy
maze(newx,newy).xconnect=startx
maze(newx,newy).yconnect=starty
open=0
startx=newx:starty=newy
endif
endif
endcase
case 4:
if startx+1<=mapwidth
if maze(startx+1,starty).visited=0
newx=startx+1
newy=starty
maze(newx,newy).visited=1
maze(newx,newy).xpos=newx
maze(newx,newy).ypos=newy
maze(newx,newy).xconnect=startx
maze(newx,newy).yconnect=starty
open=0
startx=newx:starty=newy
endif
endif
endcase
endselect
until open=0
else
repeat
xx=rnd(mapwidth)
yy=rnd(mapheight)
until maze(xx,yy).visited=1
startx=xx:starty=yy
endif
density=0
for a=0 to mapwidth
for b=0 to mapheight
if maze(a,b).visited=1 then inc density
line maze(a,b).xpos*10,maze(a,b).ypos*10,maze(a,b).xconnect*10,maze(a,b).yconnect*10
next b
next a
if density>=map_density then map_complete=1
sync
until map_complete=1
for a = 1 to rooms
repeat
repeat
xx=rnd(mapwidth):yy=rnd(mapheight)
until xx>=1 and xx<=mapwidth-1 and yy>=1 and yy<=mapheight-1
until maze(xx,yy).visited=1 and maze(xx,yy).room=0 and maze(xx-1,yy).room=0 and maze(xx+1,yy).room=0 and maze(xx,yy+1).room=0 and maze(xx,yy-1).room=0
maze(xx,yy).room=1
next a
do
cls
for a=0 to mapwidth
for b=0 to mapheight
ink rgb(255,255,255),0
line maze(a,b).xpos*10,maze(a,b).ypos*10,maze(a,b).xconnect*10,maze(a,b).yconnect*10
next b
next a
for a = 0 to mapwidth:for b = 0 to mapheight
if maze(a,b).room=1
ink rgb(255,0,0),0
box a*10-5,b*10-5,a*10+5,b*10+5
endif
next b:next a
text 400,400,"DONE"
sync
loop