1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
PACKET lind wurm DEFINES lindwurm:
deklaration;
LET max = 500,zeilen = 23,spalten = 77;
PROC kriech :
speicher := stelle;
REP
putline(""1"Punkte:"+text(punkte + bonus) + ""6""0""30"Zeit:" + zeit);
IF punkte <> 0
THEN ende INCR 1;
IF ende > max THEN ende := 1 FI;
laenge := laenge + 1 - zaehler;
IF laenge > max THEN laenge := 1 FI;
wurm(ende) := speicher;
IF zaehler = 0 AND wurm(laenge) >= basis AND wurm(laenge) < (basis+(spalten*zeilen))
THEN poke(wurm(laenge),leerzeichen)
FI;
IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN
poke(speicher,char1)
FI
ELSE IF speicher >= basis AND speicher < (basis+(spalten*zeilen))
THEN poke (speicher,leerzeichen)
FI;
FI;
zaehler := 0;
speicher INCR richtung;
IF peek(speicher) <> leerzeichen THEN nahrung oder gift FI;
IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN poke(speicher,char2) FI;
tastaturabfrage;
IF punkte > begrenzung THEN x := int(zeit); index := 1 FI;
IF zeit > stopzeit THEN index := 2 FI;
UNTIL index <> 0 PER
ENDPROC kriech;
PROC nahrung oder gift :
IF peek(speicher) <> char 3 THEN index := 3
ELSE punkte INCR 10; zaehler := 1
FI;
ENDPROC nahrung oder gift;
PROC tastaturabfrage :
taste := incharety(9 DIV geschwindigkeit);
feuer := taste = ""13"";
IF feuer THEN richtung := 0
ELIF taste = ""10"" THEN richtung INCR spalten
ELIF taste = ""8"" THEN richtung DECR 1
ELIF taste = ""2"" THEN richtung INCR 1
ELIF taste = ""3"" THEN richtung DECR spalten
FI
ENDPROC tastatur abfrage;
PROC bonus erreicht :
x := (int(stopzeit)-x) * schwierigkeit;
cspalte := 10;
czeile := 10;
cursorpositionieren;
putline("B O N U S ! ! !");
line;
putline(""15" "+text(x)+" Punkte !!!"14"");
bonus := bonus + punkte + x;
ENDPROC bonus erreicht;
PROC poke (INT CONST stelle,wert) :
INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
y pos := 1 + ((stelle - basis) DIV spalten);
cursor(x pos,y pos);
IF wert = 126 THEN out(""15""8""14"") ELSE
out(code(wert));
FI;
bildschirm (x pos)(y pos) := wert;
ENDPROC poke;
INT PROC peek (INT CONST stelle) :
INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
y pos := 1 + ((stelle - basis) DIV spalten);
bildschirm (x pos)(y pos)
ENDPROC peek;
PROC cursorpositionieren :
bildschirm zeile := basis + spalten*czeile;
cursor(cspalte+1,czeile+1);
ENDPROC cursor positionieren;
PROC highscore und platznummer :
punkte := punkte + bonus;
bonus := 0;
IF punkte > highscore THEN highscore := punkte FI;
player counter INCR 1;
q := player counter + 1;
spieler punkte(playercounter) := punkte;
FOR i FROM 1 UPTO playercounter REP
IF punkte > spielerpunkte (i) THEN q DECR 1 FI;
PER;
c spalte :=10;
czeile := 10;
cursorpositionieren;
putline("Hoechstpunktzahl "+text(highscore));line;
putline(" Punkte :"+text(punkte));
putline(" Platznr.:"+text(q-1));
IF q-1 >= 10 THEN inchar(hilf)
ELSE put("Name des Gewinners:");
getline(hilf);
disablestop;
FOR i FROM playercounter DOWNTO q REP
spielername(i+1) := spielername(i);
IF iserror THEN clearerror; spielername(i+1) := "" FI;
PER;
enablestop;
spielername(q-1) := "(" +text(punkte) + " Punkte: " + hilf+")";
FI;
page;
putline("Die ersten 10 Gewinner :");
disablestop;
FOR i FROM 1 UPTO min(playercounter,10) REP
putline(text(i)+"."+spielername(i));
IF iserror THEN clearerror;spielername(i) := "" FI
PER;
enablestop;
putline("Druecken Sie eine Taste");
inchar(hilf);
ENDPROC highscore und platznummer;
PROC explosion :
out(""7"");
FOR i FROM ende DOWNTO laenge +1REP
IF wurm (i) >= basis AND wurm(i) < (basis+spalten*zeilen) THEN poke(wurm(i),leerzeichen);
FI;
PER;
highscore und platznummer
ENDPROC explosion;
PROC lindwurm :
bonus := 0;
REP
clearscreen;
out(""14""1""4"");
IF bonus = 0 THEN neues spiel FI;
IF bonus > 0 THEN bonusspiel FI;
page;
rahmen;
lebensraum generieren;
lindwurm kopf setzen;
reset time;
kriech;
SELECT index OF
CASE 1 : bonus erreicht
CASE 2 : highscore und platznummer
CASE 3 : explosion
ENDSELECT
UNTIL bonus<= 0 COR no(""1""4""10""10"Noch ein Spiel") PER
ENDPROC lindwurm;
PROC neues spiel :
basis := 0;
stelle := basis + spalten*zeilen DIV 2;
schwierigkeit := 4;
geschwindigkeit :=9;
char 1:= 126;
char 2:= 79;
char 3:= 42;
char 4:= 124;
leerzeichen := 32;
index := 0;
ende := 0;
laenge := 0;
richtung := 0;
zaehler := 0;
bonus := 0;
punkte := 0;
stopzeit :="3:00";
vorwahl;
begrenzung := 120 * schwierigkeit;
ENDPROC neues spiel;
PROC liste aller spieler :
page;
FOR i FROM 1 UPTO playercounter REP
putline(text(i)+"."+spielername(i));
IF i > 24 THEN pause(20) FI;
PER;
putline("ENDE");
inchar(hilf);
page;
ENDPROC liste aller spieler;
PROC vorwahl :
spielregeln;
page;
REP
out(""1"");
putline(""142" Lindwurm "143"");
czeile :=12;
cspalte:=3;
cursorpositionieren;
putline("Schwierigkeitsgrad (1/2) "+ text(schwierigkeit,3));
czeile :=14;
cspalte:=3;
cursorpositionieren;
putline("Geschwindigkeit (3/4) "+ text(geschwindigkeit,3));
czeile :=16;
cspalte:=3;
cursorpositionieren;
putline("Liste aller Spieler (5) ");
czeile :=18;
cspalte:=3;
cursorpositionieren;
putline("Start mit RETURN");
x := 0;
inchar(hilf);
IF hilf = ""13""THEN LEAVE vorwahl
ELIF hilf = "1" THEN schwierigkeit INCR 1
ELIF hilf = "2" THEN schwierigkeit DECR 1
ELIF hilf = "3" THEN geschwindigkeit INCR 1
ELIF hilf = "4" THEN geschwindigkeit DECR 1
ELIF hilf = "5" THEN liste aller spieler
ELSE out(""7"")
FI;
IF schwierigkeit > 26 THEN schwierigkeit := 1
ELIF schwierigkeit < 1 THEN schwierigkeit := 26 FI;
IF geschwindigkeit > 9 THEN geschwindigkeit := 1
ELIF geschwindigkeit < 1 THEN geschwindigkeit := 9 FI;
PER
ENDPROC vorwahl;
PROC spielregeln :
putline(code(char1)+" = Rahmen (Mauer)");
line;
putline(code(char2)+" = Lindwurmkopf");
line;
putline(code(char3)+" = Nahrung");
line;
putline(""15""8""14" = Lindwurm");
line;
putline(". = Gift");
line;
putline ("Ziel des Spiels ist es, den Wurm mit Nahrung zu versorgen. Gift ist tödlich.");
line;
putline ("Der Wurm kann mit den Pfeiltasten gesteuert werden. Wird eine Taste mehrmals");
line;
putline ("gedrückt, wird der Wurm schneller. Vorsicht: Der Wurm darf nicht auf eine");
line;
putline ("Mauer treffen. Mit jedem gefressenen Nahrungsteilchen wird der Wurm etwas");
line;
putline ("länger. Du hast 3 Minuten Zeit, den Wurm zu füttern.");
line;
putline ("Viel Erfolg. Bitte drücke jetzt eine Taste.");
pause(6000);
ENDPROC spielregeln;
PROC bonusspiel :
stelle := basis+zeilen*spaltenDIV2;
index := 0;
punkte := 0;
richtung := 0;
zaehler := 0;
ende := 0;
laenge := 0;
schwierigkeit INCR 1;
IF schwierigkeit > 26 THEN schwierigkeit := 26 FI;
begrenzung := 120 * schwierigkeit
ENDPROC bonusspiel;
PROC lebensraum generieren :
FOR i FROM 1 UPTO 16 * schwierigkeit REP
REP
x := int(random * real((zeilen-2)*spalten) + real(spalten));
UNTIL peek(basis+x) = leerzeichen PER;
poke(basis+x,char3)
PER;
FOR i FROM 1 UPTO schwierigkeit REP
REP
x := int(random * real((zeilen-2)*spalten) + real(spalten));
UNTIL peek(basis+x) = leerzeichen PER;
poke(basis+x,46)
PER;
ENDPROC lebensraum generieren;
PROC lindwurmkopf setzen :
WHILE peek(stelle) <> leerzeichen REP stelle INCR 1 PER;
poke(stelle,char2);
out(""7"");
ENDPROC lindwurmkopf setzen;
PROC rahmen :
FOR i FROM basis UPTO basis + spalten-1 REP
poke(i,char4);
poke(i+(zeilen-1)*spalten,char4);
PER;
i := basis + spalten;
REP poke(i ,char4);
poke(i+spalten-1,char4);
i INCR spalten
UNTIL i >( basis + (zeilen-1)*spalten )PER
ENDPROC rahmen;
PROC clearscreen :
INT VAR x,y;
putline ("Nun markiert der Wurm sein Revier.");
line ;
put("Es ist");put(spalten);put("qm gross.");line;
FOR x FROM 1 UPTO spalten REP
cout(x);
FOR y FROM 1 UPTO zeilen REP
bildschirm(x)(y) := leerzeichen
PER
PER
ENDPROC clearscreen;
TEXT PROC zeit :
subtext(time(clock(1)-uhr),5,8)
ENDPROC zeit;
PROC reset time :
uhr := clock(1)
ENDPROC reset time;.
deklaration :
ROW spalten ROW zeilen INT VAR bildschirm;
ROW 300 INT VAR spielerpunkte;
ROW 300 TEXT VAR spielername;
ROW max INT VAR wurm;
TEXT VAR hilf,taste,stopzeit;
INT VAR basis:=0,playercounter:=0,highscore:=0,q:=0,i:=0,x:=0,y:=0,stelle:=1000,richtung,
punkte:=0,bonus:=0,index:=0,cspalte,czeile,bildschirmzeile,zaehler:=0,ende:=0,
laenge:=0,speicher:=1,leerzeichen:=32,begrenzung:=480,schwierigkeit:=4,
geschwindigkeit:=9,c:=90,char1:=90,char2:=90,char3:=90,char4:=90;
REAL VAR uhr;
BOOL VAR feuer;
ENDPACKET lindwurm
|