home *** CD-ROM | disk | FTP | other *** search
- PROGRAM zahlenwurm;
-
- (* Spiel zum Kennenlernen des Zahlenraums 1 - 9 *)
- (* Copyright 1988 by B. Freier & PASCAL Int. *)
-
- 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 = 233; (* ASCII-Zeichen für Figur *)
- obergrenze = 57;(* Obergrenze bei den Ziffern *)
-
- TYPE
- schirmposition = ARRAY[1..40,1..22] OF INTEGER;
-
- VAR
- schirm : schirmposition;
- (* Bildschirmkoordinatenpaare *)
- level, (* Verweildauer,evtl. anpassen *)
- speisezahl, (* Anzahl der Ziffern *)
- untergrenze,
- (* Untergrenze bei den Ziffern *)
- richtung, (* Aktuelle Richtung der Figur *)
- waag, (* Waagrechte Koordinate *)
- senk : INTEGER;
- (* Senkrechte Koordinate *)
- geschafft, (* Schalter, wenn Stufe fertig *)
- kollision, (* Schalter, falls angestoßen *)
- ende : BOOLEAN;
- (* Schalter für Programmende *)
- ch : CHAR;
- (* Buchstaben bei den Eingaben *)
-
-
- 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;
-
-
- PROCEDURE cursoroff; (* Cursor wird unsichtbar *)
-
- BEGIN (* Bei Monochrom-Monitor statt
- $b800 bitte $b000 einsetzen *)
- GotoXY(1,23); Mem[$b800:$06e0]:=219;
- Mem[$b800:$06e1]:=grundfarbe;
- 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 *)
- waag := 18; senk := 2; untergrenze:=49;
- richtung := 75; ende := FALSE;
- kollision := FALSE; geschafft := FALSE;
- END;
-
-
- PROCEDURE grundstellung;
- (* Startaufstellung belegen *)
- VAR i,j : INTEGER;
-
- BEGIN
- TextColor(kopf);
- schirm[waag,senk] := kopfzeichen;
- GotoXY(waag,senk); Write(Chr(kopfzeichen));
- 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 links; (* Bewegung nach links *)
-
- BEGIN
- waag := waag -1;
- IF schirm[waag,senk] = untergrenze THEN BEGIN
- untergrenze:=untergrenze+1;
- speisezahl := speisezahl -1; SOUND(500);
- END
- ELSE SOUND(300); (* bischen Krach *)
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN
- BEGIN
- schirm[waag+1,senk] := 0;
- GotoXY(waag+1,senk); Write(Chr(32));
- GotoXY(waag,senk); Write(Chr(kopfzeichen));
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level); (* Krach aus und Pause *)
- IF speisezahl = 0 THEN geschafft := TRUE;
- 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);
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN
- BEGIN
- schirm[waag-1,senk] := 0;
- GotoXY(waag-1,senk); Write(Chr(32));
- GotoXY(waag,senk); Write(Chr(kopfzeichen));
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- 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);
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN
- BEGIN
- schirm[waag,senk+1] := 0;
- GotoXY(waag,senk+1); Write(Chr(32));
- GotoXY(waag,senk); Write(Chr(kopfzeichen));
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- 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);
- END
- ELSE SOUND(300);
- IF (schirm[waag,senk] = 0)
- OR (schirm[waag,senk] = untergrenze-1) THEN
- BEGIN
- schirm[waag,senk-1] := 0;
- GotoXY(waag,senk-1); Write(Chr(32));
- GotoXY(waag,senk); Write(Chr(kopfzeichen));
- cursoroff;
- END
- ELSE kollision:=TRUE;
- NOSOUND; Delay(level);
- IF speisezahl = 0 THEN geschafft := TRUE;
- END;
-
-
- PROCEDURE wiederholung;
- (* Frage der Spielwiederholung *)
- BEGIN
- GotoXY(7,11);
- Write('Noch ein Spiel (J/N)'); cursoroff;
- REPEAT
- Read(Kbd,ch);
- UNTIL ch IN ['J','j','N','n',' '];
- IF UpCase(ch)='N' THEN ende := TRUE;
- END;
-
-
- PROCEDURE tastaturabfrage;
- (* Abfrage der Bewegungen *)
- BEGIN
- Read(Kbd,ch);
- IF (ch=Chr(27)) AND KeyPressed THEN Read(Kbd,ch);
- IF ch IN ['K','M','H','P'] THEN
- richtung := Ord(ch);
- END;
-
-
- PROCEDURE spiel; (* Verwaltung des Spiels *)
- BEGIN
- TextColor(kopf);
- REPEAT
- Read (Kbd,ch);
- 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;
- (* Figur ist angestoßen *)
- BEGIN
- ClrScr; GotoXY(5,5);
- Write('Schade, Du bist angestoßen !');
- cursoroff;
- wiederholung;
- END;
-
-
- PROCEDURE spielvorb;
- (* Hauptverwaltung des Spieles *)
- BEGIN
- zuweisung; aufbau;
- grundstellung; speise_aufb; spiel;
- IF kollision THEN kollision_behandlung;
- IF geschafft THEN wiederholung;
- IF NOT (ende OR geschafft) THEN BEGIN
- REPEAT
- spielvorb;
- UNTIL ende;
- END;
- END;
-
-
- BEGIN (* Hauptprogramm *)
- TextMode(c40);
- TextBackGround(grundfarbe);
- TextColor(kopf);
- level:=300; Randomize;
- REPEAT
- spielvorb;
- UNTIL ende;
- TextMode(c80);
- END.
-