home *** CD-ROM | disk | FTP | other *** search
-
- (*----------------------------------------------*)
- (* ZAHLWURM.PAS *)
- (* Spiel zum Kennenlernen des Zahlenraums 1 - 9 *)
- (* Copyright 1988 by B. Freier & PASCAL Int. *)
-
- PROGRAM Zahlwurm;
-
- USES Dos, Crt;
-
-
-
-
- CONST (* Bei Bedarf bitte ändern !!! *)
- kopf = 0; (* Farbe der Figur *)
- grundfarbe = 15; (* Farbe des Spielfeldes *)
- randfarbe = 3; (* Farbe der Umrandung *)
- ziffernfarbe = 1; (* Farbe bei Ziffernausgabe *)
- randzeichen = 177;
- (* ASCII-Zeichen für Umrandung *)
- kopfzeichen = 1; (* ASCII-Zeichen für Figur *)
- schlange = 6; (* Farbe des Schlangenkörpers *)
- schlangenzeichen = 233;
- (* ASCII-Zeichen für Körper *)
-
- TYPE
- schirmposition = ARRAY[1..40,1..22] OF INTEGER;
- position = ARRAY[1..300,1..2] OF INTEGER;
-
- VAR
- schirm : schirmposition;
- (* Bildschirmkoordinatenpaare *)
- posi : position;
- level, (* Verweildauer,evtl. anpassen *)
- speisezahl, (* Anzahl der Ziffern *)
- untergrenze,
- (* Untergrenze bei den Ziffern *)
- obergrenze,
- richtung, (* Aktuelle Richtung der Figur *)
- waag, (* Waagrechte Koordinate *)
- senk, (* Senkrechte Koordinate *)
- anfang,
- schluss,
- stufe : INTEGER;
- geschafft, (* Schalter, wenn Stufe fertig *)
- kollision, (* Schalter, falls angestoßen *)
- ende,
- mehr : BOOLEAN;
- (* Schalter für Programmende *)
- ch : CHAR;
- (* Buchstaben bei den Eingaben *)
- Regs : Registers;
- Color : BOOLEAN;
-
-
- PROCEDURE aufbau; (* Rand zeichnen und werten *)
-
- VAR i, j: INTEGER;
- ch : CHAR;
-
- BEGIN
- Randomize; ClrScr; TextColor(randfarbe);
- FOR i := 1 TO 40 DO BEGIN
- FOR j := 1 TO 22 DO BEGIN
- IF (i=1) OR (j=1) OR (i=40) OR (j=22) THEN
- BEGIN
- schirm[i,j] := randzeichen;
- GotoXY(i,j);
- Write(Chr(randzeichen));
- END;
- END;
- END;
- END;
-
-
- FUNCTION ColScr: BOOLEAN; (* Test ob Color - Karte *)
- BEGIN
- IF ((Mem[0064:0016] AND 48 ) DIV 16) = 3 THEN
- ColScr := FALSE
- ELSE
- ColScr := TRUE;
- END;
-
- PROCEDURE SetCursor(oben, unten: BYTE); (* Cursor setzen *)
- BEGIN
- WITH regs DO BEGIN
- ah := 1;
- ch := oben;
- cl := unten
- END;
- Intr($10, regs)
- End;
-
- PROCEDURE Cursor(art: BYTE); (* 1 ==> Cursor unsichtbar *)
- BEGIN (* 2 ==> Cursor normal *)
- CASE art OF (* 3 ==> Insmode *)
- 0 : SetCursor(32,0);
- 1 : IF color THEN SetCursor( 6, 7)
- ELSE SetCursor(11,13);
- 2 : IF color THEN SetCursor( 4, 7)
- ELSE SetCursor(6,13);
- END;
- END;
-
-
-
- PROCEDURE cursoroff; (* Cursor wird unsichtbar *)
-
- BEGIN
- Cursor(1);
- END;
-
-
- PROCEDURE zuweisung;
- (* Festlegen der Anfangswerte *)
- VAR i,j : INTEGER;
-
- BEGIN (* Initialisierung Bildschirm *)
- FOR i := 1 TO 40 DO
- FOR j := 1 TO 22 DO
- schirm[i,j] := 0;
- (* Schalter Voreinstellungen *)
- untergrenze:= 48;
- obergrenze := 57;
- waag := 18;
- senk := 2;
- richtung := 75;
- anfang := 6;
- schluss := 1;
- ende := FALSE;
- kollision := FALSE;
- geschafft := FALSE;
-
- END;
-
-
- PROCEDURE grundstellung;
- (* Startaufstellung belegen *)
- VAR i,j : INTEGER;
-
- BEGIN
- TextColor(kopf);
- schirm[waag,senk] := kopfzeichen;
- posi[6,1] := waag;
- posi[6,2] := senk;
- GotoXY(waag,senk);
- Write(Chr(kopfzeichen));
- textcolor(schlange);
- j := 14;
- for i := 19 to 23 do begin
- schirm[i,2] := schlangenzeichen;
- posi[i-j,1] := i;
- posi[i-j,2] := 2; j := j + 2;
- gotoxy(i,2);
- write(chr(schlangenzeichen));
- end;
- cursoroff;
- END;
-
-
- PROCEDURE speise_aufb; (* Aufbau der Ziffern *)
-
- VAR i,j,x : INTEGER;
-
- BEGIN
- speisezahl := 0; x := untergrenze;
- REPEAT
- i := Random(36)+3; j := Random(waag)+3;
- (* Zufallsauswahl *)
- TextColor(ziffernfarbe);
- IF schirm[i,j] = 0 THEN BEGIN
- speisezahl := speisezahl+1;
- schirm[i,j] := x;
- GotoXY(i,j); Write(Chr(x)); x:=x+1;
- END;
- UNTIL x>obergrenze;
- cursoroff;
- END;
-
-
- PROCEDURE schwanz; (* zeichnen aktuelle Schlange *)
-
- BEGIN
- anfang := anfang + 1;
- if anfang > 300 then anfang := 1;
- posi[anfang,1] := waag;
- posi[anfang,2] := senk;
- if not mehr then begin
- gotoxy(posi[schluss,1],posi[schluss,2]);
- write(chr(32));
- schirm[posi[schluss,1],posi[schluss,2]] := 0;
- schluss := schluss + 1;
- if schluss > 300 then schluss := 1;
- textcolor(kopf);
- end;
- END;
-
-
- PROCEDURE links; (* Bewegung nach links *)
-
- BEGIN
- waag := waag -1;
- IF schirm[waag,senk] = untergrenze THEN BEGIN
- untergrenze:=untergrenze+1;
- speisezahl := speisezahl -1; SOUND(500);
- mehr := true;
- END
- ELSE SOUND(300); (* bischen Krach *)
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN BEGIN
- schirm[waag+1,senk] := schlangenzeichen;
- schirm[waag,senk] := kopfzeichen;
- GotoXY(waag+1,senk); textcolor(schlange);
- Write(Chr(schlangenzeichen));
- GotoXY(waag,senk); textcolor(kopf);
- Write(Chr(kopfzeichen));
- schwanz;
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level); (* Krach aus und Pause *)
- IF speisezahl = 0 THEN geschafft := TRUE;
- mehr := false;
- END;
-
-
- PROCEDURE rechts; (* Bewegung nach rechts *)
-
- BEGIN
- waag := waag +1;
- IF schirm[waag,senk] = untergrenze THEN BEGIN
- untergrenze:=untergrenze+1;
- speisezahl := speisezahl -1; SOUND(500);
- mehr := true;
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN BEGIN
- schirm[waag-1,senk] := schlangenzeichen;
- schirm[waag,senk] := kopfzeichen;
- gotoxy(waag-1,senk); textcolor(schlange);
- Write(Chr(schlangenzeichen));
- GotoXY(waag,senk); textcolor(kopf);
- Write(Chr(kopfzeichen));
- schwanz;
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- mehr := false;
- END;
-
-
- PROCEDURE auf; (* Bewegung nach oben *)
-
- BEGIN
- senk := senk -1;
- IF schirm[waag,senk] = untergrenze THEN BEGIN
- untergrenze:=untergrenze+1;
- speisezahl := speisezahl -1; SOUND(500);
- mehr := true;
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN BEGIN
- schirm[waag,senk+1] := schlangenzeichen;
- schirm[waag,senk] := kopfzeichen;
- GotoXY(waag,senk+1); textcolor(schlange);
- Write(Chr(schlangenzeichen));
- GotoXY(waag,senk); textcolor(kopf);
- Write(Chr(kopfzeichen));
- schwanz;
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- mehr := false;
- END;
-
-
- PROCEDURE ab; (* Bewegung nach unten *)
-
- BEGIN
- senk := senk +1;
- IF schirm[waag,senk] = untergrenze THEN BEGIN
- untergrenze:=untergrenze+1;
- speisezahl := speisezahl -1; SOUND(500);
- mehr := true;
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN BEGIN
- schirm[waag,senk-1] := schlangenzeichen;
- GotoXY(waag,senk-1); textcolor(schlange);
- Write(Chr(schlangenzeichen));
- schirm[waag,senk] := kopfzeichen;
- GotoXY(waag,senk); textcolor(kopf);
- Write(Chr(kopfzeichen));
- schwanz;
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- mehr := false;
- END;
-
-
- PROCEDURE wiederholung;
- (* Frage der Spielwiederholung *)
- BEGIN
- GotoXY(7,11);
- Write('Noch ein Spiel (J/N)'); cursoroff;
- REPEAT
- ch := ReadKey;
- UNTIL ch IN ['J','j','N','n',' '];
- IF UpCase(ch)='N' THEN ende := TRUE;
- END;
-
-
- PROCEDURE tastaturabfrage;
- (* Abfrage der Bewegungen *)
- BEGIN
- ch := ReadKey;
- IF (ch=Chr(27)) AND KeyPressed THEN ch := ReadKey;
- IF ch IN ['K','M','H','P'] THEN
- richtung := Ord(ch);
- END;
-
-
- PROCEDURE spiel; (* Verwaltung des Spiels *)
- BEGIN
- TextColor(kopf);
- REPEAT
- ch := ReadKey;
- UNTIL (ch=Chr(32));
- REPEAT
- IF KeyPressed THEN tastaturabfrage;
- CASE Ord(richtung) OF
- 75 : links;
- 77 : rechts;
- 72 : auf;
- 80 : ab;
- END;
- UNTIL kollision OR geschafft;
- END;
-
-
-
-
-
- PROCEDURE kollision_behandlung;
- (* Zusammenstoß anzeigen *)
- var i,j : integer;
-
- BEGIN
- ClrScr; GotoXY(5,5);
- Write('Schade, Du bist angestoßen !');
- cursoroff;
- j := 910;
- for i := 1 to 10 do begin
- sound(j); delay(300);
- j := j - 100;
- end;
- nosound;
- wiederholung;
- END;
-
-
- procedure fanfare; (* Siegerehrung, wenn geschafft *)
-
- var i : integer;
-
- BEGIN
- clrscr;
- gotoxy(5,5);
- write('Prima, Du hast es geschafft!');
- cursoroff;
- for i := 1 to 20 do begin
- sound(i*100);
- delay(300);
- end;
- nosound;
- end;
-
-
- PROCEDURE nextlevel; (* Übergang nächste Spielstufe *)
-
- BEGIN
- if stufe + 1 < 6 then begin
- stufe := stufe + 1;
- gotoxy(5,11);
- write('Du kommst in die nächste');
- gotoxy(5,13);
- write('Schwierigkeitsstufe: ',stufe:1);
- cursoroff;
- level := (5-stufe)*50 + 30;
- delay(10000);
- end
- else wiederholung;
- END;
-
-
- PROCEDURE levelabfrage; (* Benutzerabfrage Anfangslevel *)
-
- var j : integer;
-
- begin
- clrscr;
- gotoxy(4,3);
- write('Welche Schwierigkeitsstufe: (1..5)');
- gotoxy(9,6);
- write('1 ganz langsam');
- gotoxy(9,8);
- write('2 langsam');
- gotoxy(9,10);
- write('3 mittel');
- gotoxy(9,12);
- write('4 schnell');
- gotoxy(9,14);
- write('5 sehr schnell');
- gotoxy(4,18);
- write('Bitte die gewählte Ziffer drücken !');
- cursoroff;
- repeat
- ch := ReadKey;
- until ch in ['1'..'5',' '];
- if (stufe = 0) and (ch = ' ') then stufe := 1;
- if (ch <> ' ') then val(ch,stufe,j);
- level := (5-stufe)*50 + 30;
- anfang := 6;
- end;
-
-
- PROCEDURE spielvorb;
- (* Hauptverwaltung des Spieles *)
- BEGIN
- zuweisung; aufbau;
- grundstellung; cursoroff;
- speise_aufb;
- textcolor(kopf);
- gotoxy(7,24);
- write('Schwierigkeitsstufe: ',stufe:2);
- cursoroff;
- spiel;
- IF kollision THEN kollision_behandlung;
- IF geschafft THEN begin
- fanfare;
- nextlevel;
- end;
- if (ende = false) and (geschafft = false) then begin
- levelabfrage;
- REPEAT
- spielvorb;
- UNTIL ende = true;
- end;
- END;
-
-
- PROCEDURE spielerklaerung; (* Erklärung des Ablaufs *)
-
- BEGIN
- textbackground(grundfarbe);
- textcolor(kopf);
- clrscr;
- gotoxy(6,2);
- write('Z A H L E N S C H L A N G E');
- gotoxy(1,6);
- writeln(' Bei diesem Spiel geht es darum, eine ');
- writeln(' Schlange durch einen Raum zu führen, ');
- writeln(' in dem die Zahlen von 1 bis 9 stehen.');
- writeln(' Die Schlange muß die Zahlen in genau ');
- writeln(' der richtigen Reihenfolge fressen, ');
- writeln(' wobei mit jeder Ziffer die Länge der ');
- writeln(' Schlange zunimmt. ');
- writeln(' Die Außenwand sowie die Schlange ');
- writeln(' selbst dürfen nicht angeknabbert wer-');
- writeln(' den. Ein Bremsen ist ebenfalls nicht ');
- writeln(' möglich, da sie sich dadurch selbst ');
- writeln(' verschluckt. ');
- writeln; writeln;
- writeln(' Steuerung mit den Pfeiltasten ');
- writeln(' oder mit dem Joystick möglich. ');
- writeln(' Leertaste zum Starten benutzen. ');
- gotoxy(8,25); write('Bitte eine Taste drücken !');
- cursoroff;
- repeat until keypressed;
- clrscr;
- END;
-
-
- BEGIN (* Hauptprogramm *)
- TextMode(c40);
- Color := ColScr;
- spielerklaerung;
- stufe := 1;
- levelabfrage;
- Randomize;
- REPEAT
- spielvorb;
- UNTIL ende;
- TextMode(c80);
- END.