Qbasicnews.com

Full Version: maze code
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

Do not know if anyone would be able to use this but here is the code for what I have used to make my mazes. I have put as much info in it as I can. Good luck.

Doug

'************* This makes maze. All rooms will be visited and all rooms
'************* can be reached from every other room. There will be blank spaces
'************* to make it less dense like a dungeon(some rooms are filled in).
'************* You can remove The code that
'************* adds loops and removes dead ends to make a pure maze(all rooms used).
'************* The value of the array sps% could be saved as a file. It is the
'************* room number and the directions 1=north 2=south 3=west 4=east
'************* and if it is blocked(1) or open(0).

'************* The maze is drawn on screen 13 so you can see it. Once it is
'************* drawn press any key to make a new maze or ESC to exit.

'************* Change mx,my to change the size of the maze(max x=31 max y=19)
'************* Change lop to change the chance for a loop.(min = 2)
'************* Change dense to change the number of rooms with one exit that
'************* are filled in to make the dungeon less dense.

'************* mx=x size of maze
'************* my=y size of maze
'************* lop=chance of loops being made. A higher number is a lesser
'************* chance for a loop.
'************* dense=chance of dead ends being removed and filled in.
'************* sp=total spaces in maze(mx*my)
'************* vs%(#,#)=if room is visited first # is room x # second # is room y
'************* drt%(1-4)=random direction check for maze generation
'************* svbps%(#,1-4)=direction of doors of room 1st # is cell # 2nd # is
'************* direction(1=north 2=south 3=west 4=east) =blocked(1) or open(0)
'************* csp=current cell space (c = cy - 1 : cc = c * mx : csp = cc + cx)
'************* pcx=graphic x pcx = ((cx * 10) - 5)
'************* pcy=graphic y pcy = ((cy * 10) - 5)
'************* c and ts are used as space holders.

'************* Set screen 13.
'************* Randomize.
SCREEN 13
RANDOMIZE (timer)


st:
'((((-*-)))))) '************** start of program.


'*************
'************* Start of making the maze.
'*************




'************* Set maze size mx,my.Set lop as 5. Set denst as 5
mx = 20: my = 19 : lop = 5 : dense=5

'************* Clear the screen.
CLS

'************** Draw the mazes basic shape on the screen. Just rooms with no doors.
FOR xx = 1 TO (mx * 10) STEP 10
FOR yy = 1 TO (my * 10) STEP 10
LINE (xx, yy)-(xx + 9, yy + 9), 1, B
NEXT yy
NEXT xx



'*************
'************* Start of makeing the basic maze.
'*************


'************* sp=total spaces in maze(mx*my).
'************* vs%(#,#)=cell visited first # is cell # 2nt # is 0 not visited
'************* 1 visited .
'************* drt%(1-4)=direction check random for maze generation .
'************* sps%(#,1-4)=doors of cells 1st # is cell # 2nd # is direction
'************* 1=north 2=south 3=west 4=east =blocked(1) or open(0).
'************* dim arrays.
sp = (mx * my)
DIM vs%(mx, my), drt%(5), sps%(sp, 4), dsp%(sp)

'************* Set the array vs%(x,y) to all not visited(0).
'************* This makes all rooms not visited.
FOR t = 1 TO mx
FOR tt = 1 TO my
vs%(t, tt) = 0
NEXT tt
NEXT t

'************* Make array for each room and make each direction blocked(1).
'************* sps%(#,1-4)=blocked(1).
'************* This makes all rooms have no doors .
FOR t = 1 TO sp
sps%(t, 1) = 1
sps%(t, 2) = 1
sps%(t, 3) = 1
sps%(t, 4) = 1
NEXT t

'************* Pick a random room. This is a number between 1 and sp(total rooms
'************* in the maze).
rndsp = INT(RND(1) * sp) + 1

'************* This converts the room number into the cx,cy values.
c = INT(rndsp / mx)
cy = (c + 1)
cx = (rndsp - (c * mx))
IF cx = 0 THEN cx = mx: cy = cy - 1

'************** Set first random room as visited.
vs%(cx, cy) = 1

