00010 REM Z80 MAZE LEARNER AI - VERSION 5C 00020 REM RANDOM BACKBONE WITH CONNECTED BRANCHES 00030 DIM A0(120),B0(120),C0(120),D0(120),W0(120),M0(20),S0(20) 00040 L1=.5:G1=.8 00050 R=0:B=0:T=0:I=2:L=0:F=0 00060 CLS 00070 PRINT "Z80 MAZE LEARNER AI" 00080 PRINT "VERSION 5C" 00090 PRINT "CONNECTED BRANCH GENERATOR" 00100 GOSUB 1000 00110 GOSUB 9600 00115 GOSUB 9800 00120 REM START NEW RUN 00130 R=R+1 00140 IF R>20 THEN 780 00150 X=1:Y=1:A=1:D=1 00160 M=0:S=0:O=0:W=0 00170 F1=0.0:N=0 00180 GOSUB 8000 00190 REM MAIN MOVE LOOP 00200 IF O=1 THEN 500 00210 M=M+1 00220 IF M<=K THEN 250 00230 M=K 00240 GOTO 500 00250 GOSUB 2000 00260 A=X:D=Y 00270 GOSUB 3000 00280 GOSUB 8500 00290 IF O=1 THEN 500 00300 GOTO 200 00500 REM END OF RUN 00510 M0(R)=FLT(M) 00520 S0(R)=FLT(S) 00525 GOSUB 09720 00530 IF O<>1 THEN 00570 00540 IF B<>0 THEN 00560 00550 B=M 00555 GOTO 00570 00560 IF M>=B THEN 00570 00565 B=M 00570 CLS 00580 CURS1,1:PRINT "Z80 MAZE LEARNER AI" 00590 CURS1,2:PRINT "RUN ";R;" RESULTS" 00600 CURS1,4 00610 IF O=1 THEN PRINT "EXIT FOUND" 00620 IF O<>1 THEN PRINT "EXIT NOT FOUND" 00630 CURS1,6:PRINT "MOVES ";M 00640 CURS1,7:PRINT "SCORE ";S 00650 CURS1,8 00660 IF B=0 THEN PRINT "BEST -" 00670 IF B<>0 THEN PRINT "BEST ";B 00680 CURS1,10:PRINT "MAZE ";U;" X ";V 00690 CURS1,11:PRINT "MOVE LIMIT ";K 00700 CURS1,13:PRINT "VIEW MOVES CHART Y/N" 00710 INPUT I0$ 00720 IF I0$="Y" THEN 740 00730 IF I0$="y" THEN 740 00735 GOTO 780 00740 CLS 00750 GOSUB 7000 00780 REM POST RUN MENU 00790 CLS 00800 IF R>=20 THEN 900 00810 CURS1,3:PRINT "WHAT NEXT?" 00820 CURS1,5:PRINT "1 RUN SAME MAP" 00830 CURS1,6:PRINT "2 START FRESH MAP" 00840 CURS1,7:PRINT "3 EXIT" 00850 CURS1,9:INPUT Q 00860 IF Q=1 THEN 120 00870 IF Q=2 THEN 960 00880 IF Q=3 THEN 990 00890 GOTO 790 00900 REM MENU AFTER RUN 20 00910 CURS1,3:PRINT "20 RUN LIMIT REACHED" 00920 CURS1,5:PRINT "1 START FRESH MAP" 00930 CURS1,6:PRINT "2 EXIT" 00935 CURS1,8:INPUT Q 00940 IF Q=1 THEN 960 00945 IF Q=2 THEN 990 00950 GOTO 790 00960 REM START FRESH MAP 00965 R=0:B=0:T=0:I=2:L=0:F=0 00970 GOSUB 1000 00975 GOSUB 9600 00980 GOTO 120 00990 CLS 00995 END 01000 REM SETUP SCREEN 01010 CLS 01020 CURS1,1:PRINT "Z80 MAZE LEARNER AI" 01030 CURS1,2:PRINT "VERSION 5C - SETUP" 01040 CURS1,4:PRINT "MAZE WIDTH 5 TO 12" 01050 CURS1,5:INPUT U 01060 IF U>=5 THEN 1080 01070 U=5 01080 IF U<=12 THEN 1100 01090 U=12 01100 CURS1,7:PRINT "MAZE HEIGHT 5 TO 10" 01110 CURS1,8:INPUT V 01120 IF V>=5 THEN 1140 01130 V=5 01140 IF V<=10 THEN 1160 01150 V=10 01160 J=U*V 01170 K=J*8 01180 CURS1,10:PRINT "MAP TYPE" 01190 CURS1,11:PRINT "1 FIXED 2 RANDOM" 01200 CURS1,12:INPUT G 01210 IF G=1 THEN 1240 01212 CLS 01220 IF G=2 THEN 1240 01230 G=1 01240 CLS 01250 CURS1,3:PRINT "Z80 MAZE LEARNER AI" 01260 CURS1,4:PRINT "VERSION 5C" 01270 CURS1,7 01280 IF G=1 THEN PRINT "BUILDING FIXED MAP..." 01282 IF G=1 THEN PRINT "MAP TYPE: SIMPLE" 01284 IF G=2 THEN PRINT "MAP TYPE: RANDOM" 01290 IF G=2 THEN PRINT "GENERATING RANDOM MAP..." 01300 CURS1,9 01310 IF G=2 THEN PRINT "PLEASE WAIT A LONG TIME- MICROBEE IS WORKING" 01320 GOSUB 9300 01330 RETURN 02000 REM CHOOSE BEST LEGAL ACTION 02010 H=(Y-1)*U+X 02020 B1=-999.0 02030 N=0 02040 REM TEST NORTH 02050 C=X:E=Y-1 02060 GOSUB 5000 02070 Z=H 02080 IF W=1 THEN 2120 02090 B1=A0(H) 02100 N=1 02120 REM TEST SOUTH 02130 C=X:E=Y+1 02140 GOSUB 5000 02150 Z=H 02160 IF W=1 THEN 2210 02170 IF B0(H)<=B1 THEN 2210 02180 B1=B0(H) 02190 N=2 02200 REM CONTINUE TO WEST TEST 02210 REM TEST WEST 02220 C=X-1:E=Y 02230 GOSUB 5000 02240 Z=H 02250 IF W=1 THEN 2300 02260 IF C0(H)<=B1 THEN 2300 02270 B1=C0(H) 02280 N=3 02300 REM TEST EAST 02310 C=X+1:E=Y 02320 GOSUB 5000 02330 Z=H 02340 IF W=1 THEN 2390 02350 IF D0(H)<=B1 THEN 2390 02360 B1=D0(H) 02370 N=4 02390 REM ADAPTIVE RANDOM LEGAL ACTION 02400 GOSUB 9790 02410 P=INT(RND*FLT(I)) 02420 IF P<>0 THEN 2600 02430 GOTO 2470 02440 REM SPARE 02450 REM SPARE 02470 N=INT(RND*4.0)+1 02480 C=X:E=Y 02490 IF N<>1 THEN 2510 02500 E=Y-1 02510 IF N<>2 THEN 2530 02520 E=Y+1 02530 IF N<>3 THEN 2550 02540 C=X-1 02550 IF N<>4 THEN 2570 02560 C=X+1 02570 GOSUB 5000 02580 Z=H 02590 IF W=1 THEN 2470 02600 RETURN 03000 REM TAKE ACTION AND LEARN 03010 Z=(Y-1)*U+X 03020 C=X:E=Y 03030 IF N<>1 THEN 3050 03040 E=Y-1 03050 IF N<>2 THEN 3070 03060 E=Y+1 03070 IF N<>3 THEN 3090 03080 C=X-1 03090 IF N<>4 THEN 3110 03100 C=X+1 03110 GOSUB 5000 03120 F1=-1.0 03130 IF W=0 THEN 3170 03140 F1=-5.0 03150 GOTO 3230 03170 X=C:Y=E 03180 Z=(Y-1)*U+X 03190 IF W0(Z)<>3.0 THEN 3230 03200 F1=100.0 03210 O=1 03230 S=S+INT(F1) 03240 Z=(D-1)*U+A 03250 T1=F1 03260 IF W=1 THEN 3300 03270 IF O=1 THEN 3300 03280 H=Z 03290 GOSUB 4000 03300 Z=H 03310 T1=F1+G1*Q1 03320 IF N<>1 THEN 3340 03330 A0(Z)=A0(Z)+L1*(T1-A0(Z)) 03340 IF N<>2 THEN 3360 03350 B0(Z)=B0(Z)+L1*(T1-B0(Z)) 03360 IF N<>3 THEN 3380 03370 C0(Z)=C0(Z)+L1*(T1-C0(Z)) 03380 IF N<>4 THEN 3400 03390 D0(Z)=D0(Z)+L1*(T1-D0(Z)) 03400 RETURN 04000 REM FIND BEST LEGAL FUTURE Q 04010 Z=(Y-1)*U+X 04020 Q1=-999.0 04030 REM TEST NORTH 04040 C=X:E=Y-1 04050 GOSUB 5000 04060 Z=(Y-1)*U+X 04070 IF W=1 THEN 4110 04080 Q1=A0(Z) 04090 REM TEST SOUTH 04100 REM CONTINUE WITH SOUTH TEST 04110 C=X:E=Y+1 04120 C=X:E=Y+1 04130 GOSUB 5000 04140 Z=(Y-1)*U+X 04150 IF W=1 THEN 4200 04160 IF B0(Z)<=Q1 THEN 4200 04170 Q1=B0(Z) 04200 REM TEST WEST 04210 C=X-1:E=Y 04220 GOSUB 5000 04230 Z=(Y-1)*U+X 04240 IF W=1 THEN 4290 04250 IF C0(Z)<=Q1 THEN 4290 04260 Q1=C0(Z) 04290 REM TEST EAST 04300 C=X+1:E=Y 04310 GOSUB 5000 04320 Z=(Y-1)*U+X 04330 IF W=1 THEN 4380 04340 IF D0(Z)<=Q1 THEN 4380 04350 Q1=D0(Z) 04380 RETURN 04390 RETURN 05000 REM CHECK WALL AND MAP COLLISION 05010 W=0 05020 IF C<1 THEN 5300 05030 IF C>U THEN 5300 05040 IF E<1 THEN 5300 05050 IF E>V THEN 5300 05060 Z=(E-1)*U+C 05070 IF W0(Z)=1.0 THEN 5300 05080 RETURN 05300 W=1 05310 RETURN 06000 REM PRINT TEXT MAP 06010 PRINT 06020 PRINT "MAZE" 06030 FOR P=1 TO U+2 06040 PRINT "#"; 06050 NEXT P 06060 PRINT 06070 FOR Q=1 TO V 06080 PRINT "#"; 06090 FOR P=1 TO U 06100 Z=(Q-1)*U+P 06110 GOSUB 9000 06120 PRINT I0$; 06130 NEXT P 06140 PRINT "#" 06150 NEXT Q 06160 FOR P=1 TO U+2 06170 PRINT "#"; 06180 NEXT P 06190 PRINT 06200 PRINT "S=START E=EXIT #=WALL" 06210 PRINT 06220 RETURN 07000 REM HIRES2 LEARNING EFFICIENCY CHART 07010 CLS 07020 HIRES2 07030 REM DRAW OUTER GRAPH FRAME 07040 PLOT 48,30 TO 48,220 07050 PLOT 48,220 TO 500,220 07060 PLOT 500,220 TO 500,30 07070 PLOT 500,30 TO 48,30 07080 REM DRAW 25 PERCENT GUIDE LINES 07090 PLOT 48,75 TO 500,75 07100 PLOT 48,120 TO 500,120 07110 PLOT 48,165 TO 500,165 07120 REM DRAW ONE BAR FOR EACH COMPLETED RUN 07130 FOR P=1 TO R 07140 C=100-INT(M0(P)*100.0/FLT(K)) 07150 IF C>=0 THEN 7170 07160 C=0 07170 IF C<=100 THEN 7190 07180 C=100 07190 E=C*180/100 07200 X=54+(P-1)*22 07210 Y=30+E 07220 REM DRAW FILLED BAR 12 PIXELS WIDE 07230 FOR Q=X TO X+11 07240 PLOT Q,30 TO Q,Y 07250 NEXT Q 07260 NEXT P 07270 REM TITLE AND Y AXIS UNITS 07280 CURS1,1:PRINT "LEARNING EFFICIENCY"; 07290 CURS1,2:PRINT "HIGHER BARS ARE BETTER"; 07300 CURS1,3:PRINT "100%"; 07310 CURS1,6:PRINT "75%"; 07320 CURS1,9:PRINT "50%"; 07330 CURS1,12:PRINT "25%"; 07340 CURS1,15:PRINT "0%"; 07350 REM X AXIS RUN NUMBERS 07360 CURS7,15:PRINT "1"; 07370 CURS20,15:PRINT "5"; 07380 CURS33,15:PRINT "10"; 07390 CURS47,15:PRINT "15"; 07400 CURS60,15:PRINT "20"; 07410 CURS31,15:PRINT "RUN"; 07420 CURS1,16:PRINT "PRESS RETURN"; 07430 INPUT I0$ 07440 CLS 07445 GOSUB 9800 07450 RETURN 08000 REM DRAW VERSION 5C UNIFIED DASHBOARD 08010 CLS 08015 GOSUB 9800 08020 CURS1,1:PRINT "Z80 MAZE LEARNER AI" 08030 CURS1,2:PRINT "VERSION 5C ";U;" X ";V 08040 REM DRAW COMPLETE VISIBLE TILE GRID 08045 PCG 08050 FOR Q=0 TO V+1 08060 FOR P=0 TO U+1 08070 GOSUB 9120 08080 NEXT P 08090 NEXT Q 08100 NORMAL 08110 REM RIGHT SIDE PANEL 08120 CURS36,1:PRINT "RUN" 08130 CURS36,2:PRINT "MOVE" 08140 CURS36,3:PRINT "SCORE" 08150 CURS36,4:PRINT "BEST" 08160 CURS36,6:PRINT "ACTION" 08170 CURS36,7:PRINT "REWARD" 08180 CURS36,9:PRINT "STATE" 08190 CURS36,10:PRINT "EXPLORE" 08200 CURS36,11:PRINT "Q VALUES" 08210 CURS36,12:PRINT "N" 08215 NORMAL 08220 CURS36,13:PRINT "S" 08230 CURS36,14:PRINT "W" 08240 CURS36,15:PRINT "E" 08245 NORMAL 08250 GOSUB 09260 08260 PRINT "BRANCH MAZE ENGINE - VERSION 5C"; 08270 GOSUB 8500 08280 RETURN 08500 REM UPDATE DASHBOARD 08510 CURS48,1:PRINT " "; 08520 CURS48,1:PRINT R;"/20"; 08530 CURS48,2:PRINT " "; 08540 CURS48,2:PRINT M;"/";K; 08550 CURS48,3:PRINT " "; 08560 CURS48,3:PRINT S; 08570 CURS48,4:PRINT " "; 08580 CURS48,4 08590 IF B=0 THEN PRINT "-"; 08600 IF B<>0 THEN PRINT B; 08610 CURS48,9:PRINT " "; 08620 CURS48,9 08630 Z=(Y-1)*U+X 08640 PRINT Z; 08650 CURS48,10:PRINT " "; 08660 CURS48,10 08670 PRINT "1:";I;" "; 08680 GOSUB 09260 08690 GOSUB 8700 08695 GOSUB 8800 08699 RETURN 08700 REM UPDATE ACTION AND REWARD 08710 CURS48,6:PRINT " "; 08720 CURS48,6 08730 IF N=0 THEN PRINT "-"; 08740 IF N=1 THEN PRINT "NORTH"; 08750 IF N=2 THEN PRINT "SOUTH"; 08760 IF N=3 THEN PRINT "WEST"; 08770 IF N=4 THEN PRINT "EAST"; 08780 CURS48,7:PRINT " "; 08790 CURS48,7:PRINT F1; 08795 RETURN 08800 REM UPDATE Q VALUES 08810 Z=(D-1)*U+A 08820 CURS42,12:PRINT " "; 08830 CURS42,12:PRINT A0(Z); 08840 CURS42,13:PRINT " "; 08850 CURS42,13:PRINT B0(Z); 08860 CURS42,14:PRINT " "; 08870 CURS42,14:PRINT C0(Z); 08880 CURS42,15:PRINT " "; 08890 CURS42,15:PRINT D0(Z); 08900 GOSUB 8920 08910 RETURN 08920 REM UPDATE OLD AND NEW VISIBLE TILES 08930 P=A 08940 Q=D 08950 GOSUB 9120 08955 PCG 08960 P=X 08970 Q=Y 08975 NORMAL 08980 GOSUB 9120 08990 NORMAL 08995 RETURN 09000 REM GET MAP PCG PAIR USING STATE Z 09010 I0$="ab" 09020 IF W0(Z)=1.0 THEN 9060 09030 IF W0(Z)=2.0 THEN 9080 09040 IF W0(Z)=3.0 THEN 9100 09050 RETURN 09060 I0$="cd" 09070 RETURN 09080 I0$="ef" 09090 RETURN 09100 I0$="gh" 09110 RETURN 09120 REM DRAW VISIBLE TILE AT P,Q 09130 I0$="cd" 09140 IF P<1 THEN 9220 09150 IF P>U THEN 9220 09160 IF Q<1 THEN 9220 09170 IF Q>V THEN 9220 09180 Z=(Q-1)*U+P 09190 GOSUB 9000 09200 IF P<>X THEN 9220 09210 IF Q<>Y THEN 9220 09215 I0$="ij" 09220 PCG 09230 CURS P*2+2,Q+3 09240 PRINT I0$; 09250 RETURN 09260 REM UPDATE MODE LINE - VERSION 4B 09261 CURS1,16:PRINT " "; 09262 CURS1,16 09263 IF R>1 THEN 09266 09264 PRINT "MODE INITIALISING"; 09265 RETURN 09266 IF B<>0 THEN 09270 09267 PRINT "MODE LEARNING"; 09268 RETURN 09269 RETURN 09270 IF T>=30 THEN 09274 09271 PRINT "MODE LEARNING"; 09272 RETURN 09274 IF L>=2 THEN 09278 09275 PRINT "MODE EXPLORING"; 09276 RETURN 09278 IF T>=55 THEN 09282 09279 PRINT "MODE EXPLORING"; 09280 RETURN 09281 RETURN 09282 IF L>=4 THEN 09286 09283 PRINT "MODE SOLVING"; 09284 RETURN 09285 RETURN 09286 IF T>=80 THEN 09290 09287 PRINT "MODE SOLVING"; 09288 RETURN 09289 RETURN 09290 IF L>=6 THEN 09294 09291 PRINT "MODE OPTIMISING"; 09292 RETURN 09294 IF T>=90 THEN 09296 09295 GOTO 09291 09296 IF F>=2 THEN 09298 09297 GOTO 09291 09298 PRINT "MODE MASTERED"; 09299 RETURN 09300 REM SELECT VERSION 5 MAP TYPE 09310 IF G=1 THEN 09400 09320 GOSUB 10000 09330 RETURN 09340 P=0 09350 Q=2 09360 FOR C=2 TO U-1 09370 P=1-P 09380 IF P=0 THEN 9460 09390 FOR E=2 TO V-1 09400 REM BUILD FIXED VERTICAL WALL MAZE 09410 FOR Z=1 TO 120 09415 W0(Z)=1.0 09420 W0(Z)=0.0 09430 NEXT Z 09440 P=0 09445 GOTO 9460 09450 Q=2 09460 FOR C=2 TO U-1 09470 P=1-P 09480 IF P=0 THEN 09560 09490 FOR E=2 TO V-1 09500 IF E=Q THEN 09520 09510 Z=(E-1)*U+C 09515 W0(Z)=1.0 09520 NEXT E 09530 IF Q=2 THEN 09550 09540 Q=2 09545 GOTO 09560 09550 Q=V-1 09560 NEXT C 09570 W0(1)=2.0 09580 W0(J)=3.0 09590 RETURN 09600 REM RESET Q VALUES AND RESULTS 09610 FOR Z=1 TO 120 09620 A0(Z)=0.0 09630 B0(Z)=0.0 09640 C0(Z)=0.0 09650 D0(Z)=0.0 09660 NEXT Z 09670 FOR P=1 TO 20 09680 M0(P)=0.0 09690 S0(P)=0.0 09700 NEXT P 09710 RETURN 09712 CURS1,16:PRINT " "; 09713 CURS1,16 09714 IF T<10 THEN 09730 09715 IF T<30 THEN 09735 09716 IF T<55 THEN 09740 09717 IF T<75 THEN 09745 09718 IF T<95 THEN 09750 09719 PRINT "MODE MASTERED"; 09720 REM UPDATE LEARNING CONFIDENCE - VERSION 4B 09730 IF O=1 THEN 09750 09731 RETURN 09735 PRINT "MODE LEARNING"; 09736 RETURN 09740 T=T-5 09741 L=0 09742 F=0 09743 GOTO 09780 09745 PRINT "MODE SOLVING"; 09746 RETURN 09750 L=L+1 09751 T=T+8 09752 IF B<>0 THEN 09760 09753 T=T+7 09754 F=1 09755 GOTO 09780 09760 IF M>=B THEN 09766 09761 T=T+8 09762 F=1 09763 GOTO 09780 09764 IF M>=B THEN 09770 09765 T=T+5 09766 IF M>B+2 THEN 09774 09767 T=T+8 09768 F=F+1 09769 GOTO 09780 09770 IF M<>B THEN 09776 09771 T=T+10 09772 F=F+1 09773 GOTO 09780 09774 T=T-2 09775 F=0 09776 IF M>B+2 THEN 09779 09777 T=T+3 09778 GOTO 09780 09779 T=T-2 09780 IF L<=3 THEN 09782 09781 T=T+4 09782 IF F<=2 THEN 09784 09783 T=T+4 09784 IF T>=0 THEN 09786 09785 T=0 09786 IF T<=100 THEN 09788 09787 T=100 09788 GOSUB 09790 09789 RETURN 09790 REM SET EXPLORE DIVISOR 09791 I=2 09792 IF T<20 THEN 09799 09793 I=3 09794 IF T<40 THEN 09799 09795 I=5 09796 IF T<60 THEN 09799 09797 I=8 09799 RETURN 09800 REM SETUP VERSION 4A PCG TILE LIBRARY 09810 RESTORE 9900 09820 FOR P=65040 TO 65199 09830 READ C 09840 POKE P,C 09850 NEXT P 09860 RETURN 09900 REM PCG A - FLOOR LEFT 09901 DATA 0,0,0,32,0,0,0,0,0,0,0,4,0,0,0,0 09910 REM PCG B - FLOOR RIGHT 09911 DATA 0,0,0,0,0,4,0,0,0,0,0,32,0,0,0,0 09920 REM PCG C - WALL LEFT 09921 DATA 255,146,146,146,255,73,73,73,255,146,146,146,255,73,73,73 09930 REM PCG D - WALL RIGHT 09931 DATA 255,73,73,73,255,146,146,146,255,73,73,73,255,146,146,146 09940 REM PCG E - START FLAG LEFT 09941 DATA 240,252,195,192,192,192,195,222,240,192,192,192,192,192,192,192 09950 REM PCG F - START FLAG RIGHT 09951 DATA 0,0,128,96,24,96,128,0,0,0,0,0,0,0,0,0 09960 REM PCG G - FINISH FLAG LEFT 09961 DATA 255,153,153,230,230,153,153,255,0,0,0,0,0,0,0,0 09970 REM PCG H - FINISH FLAG RIGHT 09971 DATA 255,207,207,51,51,207,207,255,3,3,3,3,3,3,3,3 09980 REM PCG I - BEE LEFT 09981 DATA 8,4,59,123,121,59,7,15,28,31,28,31,15,7,9,16 09990 REM PCG J - BEE RIGHT 09991 DATA 16,32,220,222,158,220,224,240,56,248,56,248,240,224,144,8 10000 REM VERSION 5A RANDOM GUARANTEED PATH 10010 REM BEGIN WITH EVERY CELL AS A WALL 10020 FOR Z=1 TO 120 10030 W0(Z)=1.0 10040 NEXT Z 10050 REM BEGIN PATH AT TOP LEFT 10060 X=1:Y=1 10070 Z=1 10080 W0(Z)=0.0 10090 REM STOP WHEN BOTTOM RIGHT IS REACHED 10100 IF X<>U THEN 10130 10110 IF Y=V THEN 10240 10120 REM X LIMIT REACHED - MUST MOVE SOUTH 10125 GOTO 10190 10130 IF Y<>V THEN 10160 10140 REM Y LIMIT REACHED - MUST MOVE EAST 10150 GOTO 10180 10160 REM RANDOMLY CHOOSE EAST OR SOUTH 10170 P=INT(RND*2.0) 10175 IF P=0 THEN 10190 10180 X=X+1 10185 GOTO 10200 10190 Y=Y+1 10200 Z=(Y-1)*U+X 10210 W0(Z)=0.0 10220 GOTO 10100 10240 REM ADD BRANCHES FOR RANDOM MODE 10250 IF G=1 THEN 10270 10260 GOSUB 12000 10270 REM MARK START AND FINISH 10280 W0(1)=2.0 10290 W0(J)=3.0 10300 RETURN 12000 REM VERSION 5B CONNECTED BRANCH GENERATOR 12010 REM OPEN ABOUT 30 PERCENT OF TOTAL CELLS 12020 Q=INT(FLT(J)*.30) 12030 H=0 12040 A=0 12050 D=J*30 12060 REM H COUNTS SUCCESSFUL NEW PASSAGE CELLS 12070 IF H>=Q THEN 12430 12080 REM A PREVENTS AN ENDLESS SEARCH 12090 A=A+1 12100 IF A>D THEN 12430 12110 REM SELECT RANDOM EXISTING PASSAGE 12120 X=INT(RND*FLT(U))+1 12130 Y=INT(RND*FLT(V))+1 12140 Z=(Y-1)*U+X 12150 IF W0(Z)=1.0 THEN 12070 12160 REM SELECT RANDOM DIRECTION 12170 N=INT(RND*4.0)+1 12180 C=X:E=Y 12190 IF N<>1 THEN 12210 12200 E=Y-1 12210 IF N<>2 THEN 12230 12220 E=Y+1 12230 IF N<>3 THEN 12250 12240 C=X-1 12250 IF N<>4 THEN 12270 12260 C=X+1 12270 REM REJECT POSITIONS OUTSIDE MAZE 12280 IF C<1 THEN 120