20 '* LABYRINTH mit L™SUNG 40 '* RULO# = 1234#ð // R=rechts; 2=U=unten; 3=L=links; 4=O=oben; #=besetzt 50 '* "=" ð Wand; "." ð frei 100 CLS : CLEAR : KEY OFF: SCREEN 1 110 RANDOMIZE TIMER 200 LOCATE 10, 15: PRINT "LABYRINTH" 205 LOCATE 13, 2: PRINT "BEI STILLSTAND/ BEEP BEL. NORMALTASTE" 206 LOCATE 15, 1: PRINT "OPTIONALE DRUCKERAUSGABE LABYRINTHFELD" 207 LOCATE 17, 3: PRINT "LABYRINTFELD: ANALOGCODE BEI START" 208 LOCATE 19, 3: PRINT "LABYRINTFELD: ANALOGCODE BEI ENDE" 209 LOCATE 21, 5: PRINT "WEG DURCH LABYRINTH: MATRIX": BEEP 210 IF INKEY$ = "" THEN 210 220 CLS : INPUT "? PRINTERAUSGABE Y/N ?"; LP$ 230 IF LP$ = "Y" OR LP$ = "y" OR LP$ = "N" OR LP$ = "n" THEN 305 ELSE 220 300 '** EINGABE FUER LABYRINTHFELD ** 305 INPUT "? FELDER IN x-RICHTUNG (2-30)"; NX 310 IF NX < 2 OR NX > 30 THEN 300 315 INPUT "? FELDER IN y-RICHTUNG (2-40)"; NY 320 IF NY < 2 OR NY > 40 THEN 315 325 IF NX >11 OR NY >25 THEN LP$="N" 330 CLS : SCREEN 12: NC = 0 335 DIM A$(NX, NY) 340 WLX = INT(500 / NX) 345 IF WLX / 2 <> INT(WLX / 2) THEN WLX = WLX + 1 350 WLY = INT(400 / NY) 355 IF WLY / 2 <> INT(WLY / 2) THEN WLY = WLY + 1 360 XA = (640 - NX * WLX) / 2: YA = 0 365 LINE (XA, YA)-(NX * WLX + XA, NY * WLY + YA), , B 370 LINE (0, 0)-(639, 479), , B 400 '** LABYRINTAUFBAU ** 401 LOCATE 14, 2: PRINT "EIN": LOCATE 14, 77: PRINT "AUS" 405 COUNT = NX * NY 410 FOR I = 0 TO 2 * COUNT 415 PTR = (PTR + 997) MOD COUNT 420 X = INT(PTR / NY) 425 Y = PTR - X * NY 430 X = X * WLX + XA 435 Y = Y * WLY + YA 440 IF POINT(X, Y) THEN 555 445 DIR = INT(4 * RND + 1) 450 DIR2 = DIR 455 DIR = DIR MOD 4 + 1 460 XN = ((DIR = 1) - (DIR = 3)) * WLX + X 465 YN = ((DIR = 2) - (DIR = 4)) * WLY + Y 470 IF POINT(XN, YN) = 0 THEN 530 475 LINE (X, Y)-(XN, YN) 480 DIR = INT(4 * RND + 1) 485 FOR K = 1 TO 4 490 DIR = DIR MOD 4 + 1 495 XN = ((DIR = 1) - (DIR = 3)) * WLX + X 500 YN = ((DIR = 2) - (DIR = 4)) * WLY + Y 505 IF POINT(XN, YN) THEN 550 510 LINE (X, Y)-(XN, YN) 515 X = XN: Y = YN 525 GOTO 480 530 IF DIR <> DIR2 THEN 545 535 X = XN: Y = YN 545 GOTO 455 550 NEXT K 555 NEXT I 560 '** EINGANG/AUSGANG BEIDSEITIG ** 565 Y = INT(NY / 2) * WLY 570 LINE (XA, Y)-(XA, Y + WLY), 0 575 LINE (NX * WLX + XA, Y)-(NX * WLX + XA, Y + WLY), 0: BEEP 580 IST = 1: IFI = NX: JST = INT(NY / 2) + 1: JFI = JST 590 IF INKEY$ = "" THEN 590 600 '** FELDMARKIERUNG ** 610 FOR J = 1 TO NY: FOR I = 1 TO NX: A$(I, J) = ".....": NEXT I: NEXT J 615 '** FELDABTASTUNG ** 640 FOR J = 1 TO NY: FOR I = 1 TO NX 650 N5 = 0: IF A$(I, J) = "====#" THEN 690 655 IF POINT(I * WLX + XA, J * WLY - WLY / 2) THEN MID$(A$(I, J), 1) = "=": N5 = N5 + 1 660 IF POINT(I * WLX - WLX / 2 + XA, J * WLY) THEN MID$(A$(I, J), 2) = "=": N5 = N5 + 1 665 IF POINT((I - 1) * WLX + XA, J * WLY - WLY / 2) THEN MID$(A$(I, J), 3) = "=": N5 = N5 + 1 670 IF POINT(I * WLX - WLX / 2 + XA, (J - 1) * WLY) THEN MID$(A$(I, J), 4) = "=": N5 = N5 + 1 675 IF N5 >= 3 THEN MID$(A$(I, J), 5) = "#" 690 NEXT I, J 695 IF NC = 0 THEN GOSUB 805 700 '** SACKGASSEN, NEUE ABSCHLUSSWAND, FUELLEN, UEBERGANG NACHBARFELD ** 710 FOR J = 1 TO NY: FOR I = 1 TO NX 715 IF A$(I, J) = "====#" THEN 780 ELSE I1 = I: J1 = J 720 IF A$(I1, J1) = ".===#" THEN LINE (I1 * WLX + XA, (J1 - 1) * WLY)-(I1 * WLX + XA, J1 * WLY): GOSUB 910: I1 = I1 + 1: MID$(A$(I1, J1), 3) = "=": GOSUB 960: GOTO 720 730 IF A$(I1, J1) = "=.==#" THEN LINE (I1 * WLX + XA, J1 * WLY)-((I1 - 1) * WLX + XA, J1 * WLY): GOSUB 910: J1 = J1 + 1: MID$(A$(I1, J1), 4) = "=": GOSUB 960: GOTO 720 740 IF A$(I1, J1) = "==.=#" THEN LINE ((I1 - 1) * WLX + XA, J1 * WLY)-((I1 - 1) * WLX + XA, (J1 - 1) * WLY): GOSUB 910: I1 = I1 - 1: MID$(A$(I1, J1), 1) = "=": GOSUB 960: GOTO 720 750 IF A$(I1, J1) = "===.#" THEN LINE ((I1 - 1) * WLX + XA, (J1 - 1) * WLY)-(I1 * WLX + XA, (J1 - 1) * WLY): GOSUB 910: J1 = J1 - 1: MID$(A$(I1, J1), 2) = "=": GOSUB 960: GOTO 720 780 NEXT I, J 790 NC = NC + 1 800 '** SUB: AUSDRUCK ANALOGCODE (DATEN, FELDBESETZUNG), WEG ** 805 IF LP$ = "N" OR LP$ = "n" THEN 840 810 LPRINT "LABYRINTHCODE ** ZUSTAND:"; 811 IF NC = 0 THEN LPRINT " START" ELSE LPRINT " ENDE" 815 LPRINT "NX="; NX; " NY="; NY; " WLX="; WLX; " WLY="; WLY: LPRINT 820 LPRINT "1234# RULO#": LPRINT 825 FOR J = 1 TO NY: FOR I = 1 TO NX 830 LPRINT A$(I, J); : LPRINT " "; 835 NEXT I: LPRINT : NEXT J: LPRINT : LPRINT : LPRINT 840 IF NC = 0 THEN RETURN ELSE BEEP 845 IF INKEY$ = "" THEN 845 850 '** WEG DURCH LABYRINT IN MATRIXFORM ** 851 IF LP$ = "N" OR LP$ = "n" THEN 890 855 I = IST: J = JST: WEG$ = "" 856 LPRINT "WEG DURCH DAS LABYRINTH :": LPRINT : LPRINT "EINGANG LINKS" 860 IF I = IFI AND J = JFI THEN 887 865 IF MID$(A$(I + 1, J), 5) = "." AND POINT(I * WLX + XA, (J - .5) * WLY) = 0 THEN GOSUB 881: I = I + 1: GOTO 860 866 IF MID$(A$(I, J + 1), 5) = "." AND POINT((I - .5) * WLX + XA, J * WLY) = 0 THEN GOSUB 881: J = J + 1: GOTO 860 867 IF MID$(A$(I - 1, J), 5) = "." AND POINT((I - 1) * WLX + XA, (J - .5) * WLY) = 0 THEN GOSUB 881: I = I - 1: GOTO 860 868 IF MID$(A$(I, J - 1), 5) = "." AND POINT((I - .5) * WLX + XA, (J - 1) * WLY) = 0 THEN GOSUB 881: J = J - 1: GOTO 860 880 '** SUB: WEG-$-ADDIERUNG ** 881 MID$(A$(I, J), 5) = "+": AD$ = "A(" + STR$(I) + "," + STR$(J) + "), ": WEG$ = WEG$ + AD$ 882 IF LEN(WEG$) > 240 THEN LPRINT WEG$; : WEG$ = "" 883 RETURN 885 '** SUB: FINAL WEG-$-AUSDRUCK ** 887 MID$(A$(I, J), 5) = "+": AD$ = "A(" + STR$(I) + "," + STR$(J) + "), ": WEG$ = WEG$ + AD$: LPRINT WEG$ 888 'PAINT (1,1),5,15 889 LPRINT : LPRINT "AUSGANG RECHTS": LPRINT : LPRINT : LPRINT 890 BEEP: END 900 '** SUB: SACKGASSEN MARKIEREN, FUELLEN ** 910 A$(I1, J1) = "====#" 920 XF = (I1 - .5) * WLX + XA: YF = (J1 - .5) * WLY: PAINT (XF, YF), 2, 15 930 RETURN 950 '** SUB: WANDCHECK NACHBARFELD ** 960 N5 = 0 970 FOR K = 1 TO 4 975 IF MID$(A$(I1, J1), K, 1) = "=" THEN N5 = N5 + 1 980 NEXT K 985 IF N5 >= 3 THEN MID$(A$(I1, J1), 5) = "#" 990 RETURN