'((((-*-)))))) Pick random number 1 to 4, then set drt% as a random direction
'************** (1=north 2=south 3=west 4=east). drc is used to see if all directions
'************** have been checked. (1=1 direction checked 2=2 directions checked ect..)
pic:
dr = INT(RND(1) * 4) + 1
IF dr = 1 THEN drt%(1) = 1: drt%(2) = 2: drt%(3) = 3: drt%(4) = 4: drc = 1
IF dr = 2 THEN drt%(1) = 2: drt%(2) = 3: drt%(3) = 4: drt%(4) = 1: drc = 1
IF dr = 3 THEN drt%(1) = 3: drt%(2) = 4: drt%(3) = 1: drt%(4) = 2: drc = 1
IF dr = 4 THEN drt%(1) = 4: drt%(2) = 1: drt%(3) = 2: drt%(4) = 3: drc = 1

'((((-*-)))))) Check the direction to see if valid.
chdr:
'************** If all directions are invalid pick new visited room.
IF drc = 4 THEN drc = 1: GOTO fndvis:

'************** Set dc as the direction (1=north 2=south 3=west 4=east).
dc = drt%(drc)
'************** Check to see if there there is a room in that direction.
'************** If there is no room in that direction then add one to drc
'************** and go to chdr: to check the next direction.
IF dc = 1 AND cy = 1 THEN drc = drc + 1: GOTO chdr:
IF dc = 2 AND cy = my THEN drc = drc + 1: GOTO chdr:
IF dc = 3 AND cx = 1 THEN drc = drc + 1: GOTO chdr:
IF dc = 4 AND cx = mx THEN drc = drc + 1: GOTO chdr:

'************** Set the room you are looking at as lx,ly.
IF dc = 1 THEN ly = cy - 1: lx = cx
IF dc = 2 THEN ly = cy + 1: lx = cx
IF dc = 3 THEN lx = cx - 1: ly = cy
IF dc = 4 THEN lx = cx + 1: ly = cy

'************** If the room you are looking at is visited then then add one to drc
'************** and go to chdr: to check next direction.
IF vs%(lx, ly) = 1 THEN drc = drc + 1: GOTO chdr:

'************** If all directions are invalid then pick a new visited room.
IF drc = 4 THEN drc = 1: GOTO fndvis:

'************** Set current room as csp. Converts cx,cy into space number csp
c = cy - 1
cc = c * mx
csp = cc + cx

'************** Make door open in the direction (1=north 2=south 3=west 4=east).
'************** sps%(csp,direction)=0. From current room to the room you are
'************* looking at.
IF dc = 1 THEN sps%(csp, 1) = 0
IF dc = 2 THEN sps%(csp, 2) = 0
IF dc = 3 THEN sps%(csp, 3) = 0
IF dc = 4 THEN sps%(csp, 4) = 0

'************* Set graphic points for room.
pcx = ((cx * 10) - 5)
pcy = ((cy * 10) - 5)

'************** Draw the opening for the room.dc=(1=north 2=south 3=west 4=east).
IF dc = 1 THEN LINE (pcx - 1, pcy - 5)-(pcx + 2, pcy - 4), o, B
IF dc = 2 THEN LINE (pcx - 1, pcy + 5)-(pcx + 2, pcy + 6), o, B
IF dc = 3 THEN LINE (pcx - 5, pcy - 1)-(pcx - 4, pcy + 2), o, B
IF dc = 4 THEN LINE (pcx + 5, pcy - 1)-(pcx + 6, pcy + 2), o, B

'************** Make the room you are looking at the current room and make visited.
cx = lx: cy = ly: vs%(cx, cy) = 1

'******csp=current space cx,cy. Converts cx,cy into space number csp.
c = cy - 1
cc = c * mx
csp = cc + cx

'************** Make door open in the direction (1=north 2=south 3=west 4=east).
'************** sps%(csp,direction)=0. From current room and the room you just
'************* moved from.
IF dc = 1 THEN sps%(csp, 2) = 0
IF dc = 2 THEN sps%(csp, 1) = 0
IF dc = 3 THEN sps%(csp, 4) = 0
IF dc = 4 THEN sps%(csp, 3) = 0

'************** Check to see if all rooms have been visited. If not goto pic:
'************** to pick next room.
FOR t = 1 TO mx
FOR tt = 1 TO my
c = vs%(t, tt)
IF c = 0 THEN GOTO pic:
NEXT tt
NEXT t


