'===========================================================================
' Subject: VGA MAZE GENERATOR                 Date: 02-04-96 (00:59)       
'  Author: Steve Harmon                       Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: EGAVGA.ABC
'===========================================================================
'Don't remember if I wrote this or picked it up somewhere and modified it
'for VGA. It's a little slow, but it works.

100 SCREEN 12
110 CLS
115 DEFINT A-Z
120 A = 106 'width
130 B = 118 'height
140 DIM F(A, B)
150 FORE = 3: BACK = 0
240 FOR Y = 0 TO B * 4 STEP 4
242 FOR X = 0 TO 6 * A
244 PSET (X, Y), FORE: NEXT X, Y
290 FOR X = 0 TO 6 * A STEP 6
292 FOR Y = 0 TO 4 * B
294 PSET (X, Y), FORE: NEXT Y, X
340 FOR E = 1 TO B
342 FOR D = 1 TO A
344 F(D, E) = 0: NEXT D, E
390 J = INT(A / 2): K = INT(B / 2): X = -3: Y = -2: F(J, K) = 2
440 FOR E = 1 TO B: Y = Y + 4
442 FOR D = 1 TO A: X = X + 6
444   IF F(D, E) = 2 THEN GOSUB 540
450   IF INKEY$ <> "" THEN END
452 NEXT D: X = -3: NEXT E: Y = -2: GOTO 440
540 L = INT(RND(1) * 4 + 1)
550 IF D - 1 <> 0 AND F(D - 1, E) = 0 THEN F(D - 1, E) = 1
560 IF D = A THEN 570 ELSE IF F(D + 1, E) = 0 THEN F(D + 1, E) = 1
570 IF E - 1 <> 0 AND F(D, E - 1) = 0 THEN F(D, E - 1) = 1
580 IF B = E THEN 590 ELSE IF F(D, E + 1) = 0 THEN F(D, E + 1) = 1
590 IF L = 1 AND D - 1 <> 0 AND F(D - 1, E) = 1 THEN GOSUB 650
600 IF D = A THEN 610 ELSE IF L = 2 AND F(D + 1, E) = 1 THEN GOSUB 650
610 IF L = 3 AND E - 1 <> 0 AND F(D, E - 1) = 1 THEN GOSUB 720
620 IF B = E THEN 630 ELSE IF L = 4 AND F(D, E + 1) = 1 THEN GOSUB 720
630 IF A * B - 1 = M THEN 790
640 RETURN
650 IF L = 1 THEN F(D - 1, E) = 2: R = X - 3 ELSE IF L = 2 THEN F(D + 1, E) = 2: R = X + 3
660 FOR S = Y - 1 TO Y + 1: PSET (R, S), BACK: NEXT S: M = M + 1: RETURN
720 IF L = 3 THEN F(D, E - 1) = 2: S = Y - 2 ELSE IF L = 4 THEN F(D, E + 1) = 2: S = Y + 2
730 FOR R = X - 2 TO X + 2: PSET (R, S), BACK: NEXT R: M = M + 1: RETURN
790 X = 0: Y = INT(RND(1) * B + 1) * 4 - 3: FOR Y = Y TO Y + 2: PSET (X, Y), BACK: NEXT Y
800 X = A * 6: Y = INT(RND(1) * B + 1) * 4 - 2: FOR Y = Y TO Y + 2: PSET (X, Y), BACK: NEXT Y
890 BEEP: WHILE INKEY$ = "": WEND: END

