home *** CD-ROM | disk | FTP | other *** search
- (* -------------------------------------------- *)
- (* HASEN.PAS *)
- (* ein Spiel fuer Kinder zum Kennenlernen der *)
- (* der Tastatur fuer Turbo Pascal unter MS-DOS. *)
- (* (C)1988 B.Freier & PASCAL INT. *)
- PROGRAM Hasen;
- CONST
- hasenzahl = 6; (* Anzahl der Hasen *)
- gras = 10; (* Farbe des Rasens *)
- fell = 6; (* Farbe des Hasenfells *)
- papier = 15; (* Farbe des Hintergrundes *)
- schrift = 1; (* Farbe der Schrift *)
-
- TYPE (* Spielfeld: *)
- spfeld = ARRAY[1..15,1..4] OF BOOLEAN;
-
- VAR
- x,y, (* aktuelle Koordinaten *)
- xalt,yalt, (* vorherige Koordinaten *)
- richtung, (* Richtung der Bewegung *)
- i, (* allgemeine Zaehlvariable *)
- freie,gefangen, (* Zahl der Hasenarten *)
- farbe : INTEGER; (* Farbvariable *)
- spielfeld : spfeld;
- (* allgemeine Eingabevariable: *)
- ch : CHAR;
- ende, (* Schalter fuer Programmende *)
- (* Schalter fuer Loesung der Aufgabe: *)
- geschafft : BOOLEAN;
-
- (* -------------------------------------------- *)
- (* Cursor wird unsichtbar *)
- (* Bei Monochrom-Monitor statt $B800 bitte *)
- (* $B000 einsetzen: *)
- PROCEDURE CursorOff;
- BEGIN
- GotoXY(1,25);
- Mem[$B800:$06E0] := 32;
- Mem[$B800:$06E1] := papier;
- END;
-
- (* -------------------------------------------- *)
- (* Erklaerung des Ablaufes *)
- PROCEDURE spielerklaerung;
- BEGIN
- TextBackGround(papier); TextColor(schrift);
- ClrScr;
- GotoXY(7,3); Write ('H A S E N F A N G E N');
- GotoXY(2,6);
- Write ('Oh Schreck! Dem Nachbarn sind seine');
- GotoXY(2,8);
- Write ('6 Hasen aus dem Stall entkommen. Sie');
- GotoXY(2,10);
- Write ('sitzen unbewacht im Garten.');
- GotoXY(2,12);
- Write ('Nimm schnell einen Rahmen und hilf');
- GotoXY(2,14);
- Write ('beim Fangen der Hasen.');
- GotoXY(2,18);
- Write ('Steuere den Rahmen mit den Pfeilta-');
- GotoXY(2,20);
- Write ('sten und drücke die Eingabetaste,');
- GotoXY(2,22);
- Write ('wenn der Rahmen um den Hasen liegt.');
- GotoXY(2,25);
- Write ('Drücke jetzt eine beliebige Taste !');
- REPEAT UNTIL KeyPressed;
- ClrScr;
- END;
-
- (* -------------------------------------------- *)
- PROCEDURE spielfeldfrei
- (VAR spielfeld :spfeld ; x,y : INTEGER );
- BEGIN
- FOR x:=1 TO 15 DO
- FOR y:=1 TO 4 DO
- spielfeld[x,y]:=FALSE;
- END;
-
- (* -------------------------------------------- *)
- (* zeichnet den Hasen *)
- PROCEDURE hase (x,y : INTEGER);
-
- BEGIN
- TextBackGround(gras); TextColor(fell);
- GotoXY(x*5-1,y*5-2);
- Write (Chr(222)+Chr(32)+Chr(32)+Chr(221));
- GotoXY(x*5-1,y*5-1);
- Write (Chr(32)+Chr(219)+Chr(219));
- GotoXY(x*5-1,y*5);
- Write (Chr(219)+Chr(219)+Chr(219)+Chr(219));
- GotoXY(x*5-1,y*5+1);
- Write (Chr(219)+Chr(219)+Chr(219)+Chr(219));
- TextBackGround(fell); TextColor(0);
- GotoXY(x*5,y*5+1);
- Write (Chr(201)+Chr(187)); (* Schwaenzchen *)
- TextBackGround(papier); CursorOff;
- END;
-
- (* -------------------------------------------- *)
- (* zeichnet den Rahmen *)
- PROCEDURE rahmen (x,y,farbe : INTEGER);
-
- BEGIN
- TextBackGround(farbe);
- GotoXY(x*5-2,y*5-3); Write(' ');
- FOR i:=1 TO 4 DO BEGIN
- GotoXY(x*5-2,y*5-3+i); Write(' ');
- GotoXY(x*5+3,y*5-3+i); Write(' ');
- END;
- GotoXY(x*5-2,y*5+2); Write(' ');
- TextBackGround(papier); CursorOff;
- END;
-
- (* -------------------------------------------- *)
- (* Zufallsverteilung der Hasen *)
- PROCEDURE hasenverteilen (VAR spielfeld : spfeld);
-
- LABEL nocheinmal;
- VAR zufallx,zufally : INTEGER;
-
- BEGIN
- WINDOW(3,2,78,22); (* Feld in gruener Farbe: *)
- TextBackGround(gras);
- ClrScr; WINDOW(1,1,80,25);
- Randomize; (* Setzen des Zufallsgenerators *)
- FOR i:=1 TO hasenzahl DO BEGIN
- nocheinmal: (* Auswahl der Zufallspositionen: *)
- zufallx:=Random(15)+1; zufally:=Random(4)+1;
- IF NOT spielfeld[zufallx,zufally] THEN BEGIN
- (* Platz im Spielfeld ist unbelegt *)
- spielfeld[zufallx,zufally]:=TRUE;
- hase(zufallx,zufally);
- END
- ELSE (* Platz im Spielfeld ist belegt *)
- GOTO nocheinmal;
- END;
- END;
-
- (* -------------------------------------------- *)
- (* Ausgabe des aktuellen Standes *)
- PROCEDURE wertausgabe (freie,gefangen : INTEGER);
- BEGIN
- GotoXY(2,1);
- Write('Noch frei : ',freie);
- GotoXY(60,1);
- Write('Schon gefangen : ',gefangen);
- END;
-
- (* -------------------------------------------- *)
- (* Frage der Spielwiederholung *)
- PROCEDURE wiederholung (VAR ende : BOOLEAN);
-
- VAR ch : CHAR;
-
- BEGIN
- ClrScr;
- GotoXY(17,3);
- Write('PRIMA, Du hast alle Hasen eingefangen!');
- GotoXY(27,21); Write('Noch ein Spiel (J/N)');
- REPEAT
- Read(Kbd,ch);
- UNTIL ch IN ['J','j','N','n'];
- ende := (UpCase(ch)='N');
- END;
-
- (* -------------------------------------------- *)
- (* Prueft, ob wirklich Hase dort *)
- PROCEDURE kontrolle
- (VAR freie,gefangen : INTEGER;
- VAR geschafft : BOOLEAN;
- VAR spielfeld : spfeld ; x,y : INTEGER);
-
- BEGIN
- IF NOT geschafft THEN
- IF spielfeld[x,y] THEN BEGIN
- spielfeld[x,y] := FALSE; (* Hase loeschen *)
- WINDOW(x*5-1,y*5-2,x*5+2,y*5+1);
- TextBackGround(gras);
- ClrScr; WINDOW(1,1,80,25);
- TextBackGround(papier);
- GotoXY (12,24);
- Write('Prima, Du hast wieder einen ',
- 'Hasen gefangen !');
- freie := freie-1; gefangen := gefangen+1;
- wertausgabe(freie,gefangen);
- IF freie = 0 THEN BEGIN
- geschafft := TRUE;
- wiederholung(ende);
- END
- ELSE
- REPEAT UNTIL KeyPressed;
- GotoXY (2,24); ClrEol;
- END
- ELSE BEGIN
- GotoXY(22,24);
- Write('Schade, hier ist kein Hase !');
- REPEAT UNTIL KeyPressed;
- GotoXY(2,24); ClrEol;
- END;
- END;
-
- (* -------------------------------------------- *)
- (* Hauptsteuerung des Spieles *)
- PROCEDURE spiel
- (VAR x,y,xalt,yalt : INTEGER;
- VAR ch : CHAR;
- VAR geschafft : BOOLEAN);
-
- BEGIN
- WHILE NOT geschafft DO BEGIN
- Read(Kbd,ch);
- IF ch = Chr(13) THEN
- kontrolle(freie,gefangen,geschafft,
- spielfeld,x,y)
- ELSE IF (ch=Chr(27)) AND KeyPressed THEN BEGIN
- Read(Kbd,ch);
- IF ch IN ['K','M','H','P'] THEN BEGIN
- richtung := Ord(ch);
- xalt := x; yalt := y;
- CASE Ord(richtung) OF
- 75 : IF x > 1 THEN BEGIN (* Links *)
- x := x-1;
- rahmen(xalt,yalt,gras);
- rahmen(x,y,schrift);
- END;
- 77 : IF x < 15 THEN BEGIN (* Rechts *)
- x := x+1;
- rahmen(xalt,yalt,gras);
- rahmen(x,y,schrift);
- END;
- 72 : IF y > 1 THEN BEGIN (* Aufwaerts *)
- y := y-1;
- rahmen(xalt,yalt,gras);
- rahmen(x,y,schrift);
- END;
- 80 : IF y < 4 THEN BEGIN (* Abwaerts *)
- y := y+1;
- rahmen(xalt,yalt,gras);
- rahmen(x,y,schrift);
- END;
- END;
- END;
- END;
- END;
- END;
-
- (* -------------------------------------------- *)
- BEGIN (* Hasen *)
- ende := FALSE;
- REPEAT (* Spielschleife *)
- TextMode(C40);
- spielerklaerung;
- TextMode(C80); TextBackGround(papier);
- TextColor(fell); ClrScr;
- geschafft := FALSE; (* Initialisierungen *)
- spielfeldfrei(spielfeld,x,y);
- hasenverteilen(spielfeld);
- x := 7; y := 2; xalt := 1; yalt := 1;
- i := 1; ch := 'A';
- freie := 6; gefangen := 0;
- wertausgabe(freie,gefangen);
- rahmen(x,y,schrift);
- spiel(x,y,xalt,yalt,ch,geschafft);
- UNTIL ende AND geschafft;
- TextMode(C80);
- ClrScr;
- END.