10 ' WURM - EIN BILDSCHIRM-SPIEL
20 '
30 VERSION$ = "Version 1.1 vom 03.09.84"
40 '
50 FF$=CHR$(&HC)				'FORM FEED
52 ESC%=&H1B : ESC$=CHR$(ESC%)			'ESCAPE
54 PON%=1 : POF%=0				'PEN ON/OFF
56 KEYB%=5					'PORT NR.
58 '
60 RANDOMIZE(1)					'INIT RANDOM GENERATOR
70 XMIN%=0 : YMIN%=0 : XMAX%=159 : YMAX%=95	'SCHIRMGRENZEN
72 CALL WINDOW(XMIN%,YMIN%,XMAX%,YMAX%)		'ABSOLUTES PLOTT-FENSTER
74 XMAX%=XMAX%-XMIN% : XMIN%=0			'RELATIVE GRENZEN
76 YMAX%=YMAX%-YMIN% : YMIN%=0
78 DIM W%(20,95)			'BIT MAP-WIESE (0=OHNE WURM, 1=MIT W.)
80 DIM Q%(500,2) : LMAX%=500			'MAX WURMLAENGE
82 DIM S%(50) : SMAX%=50			'MAX SPIELZAHL
84 DIM MASK%(7) : FOR I%=0 TO 7 : MASK%(I%)=2^I% : NEXT I%	'BIT-MASKEN
90 '
91 DEF FNRX% = FIX(RND*(XMAX%-4)+2)		'ZUF. X-KOORD. AUF WIESE
92 DEF FNRY% = FIX(RND*(YMAX%-4)+2)		'ZUF. Y-KOORD.
94 DEF FNWW%(X0%,Y0%) = W%(FIX(X0%/8),Y0%) AND MASK%(ABS(X0% MOD 8)) '0=POS. FREI
98 '
100 PRINT FF$;"WURM - ";VERSION$ : PRINT
101 PRINT TAB(35);"Spielregeln" : PRINT
102 PRINT "Mitten auf einer Wiese sitzt ein kleiner Wurm. Er kann mit den Tasten"
103 PRINT
104 PRINT "             8                          oben"
106 PRINT "          4     6       nach     links         rechts"
108 PRINT "             2                          unten"
109 PRINT
110 PRINT "bewegt werden. Sein Ziel sollte immer die naechste Wurzel sein, die "
114 PRINT "irgendwo auf der Wiese waechst. Denn jedesmal, wenn der Wurm eine Wurzel"
116 PRINT "gefressen hat, waechst er um einige Segmente. Natuerlich moechte der Wurm
118 PRINT "so lang wie moeglich werden (";LAMX%;" Segmente ) - und das so schnell"
119 PRINT "wie moeglich."
120 PRINT
122 PRINT "Aber Obacht: Auf seinen Wegen darf er nicht den Rand der Wiese beruehren,"
123 PRINT "und er darf nicht ueber sich selbst hinwegkriechen."
124 PRINT "Sonst ist das Spiel zuende!"
126 SPIEL%=0					'ANZAHL DER GEMACHTEN SPIELE
127 ASUM=0 : LSUM=0 : DSUM=0 : PSUM=0		'AKKUM. WURZELN, LAENGE, DAUER, PUNKTE
130 PRINT
131 PRINT "Welche Spielstufe waehlst Du (1 bis 9) ?"
132 PRINT "( 1 = leicht      5 = mittel       9 = schwer )  ";
133 C$=INPUT$(1) : PRINT C$ : V%=VAL(C$) : IF V%<1 OR V%>9 GOTO 130
134 W%=V% : L%=3 : V%=3000/V%			'WACHSTUM, LAENGE, DELAY TIME
135 PRINT : PRINT "Auf RETURN geht's los...";
136 R=RND : C%=INP(KEYB%) : IF C%<>13 GOTO 136
137 GOSUB 960 : SEC0=SEC			'MOMENTANE ZEIT IN SEKUNDEN
138 CC%=INP(KEYB%)				'LETZTES INPUT-ZEICHEN MERKEN
139 '
140 PRINT FF$;ESC$;"A "				'CLEAR SCREEN, CURSOR OFF
142 CALL FRAME					'RAHMEN PLOTTEN
150 FOR Y%=0 TO YMAX%				'WIESE LOESCHEN
152 FOR X%=0 TO FIX(XMAX%/8) : W%(X%,Y%)=0 : NEXT X%
154 NEXT Y%
159 '
160 X%=XMAX%/2 : Y%=YMAX%/2			'ANFANGSPOSITION
162 J%=1 : K%=L%				'MOM.SCHWANZ- UND KOPF-POSITION
163 FOR I%=J% TO K% : Q%(I%,1)=X% : Q%(I%,2)=Y% : NEXT I%
164 GOSUB 940					'WIESE BEI X%,Y% BESETZEN
165 F%=0 					'FEHLER-NR.
166 IX%=0 : IY%=0				'BEWEGUNGS-INKREMENTE
168 A%=0 : B=0					'ANZAHL WURZELN, BEWEGUNGEN
169 '
170 WX%=FNRX% : WY%=FNRY%			'WURZEL-POSITION
172 IF FNWW%(WX%,WY%)<>0 GOTO 170		'WIESE FREI?
174 CALL PUTP(WX%,WY%,PON%)
176 'PRINT "WURZEL BEI";WX%,WY%
178 '
180 GOSUB 900					'EINGABE-ZEICHEN
182 ON C% GOSUB 200,192,200,194,200,196,200,198,200	'1 ... 9 FUER
184 GOTO 200					'RICHTUNGSAENDERUNG
190 '
191 IX%=-1 : IY%=-1 : RETURN
192 IX%= 0 : IY%=-1 : RETURN
193 IX%= 1 : IY%=-1 : RETURN
194 IX%=-1 : IY%= 0 : RETURN
196 IX%= 1 : IY%= 0 : RETURN
197 IX%=-1 : IY%= 1 : RETURN
198 IX%= 0 : IY%= 1 : RETURN
199 IX%= 1 : IY%= 1 : RETURN
200 '		WURM BEWEGEN
210 X%=X%+IX% : Y%=Y%+IY%			'NAECHSTER KOPF-PUNKT
212 IF X%<=XMIN% OR X%>=XMAX% THEN F%=1 : GOTO 800	'RANDBERUEHRUNG?
214 IF Y%<=YMIN% OR Y%>=YMAX% THEN F%=1 : GOTO 800	'FALLS JA, ABBRUCH
218 '
300 XX%=Q%(J%,1) : YY%=Q%(J%,2)			'SCHWANZPUNKT
310 CALL PUTP(XX%,YY%,POF%) 
312 'PRINT "GELOESCHT BEI",J%,XX%,YY%
314 GOSUB 950					'WIESE BEI XX%,YY% FREIMACHEN
316 J% = ABS(J% MOD L%) + 1
320 FOR I%=0 TO V% : I%=I% : NEXT I%		'DELAY
340 IF FNWW%(X%,Y%)<>0 THEN F%=2 : GOTO 800	'SELBSTBERUEHRUNG?
350 K% = ABS(K% MOD L%) + 1			'KOPF BEWEGEN
352 Q%(K%,1)=X% : Q%(K%,2)=Y% : GOSUB 940	'WIESE BEI X%,Y% BESETZEN
354 CALL PUTP(X%,Y%,PON%) 
355 'PRINT "GESETZT BEI",K%,X%,Y%
356 B=B+1					'BEWEGUNG ZAEHLEN
400 IF X%<>WX% OR Y%<>WY% GOTO 500		'WURZEL GETROFFEN?
402 A%=A%+1					'JA, ZAEHLEN
410 IF L%+W%>=LMAX% THEN F%=0 : GOTO 800	'MAX LAENGE ERREICHT?
420 FOR I%=L% TO J% STEP -1			'NEIN, WACHSTUM
422 Q%(I%+W%,1)=Q%(I%,1) : Q%(I%+W%,2)=Q%(I%,2) 'SCHWANZSTUECK VERSCHIEBEN
424 NEXT I%
430 FOR I%=J% TO J%+W%				'NEUES STUECK ANHAENGEN
432 Q%(I%,1)=Q%(J%,1) : Q%(I%,2)=Q%(J%,2)
434 NEXT I%
436 L%=L%+W% : S%=W%
437 IF K%>J% THEN K%=K%+W%
440 GOTO 170					'NAECHSTE WURZEL
450 '
500 GOTO 180					'NAECHSTE BEWEGUNG
790 '
800 '		ABBRUCH
810 GOSUB 960 : DSEC=SEC-SEC0
811 PRINT FF$;ESC$;"A";CHR$(&H22)		'CLEAR SCREEN, CURSOR ON
812 IF F%=0 THEN PRINT "BRAVO !!!  Du hast die maximale Wurmlaenge erreicht !" : L%=LMAX% : GOTO 850
830 PRINT "Schade !  ";
832 IF F%=1 THEN PRINT "Der Wurm hat den Rand der Wiese beruehrt."
834 IF F%=2 THEN PRINT "Der Wurm hat sich selbst ueberkrochen."
840 '
850 PRINT USING "##### Segmente war er lang.";L%
852 PRINT USING "##### Wurzeln hat er gefressen.";A%
854 PRINT USING "##### sec war er unterwegs.";DSEC
856 PTS%=CINT(L%/DSEC*A%) : PRINT "Das gibt";PTS%;"Punkte"
858 PRINT
860 SPIEL%=SPIEL%+1 : LSUM=LSUM+L% : ASUM=ASUM+A% : DSUM=DSUM+DSEC : PSUM=PSUM+PTS%
861 S%(SPIEL%)=PTS%
862 IF SPIEL%<=1 GOTO 870 ELSE PRINT "Nach";SPIEL%;" Spielen:"
863 PRINT "Mittlere Laenge:    ";CINT(LSUM/SPIEL%)
864 PRINT "Mittlere Dauer:     ";CINT(DSUM/SPIEL%)
866 PRINT "Mittlere Wurzelzahl:";CINT(ASUM/SPIEL%)
867 PRINT "Punkte: "; : FOR I%=1 TO SPIEL% : PRINT S%(I%); : NEXT I% : PRINT
868 PRINT "Mittlere Punktzahl: ";CINT(PSUM/SPIEL%)
869 '
870 IF SPIEL%>=SMAX% GOTO 990
871 PRINT : PRINT "Willst Du weiterspielen ? (J/N) ";
872 C$=INPUT$(1)
874 ON INSTR("JjNn",C$) GOTO 880,880,890,890
876 GOTO 872
880 PRINT C$ : GOTO 130
890 PRINT C$ : GOTO 1000
900 '		EINGABE VOM KEYBOARD
910 C%=INP(KEYB%)
912 IF C%=CC% GOTO 910				'AUF ERSTE EINGABE WARTEN
920 C%=C%-48					'HEX 30 ABZIEHEN
930 RETURN
940 '		WIESE BEI X%,Y% BESETZEN
942 B1%=FIX(X%/8) : B2%=ABS(X% MOD 8)
944 W%(B1%,Y%)=W%(B1%,Y%) OR MASK%(B2%)
946 RETURN
950 '		WIESE BEI XX%,YY% FREIMACHEN
952 B3%=FIX(XX%/8) : B4%=ABS(XX% MOD 8)
954 W%(B3%,YY%)=W%(B3%,YY%) AND (NOT MASK%(B4%)) 
956 RETURN
960 '		ZEIT IN SEKUNDEN NACH SEC HOLEN
962 HRS%=PEEK(&HFEFC) : MIN%=PEEK(&HFEFB) : SEC%=60-PEEK(&HFA35)
964 SEC=HRS%*3600 + MIN%*60 + SEC%
966 RETURN
980 '
990 PRINT "Du hast";SPIEL%;"Spiele gemacht. Nun lass mal andere ran."
1000 END
