0  REM MODIFIED FOR USE ON THE IBM-PC
1  REM BY GARY & DONNA MCCOY
2 KEY OFF
3 CLEAR,,20000
4 SCREEN 0:WIDTH 40
200  CLS : GOTO 6400
800 N = 2:A = H:B = V:FF = 2 ^ (F - 1)
900 SCREEN 1:COLOR 0,1:CLS
1000 Z = M(A,B) * FF
1200  IF  FN M(Z / 16) = 0 THEN 1600
1300 RL =  - 1: GOSUB 5400
1400  GOTO 2000
1600 W = M(A + S,B - R) * FF
1700  IF  FN M(W / 128) = 0 THEN 2000
1800 RL =  - 1: GOSUB 4600
2000  IF  FN M(Z / 64) = 0 THEN 2400
2100 RL = 1: GOSUB 5400
2200  GOTO 2800
2400 W = M(A - S,B + R) * FF
2500  IF  FN M(W / 128) = 0 THEN 2800
2600 RL = 1: GOSUB 4600
2800  IF  FN M(Z / 128) = 1 THEN 3400
3000 N = N + 1: IF N > 8 THEN 3500
3100 A = A + R:B = B + S: IF B < 2 THEN 3500
3200  GOTO 1000
3400  GOSUB 3800
3500  RETURN
3800  PSET (VX + DX(N),YU(N)),2
3900  LINE (VX + DX(N),YU(N))-(VX + DX(N),YD(N)),2
4000  LINE (VX + DX(N),YD(N))-(VX - DX(N),YD(N)),2
4100  LINE (VX - DX(N),YD(N))-(VX - DX(N),YU(N)),2
4200  LINE (VX - DX(N),YU(N))-(VX + DX(N),YU(N)),2
4300  RETURN
4600  PSET (VX + RL * DX(N - 1),YU(N)),2
4700  LINE (VX + RL * DX(N - 1),YU(N))-(VX + RL * DX(N),YU(N)),2
4800  LINE (VX + RL * DX(N),YU(N))-(VX + RL * DX(N),YD(N)),2
4900  LINE (VX + RL * DX(N),YD(N))-(VX + RL * DX(N - 1),YD(N)),2
5000  RETURN
5400  PSET(VX + RL * DX(N - 1),YU(N - 1)),2
5500 LINE (VX + RL * DX(N-1),YU(N-1))-(VX + RL * DX(N),YU(N)),2
5600  LINE (VX + RL * DX(N),YU(N))-(VX + RL * DX(N),YD(N)),2
5700  LINE (VX + RL * DX(N),YD(N))-(VX + RL * DX(N - 1),YD(N - 1)),2
5800  IF N > 2 THEN  LINE (VX + RL * DX(N-1),YD(N-1))-(VX + RL * DX(N - 1),YU(N - 1)),2
5900  RETURN
6400  CLS:COLOR 9,0:LOCATE 6,12: PRINT "YOU ARE THE RAT!": PRINT : LOCATE 4,4: PRINT "A DIFFERENT PERSPECTIVE ON MAZES."
6405 CH = 0
6410  PRINT : LOCATE 1,1: PRINT "FROM THE COMPUSERVE APPLE USER'S GROUP"
6420  LOCATE 2,9: PRINT "PUBLIC ACCESS DATABASE"
6425  LOCATE 17,1: PRINT "----------------------------------------"
6430  LOCATE 18,9: PRINT "USE <- AND -> TO TURN"
6440  PRINT : LOCATE 19,6: PRINT "<SPACE BAR> TO MOVE FORWARD"
6450  PRINT : LOCATE 20,3: PRINT "<ESCAPE> FOR A TOP VIEW (TO CHEAT)"
6500  DEF  FN M(X) =  INT (X) -  INT ( INT (X) / 2) * 2
6600  LOCATE 15,1:FX = 36: INPUT "PLEASE ENTER MAZE SIZE (H,V) ";H,V
6700 H =  INT (H):V =  INT (V)
6800  IF H > 2 AND H < 51 AND V > 2 AND V < 51 THEN 7000
6900  PRINT "2<H<51 -- 2<V<51": GOTO 6600
7000 N = H * V - 1:H = H + 1:V = V + 1:D = 1
7100  DIM M(52,52),W(400)
7200  FOR J = 1 TO V + 1:M(1,J) = 4:M(H + 1,J) = 1: NEXT J
7300 MX = 278:MY = 190:VX =  INT (MX / 2):VY =  INT (MY / 2):X = VX
7500  FOR J = 1 TO 8:DX(J) = X:YU(J) =  INT (VY - X * VY / VX)
7600 YD(J) =  INT (VY + X * (MY - VY) / VX):X =  INT (X * 7 / 10): NEXT J
7700  FOR I = 2 TO H:M(I,V + 1) = 8:M(I,1) = 2
7800  FOR J = 2 TO V:M(I,J) = 15: NEXT J,I
8500 R =  INT (H / 2 + 1):S =  INT (V / 2 + 1):M(R,S) = 15
8550  COLOR 23
8600  PRINT "            GENERATING MAZE."
8650  COLOR 9
8900  FOR IW = 1 TO N
9000 I = 0
9100  IF M(R - 1,S) < 15 THEN 9300
9200 I = I + 1:C(I) = 1
9300  IF M(R,S - 1) < 15 THEN 9500
9400 I = I + 1:C(I) = 2
9500  IF M(R + 1,S) < 15 THEN 9700
9600 I = I + 1:C(I) = 3
9700  IF M(R,S + 1) < 15 THEN 9900
9800 I = I + 1:C(I) = 4
9900  IF I = 0 THEN 12300
10000  IF I <  > 1 THEN I =  INT ( RND (1) * I) + 1
10100  ON C(I) GOTO 10300,10800,11300,11800
10300 M(R,S) = M(R,S) -  FN M(M(R,S))
10400 R = R - 1
10500 M(R,S) = M(R,S) -  FN M(M(R,S) / 4) * 4
10600  GOTO 13400
10800 M(R,S) = M(R,S) -  FN M(M(R,S) / 8) * 8
10900 S = S - 1
11000 M(R,S) = M(R,S) -  FN M(M(R,S) / 2) * 2
11100  GOTO 13400
11300 M(R,S) = M(R,S) -  FN M(M(R,S) / 4) * 4
11400 R = R + 1
11500 M(R,S) = M(R,S) -  FN M(M(R,S))
11600  GOTO 13400
11800 M(R,S) = M(R,S) -  FN M(M(R,S) / 2) * 2
11900 S = S + 1
12000 M(R,S) = M(R,S) -  FN M(M(R,S) / 8) * 8
12100  GOTO 13400
12300  IF D =  - 1 THEN 12700
12400  IF R <  > H THEN 13100
12500  IF S <  > V THEN 13000
12600 R = 2:S = 2: GOTO 13200
12700  IF R <  > 2 THEN 13100
12800  IF S <  > V THEN 13000
12900 R = H:S = 2: GOTO 13200
13000 S = S + 1:D =  - D: GOTO 13200
13100 R = R + D
13200  IF M(R,S) = 15 THEN 12300
13300  GOTO 9000
13400  NEXT IW
13500 MH = H:MV = V
13700 I =  INT ( RND (1) * (MH - 1)) + 2
13800 M(I,1) = 0
13900 M(I,2) = M(I,2) -  FN M(M(I,2) / 8) * 8
14000 H =  INT ( RND (1) * (MH - 1)) + 2
14100 H1 = H:V1 = V
14300  COLOR 23: LOCATE 23,12: PRINT "MAZE COMPLETED.": COLOR 9
14400  GOTO 17000
14700 HZ =  INT (MX / MH):VZ =  INT (MY / MV)
14750 CH = CH + 1
14800 SCREEN 1:COLOR 0,1:CLS
14900  PSET (1 + HZ,1 + VZ),2
15000  LINE (1 + HZ,1 + VZ)-(1 + HZ,MV * VZ + 1),2
15100  FOR J = 1 TO MV: FOR I = 2 TO MH
15200 N = M(I,J):X = I * HZ + 1:Y = J * VZ + 1
15300  IF  FN M(N / 2) = 0 THEN 15700
15500  PSET (X,Y),2
15600  LINE (X,Y)-(X - HZ,Y),2
15700  IF  FN M(N / 4) = 0 THEN 16100
15900  PSET (X,Y),2
16000  LINE (X,Y)-(X,Y - VZ),2
16100  NEXT I,J
16300 X = H * HZ - 1:Y = V * VZ - 1
16400  PSET (X + 1,Y + 1),2
16500  LINE (X + 1,Y + 1)-(X - HZ + 2,Y - VZ + 2),2
16600  PSET (X - HZ + 2,Y + 1),2
16700  LINE (X - HZ + 2,Y + 1)-(X + 1,Y - VZ + 2),2
16800  RETURN
17000  FOR X = 1 TO MH: FOR Y = 1 TO MV
17100 M(X,Y) = M(X,Y) + M(X,Y) * 16
17200  NEXT Y,X
17500 F =  INT ( RND (1) * 4) + 1
17600  ON F GOTO 17700,17800,17900,18000
17700 R = 0:S =  - 1: GOTO 18100
17800 R = 1:S = 0: GOTO 18100
17900 R = 0:S = 1: GOTO 18100
18000 R =  - 1:S = 0
18100  GOSUB 800
18300 DEF SEG : POKE 106,0
18400 IK$=INKEY$
18410 KEY(12) ON
18420 KEY(13) ON
18500 ON KEY(12) GOSUB 19100
18600 ON KEY(13) GOSUB 19400
18700 IF IK$ = " " THEN 20100
18800 IF IK$ = CHR$(27) THEN 21300
18900 GOTO 18400
19100 F = F - 1: IF F < 1 THEN F = 4
19200  GOTO 19500
19400 F = F + 1: IF F > 4 THEN F = 1
19500  ON F GOTO 19600,19700,19800,19900
19600 R = 0:S =  - 1: GOTO 21000
19700 R = 1:S = 0: GOTO 21000
19800 R = 0:S = 1: GOTO 21000
19900 R =  - 1:S = 0: GOTO 21000
20100 Z = M(H,V)
20200 T = Z * 2 ^ (F - 1):T =  FN M(T / 128)
20300  IF T = 0 THEN 20600
20500   GOTO 18300
20600 NM = NM + 1: LOCATE 22,24: PRINT "MOVE "NM
20650 FOR Q=1 TO 500:NEXT
20700  IF NM < 400 THEN W(NM) = F
20800 H = H + R:V = V + S
20900  IF V < 2 THEN 21500
21000  GOSUB 800
21100  GOTO 18300
21300  GOSUB 14700
21400  GOTO 18300
21500  CLS : LOCATE 12,5: PRINT "CONGRATS, IT TOOK YOU "NM" STEPS."
21540  IF CH = 1 THEN  LOCATE 14,8: PRINT "(BUT YOU CHEATED ONCE.)
21550  IF CH > 1 THEN  LOCATE 14,6: PRINT " (BUT YOU CHEATED ";CH;" TIMES.)"
21560 FOR I=1 TO 5000:NEXT
21700 V = V1:H = H1: GOSUB 14700
21900 X =  INT (H * HZ - HZ / 2) + 1:Y =  INT (V * VZ - VZ / 2) + 1
22000  PSET (X,Y),1
22100  FOR N = 1 TO NM
22200  IF N > 400 THEN 22900
22300 F = W(N)
22400  IF F = 1 THEN V = V - 1
22500  IF F = 2 THEN H = H + 1
22600  IF F = 3 THEN V = V + 1
22700  IF F = 4 THEN H = H - 1
22800  LINE (X,Y)-(INT (H * HZ - HZ / 2) + 1, INT (V * VZ - VZ / 2) + 1),1
22850 X=INT(H * HZ - HZ/2) + 1:Y=INT(V * VZ -VZ/2) + 1
22900  NEXT N
22920 LOCATE 1,1:PRINT "PRESS ANY KEY TO CONTINUE"
22950 IK$=INKEY$
23000  KEY(12) OFF:KEY(13) OFF: IF IK$ = "" THEN 22950
23100  CLEAR:GOTO 3
50000  REM
Y KEY TO CONTINUE"
22950 IK$=INKEY$
23000  KEY(12) OFF:KEY(13) OFF: IF IK$ = "" THEN 22950
23100  CLEAR:GOT