1 REM +++++++++++++++++++++++++++++++++
2 REM ! Program LABYRINT
3 REM ! Utg}va 1 m 1981-10-17
4 REM ! av (c) Bernt Nilsson
5 REM ! L Y S A T O R
6 REM ! Link|pings Tekniska H|gskola
7 REM ! Minne 16 Kbytes
9 REM +++++++++++++++++++++++++++++++++
30 ; CHR$(12%)CUR(8%,16%)"LABYRINT"
40 READ D% : REM kubens storlek
50 P%=1+D%+D%*D% : REM b|rja d{r
60 W%=D%*D%-1% : REM wrapp around
70 D1%=D%-1% : REM ettor
80 DIM L%(W%) : REM labyrinten
90 FOR I%=0% TO W% : REM init den
100 READ L%(I%) : NEXT I%
110 X%=38% : Y%=35% : REM sk{rm-mitt
120 M%=35% : REM max bild
130 F%=1% : H%=-D% : U%=D%*D%
140 DIM B%(D1%) : REM bit-tabell
150 Q%=1% : FOR I%=0% TO D1%
160 B%(I%)=Q% : Q%=Q%*2% : NEXT I%
170 DEFFNK%(P%)=(L%((P%/D%) AND W%) AND B%(P% AND D1%))<>0%
180 GOTO 860 : REM till main
190 REM projicera
200 P1%=P% : Z=Z1 : T%=M%
220 L1%=FNK%(P%-H%) : REM v{nster
230 \1%=FNK%(P%+U%) : REM upp}t
240 R1%=FNK%(P%+H%) : REM h|ger
250 N1%=FNK%(P%-U%) : REM ner}t
260 P1%=P1%+F% : REM n{sta
270 L%=FNK%(P1%-H%)
280 \%=FNK%(P1%+U%)
290 R%=FNK%(P1%+H%)
300 N%=FNK%(P1%-U%)
310 C%=FNK%(P1%) : REM i mitten
320 X1%=X%-T% : Y1%=Y%-T%
330 X2%=X%+T% : Y2%=Y%+T%
340 IF PEEK(65013)>0% RETURN
345 IF Z<1 THEN 410
350 REM rita 'djup'
360 IF ((NOT C%) AND (L% XOR L1%)) OR (C% AND L1%) FOR I%=Y1% TO Y2% : SETDOT I%,X1% : NEXT I%
370 IF ((NOT C%) AND (\% XOR \1%)) OR (C% AND \1%) FOR I%=X1% TO X2% : SETDOT Y1%,I% : NEXT I%
380 IF ((NOT C%) AND (R% XOR R1%)) OR (C% AND R1%) FOR I%=Y1% TO Y2% : SETDOT I%,X2% : NEXT I%
390 IF ((NOT C%) AND (N% XOR N1%)) OR (C% AND N1%) FOR I%=X1% TO X2% : SETDOT Y2%,I% : NEXT I%
400 IF C% OR (PEEK(65013)>0%) RETURN : REM sluta rita
410 T1%=T% : Z=Z+1 : T%=M%/Z
420 S%=T1%-T% : REM spalt bredd
430 IF S%<1% RETURN : REM -uppl|sning
440 REM rita 'diagonalt'
450 IF L% EQV \% FOR I%=0% TO S% : SETDOT Y1%+I%,X1%+I% : NEXT I%
460 IF \% EQV R% FOR I%=0% TO S% : SETDOT Y1%+I%,X2%-I% : NEXT I%
470 IF R% EQV N% FOR I%=0% TO S% : SETDOT Y2%-I%,X2%-I% : NEXT I%
480 IF N% EQV L% FOR I%=0% TO S% : SETDOT Y2%-I%,X1%+I% : NEXT I%
490 IF PEEK(65013)>0% RETURN
500 REM rita i sido-g}ngar
510 IF L% 560
520 GOSUB 740
530 IF Q% FOR I%=X1% TO X1%+S% : SETDOT Y1%+S%,I% : NEXT I%
540 GOSUB 830
550 IF Q% FOR I%=X1% TO X1%+S% : SETDOT Y2%-S%,I% : NEXT I%
560 IF \% 610
570 GOSUB 770
580 IF Q% FOR I%=Y1% TO Y1%+S% : SETDOT I%,X2%-S% : NEXT I%
590 GOSUB 740
600 IF Q% FOR I%=Y1% TO Y1%+S% : SETDOT I%,X1%+S% : NEXT I%
610 IF R% 660
620 GOSUB 800
630 IF Q% FOR I%=X2%-S% TO X2% : SETDOT Y2%-S%,I% : NEXT I%
640 GOSUB 770
650 IF Q% FOR I%=X2%-S% TO X2% : SETDOT Y1%+S%,I% : NEXT I%
660 IF N% 710
670 GOSUB 830
680 IF Q% FOR I%=Y2%-S% TO Y2% : SETDOT I%,X1%+S% : NEXT I%
690 GOSUB 800
700 IF Q% FOR I%=Y2%-S% TO Y2% : SETDOT I%,X2%-S% : NEXT I%
710 L1%=L% : \1%=\%
720 R1%=R% : N1%=N%
730 GOTO 260 : REM en till
740 Q%=FNK%(P1%-H%+U%)
750 IF NOT Q% FOR I%=0% TO S% : SETDOT Y1%+I%,X1%+I% : NEXT I%
760 RETURN
770 Q%=FNK%(P1%+H%+U%)
780 IF NOT Q% FOR I%=0% TO S% : SETDOT Y1%+I%,X2%-I% : NEXT I%
790 RETURN
800 Q%=FNK%(P1%+H%-U%)
810 IF NOT Q% FOR I%=0% TO S% : SETDOT Y2%-I%,X2%-I% : NEXT I%
820 RETURN
830 Q%=FNK%(P1%-H%-U%)
840 IF NOT Q% FOR I%=0% TO S% : SETDOT Y2%-I%,X1%+I% : NEXT I%
850 RETURN
860 REM main
870 ; CHR$(12);
880 FOR I%=0% TO 22% : ; CHR$(151%)
890 NEXT I% : ; CHR$(151%);
900 Z1=1 : GOSUB 190
910 IF PEEK(65013)=0% 910
920 GET C$ : C%=ASC(C$)
930 IF C%=32 IF FNK%(P%+F%) GOTO 1110 ELSE GOTO 5000
940 IF C%=66% IF FNK%(P%-F%) GOTO 1110 ELSE P%=P%-F% : GOTO 860
950 IF C$="U" Q%=F% : F%=U% : U%=-Q% : GOTO 860
960 IF C$="N" Q%=F% : F%=-U% : U%=Q% : GOTO 860
970 IF C%=9% Q%=F% : F%=H% : H%=-Q% : GOTO 860
980 IF C%=8% Q%=F% : F%=-H% : H%=Q% : GOTO 860
990 ; CHR$(12)
1000 ; "Kommandon:"
1010 ; " Vridningar:"
1020 ; " 'U' -> upp}t"
1030 ; " 'N' -> ner}t"
1040 ; " 'pil' v{nster"
1050 ; " 'pil' h|ger"
1060 ; " F|rflyttningar:"
1070 ; "