'*************
'************* End of making the basic maze.
'*************


'*************
'************* Start of removing part of the dead ends to create loops.
'*************

'************* ts is used as a counter
'************* Check each room to see if it has only one exit. C counts
'************* the number of exits that are blocked in the room and if
'************* it is 3(only one exit) then it may be made into a loop.
ts = 1
FOR tt = 1 TO my
FOR t = 1 TO mx
c = 0: cc = 0
cc = sps%(ts, 1): c = c + cc
cc = sps%(ts, 2): c = c + cc
cc = sps%(ts, 3): c = c + cc
cc = sps%(ts, 4): c = c + cc

'************* Set graphic points for room.
pcx = ((t * 10) - 5)
pcy = ((tt * 10) - 5)

'************* If only one exit then goto lpic: and see if loop is made.
IF c = 3 THEN GOTO lpic:

'************* Go to lnext: to go to next room.
GOTO lnext:

'((((-*-))))))
lpic:
'************* Make a loop if rdd=2. This gives a one and lop chance for a
'************* room with only one exit to be made in to a loop. Go to lpic2:
'************* to make a loop.
rdd = INT(RND(1) * lop) + 1
IF rdd = 2 THEN GOTO lpic2:

'************* Goto lnext: to go to the next room.
GOTO lnext:

'((((-*-)))))) Pick random number 1 to 4, then set drt% as a random direction
'************** (1=north 2=south 3=west 4=east). drc is used to see if all directions
'************** have been checked. (1=1 direction checked 2=2 directions checked ect..)
lpic2:
dr = INT(RND(1) * 4) + 1
IF dr = 1 THEN drt%(1) = 1: drt%(2) = 2: drt%(3) = 3: drt%(4) = 4: drc = 1
IF dr = 2 THEN drt%(1) = 2: drt%(2) = 3: drt%(3) = 4: drt%(4) = 1: drc = 1
IF dr = 3 THEN drt%(1) = 3: drt%(2) = 4: drt%(3) = 1: drt%(4) = 2: drc = 1
IF dr = 4 THEN drt%(1) = 4: drt%(2) = 1: drt%(3) = 2: drt%(4) = 3: drc = 1

'((((-*-))))))
'************** If all directions are invalid pick new visited room.
lchdr:
IF drc = 4 THEN drc = 1: GOTO lnext:
dc = drt%(drc)

'************** Check to see if there there is a room in that direction.
'************** If there is no room in that direction then add one to drc
'************** and go to lchdr: to check the next direction.
IF dc = 1 AND tt = 1 THEN drc = drc + 1: GOTO lchdr:
IF dc = 2 AND tt = my THEN drc = drc + 1: GOTO lchdr:
IF dc = 3 AND t = 1 THEN drc = drc + 1: GOTO lchdr:
IF dc = 4 AND t = mx THEN drc = drc + 1: GOTO lchdr:

'************** Set the room you are looking at as lx,ly.
IF dc = 1 THEN ly = tt - 1: lx = t
IF dc = 2 THEN ly = tt + 1: lx = t
IF dc = 3 THEN lx = t - 1: ly = tt
IF dc = 4 THEN lx = t + 1: ly = tt

'************** Set current room as csp. Converts cx,cy into space number csp
c = tt - 1
cc = c * mx
csp = cc + t

'************** Make door open in the direction (1=north 2=south 3=west 4=east).
'************** sps%(csp,direction)=0. From current room to the room you are
'************* looking at.
IF dc = 1 THEN sps%(csp, 1) = 0
IF dc = 2 THEN sps%(csp, 2) = 0
IF dc = 3 THEN sps%(csp, 3) = 0
IF dc = 4 THEN sps%(csp, 4) = 0

'************* Set graphic points for room.
pcx = ((t * 10) - 5)
pcy = ((tt * 10) - 5)

'************** Draw the opening for the room.dc=(1=north 2=south 3=west 4=east).
IF dc = 1 THEN LINE (pcx - 1, pcy - 5)-(pcx + 2, pcy - 4), o, B
IF dc = 2 THEN LINE (pcx - 1, pcy + 5)-(pcx + 2, pcy + 6), o, B
IF dc = 3 THEN LINE (pcx - 5, pcy - 1)-(pcx - 4, pcy + 2), o, B
IF dc = 4 THEN LINE (pcx + 5, pcy - 1)-(pcx + 6, pcy + 2), o, B

