two maze generators

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

02-03-2011, 00:36

Adapted TRS80 BASIC (http://www.vavasour.ca/jeff/level1/entry6_preview.html)

maze1

10 DEFINT A-Z:DIM A(42*21*3)
30 GOSUB 440:SCREEN 2:GOSUB 330:GOTO 160
40 S=Q
50 IF Q<>A(Q) THEN Q=A(Q):GOTO 50
60 O=A(S):A(S)=Q:S=O:IF O<>Q THEN 60
70 RETURN
80 '
90 IF W=V THEN 140
130 A=W+INT(W/(N-1)):B=A+1:RETURN
140 A=W-V:B=W-V+N:RETURN
150 '
160 U=T:COLOR C
170 FOR D=1 TO R-1
180 G=RND(1)*U+R-1:W=A(G):A(G)=A(R+U-1):U=U-1
190 GOSUB 120
200 Q=A:GOSUB 40:P=Q
210 Q=B:GOSUB 40
220 IF P=Q THEN 180
230 A(Q)=P
240 GOSUB 90
250 NEXT D
260 PSET(1,0):PSET(2,0)
270 PSET(3*N-1,2*M):PSET(3*N-2,2*M)
280 COLOR 5: PRINT "MAZE COMPLETE, PRESS ";
290 COLOR 12:PRINT "<ENTER>";:COLOR 5
300 INPUT " FOR A NEW MAZE";A$
310 GOTO 20
320 '
330 PRINT "INITIALIZING...";
340 R=M*N:V=M*(N-1):H=(M-1)*N:T=2*M*N-M-N
350 FOR I=0 TO R-1:A(I)=I:NEXT I
360 FOR I=0 TO T-1:A(I+R)=I:NEXT I
370 CLS:COLOR G
380 FOR X=0 TO 3*N STEP 3:FOR Y=0 TO 2*M:PSET(X,Y):NEXTY:NEXTX
390 FOR Y=0 TO 2*M STEP 2:FOR X=0 TO 3*N:PSET(X,Y):NEXTX:NEXTY
400 COLOR C
410 FOR Y=1 TO 2*M STEP 2:FOR X=1 TO 3*N STEP 3:PSET(X,Y):PSET(X+1,Y):NEXTX:NEXTY
420 RETURN
430 '
440 E=0:C=1:G=14:COLOR G,C,C:CLS
445 CLS:INPUT"ENTER DESIRED MAZE DIMENSIONS (MAX 42,21)";H,V
446 IF(H<1)+(V<1)+(H>42)+(V>21)THEN 445
450 N=H:M=V
460 RETURN


maze2

10 DEFINT A-Z
20 CLS:INPUT"ENTER DESIRED MAZE DIMENSIONS (MAX 42,21)";H,V
30 IF(H<1)+(V<1)+(H>42)+(V>21)THEN 20
40 CLS:COLOR 15,0,0:SCREEN2
50 ' INITIALIZE FOUNDATION
60 FOR X=1TO1+H*3:FOR Y=1TO1+V*2:PSET(X,Y):NEXT Y:NEXT X
70 ' SHOW ENTRANCE
80 X=RND(1)*H:Y=1:PRESET(X*3,1):PRESET(X*3-1,1)
90 ' FILL MAZE WITH PATHS UNTIL ALL CELLS HAVE BEEN CLEARED
100 C=H*V
110 ' CLEAR CURRENT CELL
120 PRESET(X*3,Y*2):PRESET(X*3-1,Y*2):C=C-1:IFC<1GOTO 300
130 ' JUST VISIT CURRENT CELL
140 M=X*3:N=Y*2
150 ' SURVEY SURROUNDING AREA
160 L=(X>1)*POINT(M-3,N):R=0:IF(X1)*POINT(M,N-2):D=(YV THEN Y=1:X=X+1:IFX>H THEN X=1
210 IF POINT(X*3,Y*2) THEN 200
220 GOTO 140
230 ' KNOCK DOWN A WALL IN A RANDOM BUT LEGAL DIRECTION
240 IF L*(4*RND(1)<1) THEN PRESET(M-2,N):X=X-1:GOTO 120
250 IF R*(4*RND(1)<1) THEN PRESET(M+1,N):X=X+1:GOTO 120
260 IF U*(4*RND(1)<1) THEN PRESET(M,N-1):PRESET(M-1,N-1):Y=Y-1:GOTO120
270 IF D*(4*RND(1)<1) THEN PRESET(M,N+1):PRESET(M-1,N+1):Y=Y+1:GOTO120
280 GOTO240
290 ' SHOW EXIT
300 X=RND(1)*H:PRESET(X*3-1,1+V*2):PRESET(X*3,1+V*2)
310 INPUT"...DONE!";A$:GOTO 20


Enjoy! Let me know how they go !!

Для того, чтобы оставить комментарий, необходимо регистрация или !login

By fukenko

Champion (357)

Аватар пользователя fukenko

02-03-2011, 03:19

At least 'INPUT' in 300(maze1) and 310(maze2) should be modified.
If we execute 'INPUT' on SCREEN2,screen mode turns to SCREEN1 and maze will be cleared.Crying

By Vampier

Prophet (2409)

Аватар пользователя Vampier

02-03-2011, 06:48

nice! Big smile

option 2 doesn't work with 10x10 mazes.... I like option 1 since it's faster

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

02-03-2011, 08:20

it is a bug caused by me while porting
the original works with any size and is a lot much faster

http://www.vavasour.ca/jeff/level1/entry52.html

This is the fixed version
Enjoy!

Fixed maze 2

10 DEFINT A-Z
20 CLS:INPUT"ENTER DESIRED MAZE DIMENSIONS (MAX 42,21)";H,V
30 IF(H<1)+(V<1)+(H>42)+(V>21)THEN 20
40 CLS:COLOR 15,0,0:SCREEN2
50 ' INITIALIZE FOUNDATION
60 FOR X=1TO1+H*3:FOR Y=1TO1+V*2:PSET(X,Y):NEXT Y:NEXT X
70 ' SHOW ENTRANCE
80 X=RND(1)*H:Y=1:PRESET(X*3,1):PRESET(X*3-1,1)
90 ' FILL MAZE WITH PATHS UNTIL ALL CELLS HAVE BEEN CLEARED
100 C=H*V
110 ' CLEAR CURRENT CELL
120 PRESET(X*3,Y*2):PRESET(X*3-1,Y*2):C=C-1:IFC<1GOTO 300
130 ' JUST VISIT CURRENT CELL
140 M=X*3:N=Y*2
150 ' SURVEY SURROUNDING AREA
160 L=(X>1)*POINT(M-3,N):R=(X1)*POINT(M,N-2):D=(YV THEN Y=1:X=X+1:IFX>H THEN X=1
210 IF POINT(X*3,Y*2) THEN 200
220 GOTO 140
230 ' KNOCK DOWN A WALL IN A RANDOM BUT LEGAL DIRECTION
240 IF R*(RND(1)<0.25) THEN PRESET(M+1,N):X=X+1:GOTO 120
250 IF L*(RND(1)<0.25) THEN PRESET(M-2,N):X=X-1:GOTO 120
260 IF U*(RND(1)<0.25) THEN PRESET(M,N-1):PRESET(M-1,N-1):Y=Y-1:GOTO120
270 IF D*(RND(1)<0.25) THEN PRESET(M,N+1):PRESET(M-1,N+1):Y=Y+1:GOTO120
280 GOTO240
290 ' SHOW EXIT
300 X=RND(1)*H:PRESET(X*3-1,1+V*2):PRESET(X*3,1+V*2)
310 INPUT"...DONE!";A$:GOTO 20

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

03-03-2011, 00:04

this second solution seems much faster than the first.
i could even resurrect the doom project...

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

09-03-2011, 15:39

New random maze generator implemented at
https://sites.google.com/site/testmsx/msx2-doom

Run M3D.BIN in a TR as SCC rom