'************** Make the room you are looking at the current room and make visited.
cx = lx: cy = ly: vs%(cx, cy) = 1
c = cy - 1
cc = c * mx
csp = cc + cx

'************** Make door open in the direction (1=north 2=south 3=west 4=east).
'************** sps%(csp,direction)=0. From current room and the room you just
'************* moved from.
IF dc = 1 THEN sps%(csp, 2) = 0
IF dc = 2 THEN sps%(csp, 1) = 0
IF dc = 3 THEN sps%(csp, 4) = 0
IF dc = 4 THEN sps%(csp, 3) = 0

'((((-*-))))))
'********** Next room.
lnext:
ts = ts + 1
NEXT t
NEXT tt


'*************
'************* End of removing part of the dead ends to create loops.
'*************


'*************
'************* Start of filling in dead ends to make maze less dense.
'*************


'************* count the number of rooms with only one exit.
'************* if dead end then remove room and door to other room and door from
'************* other room. Do it dense times. The higher dense is the less dense
'************* the maze is
FOR v = 1 TO dense

'************* ts is used as a counter
'************* Check each room to see if it has only one exit. C counts
'************* the number of exits that are blocked in the room and if
'************* it is 3(only one exit) then it may be filled in.
ts = 1
FOR tt = 1 TO my
FOR t = 1 TO mx
c = 0: cc = 0
cc = sps%(ts, 1): c = c + cc
cc = sps%(ts, 2): c = c + cc
cc = sps%(ts, 3): c = c + cc
cc = sps%(ts, 4): c = c + cc

'************* Set graphic points for room.
pcx = ((t * 10) - 5)
pcy = ((tt * 10) - 5)

'************* if only one exit erase the room and remove doors from both rooms.
'************* Fill the room.
IF c = 3 AND sps%(ts, 1) = 0 THEN LINE (pcx - 3, pcy - 5)-(pcx + 4, pcy + 4), 1, BF: sps%((ts - mx), 2) = 1: vs%(t, tt) = 1
IF c = 3 AND sps%(ts, 2) = 0 THEN LINE (pcx - 3, pcy - 3)-(pcx + 4, pcy + 6), 1, BF: sps%((ts + mx), 1) = 1: vs%(t, tt) = 1
IF c = 3 AND sps%(ts, 3) = 0 THEN LINE (pcx - 5, pcy - 4)-(pcx + 4, pcy + 4), 1, BF: sps%((ts - 1), 4) = 1: vs%(t, tt) = 1
IF c = 3 AND sps%(ts, 4) = 0 THEN LINE (pcx - 3, pcy - 4)-(pcx + 6, pcy + 4), 1, BF: sps%((ts + 1), 3) = 1: vs%(t, tt) = 1
ts = ts + 1
NEXT t
NEXT tt
NEXT v



'*************
'************* End of filling in dead ends to make maze less dense.
'*************



'*************
'************* end of makeing the maze.
'*************

'*************
'************* Start of waiting for input to make new maze or exit.
'*************

'************** Loop untill a key is pressed.
do
a$=inkey$
'************** End the program.
if a$=chr$(27) then end
if a$=chr$(255)+"X" then end
loop while a$=""
Goto st:



'*************
'************* End of waiting for input to make new maze or exit.
'*************


'*************
'************* Start of finding a random room and checking if it has been visited.
'*************

'((((-*-))))))
fndvis:
'************* Pick a random room. This is a number between 1 and sp(total rooms
'************* in the maze).
rndsp = INT(RND(1) * sp) + 1

'************* This converts the room number into the cx,cy values.
c = INT(rndsp / mx)
cy = (c + 1)
cx = (rndsp - (c * mx))
IF cx = 0 THEN cx = mx: cy = cy - 1

'************** Check to see if the room has been visited. If not goto pic:
'************** to pick next room.
IF vs%(cx, cy) = 1 THEN GOTO pic:
GOTO fndvis:


'*************
'************* End of finding a random room and checking if it has been visited.
'*************