home *** CD-ROM | disk | FTP | other *** search
- PROGRAM INVERSO;
- (* System : MS-DOS Sprache : Turbo Pascal 4.0 *)
- (* V.1.0.b - 12.10.88 CGA-Version *)
-
- {$R+,S-,I+,D+,T-,F+,V+,B+,N-,L+ }
- {$M 16384,0,655360 }
-
- USES CRT, DOS, Graph, SpieleGraph, InvSpr1, InvSpr2;
- (* in Spielegraph : GraphDir an die eigenen Verzeichnisse anpassen ! *)
- (* InvSpr1 : UNIT mit Sprite-Daten des ersten Steines *)
- (* InvSpr2 : UNIT mit Sprite-Daten des zweiten Steines *)
- (* jeder Sprite hat die Abmessungen 16 * 16 *)
-
- CONST Max = 63; (* 8 * 8 - Spielfeld *)
- Stein = #32; (* zur Anzeige in INTRO *)
-
- StartX : INTEGER = 20;
- DeltaX : INTEGER = 21;
- Zeilen : INTEGER = 8;
- StartY : INTEGER = 30;
- DeltaY : INTEGER = 21;
- Spalten: INTEGER = 8;
-
-
- VAR Feld : ARRAY [0..Max] OF 0..1;
- Von1, Von2,
- Nach1, Nach2 : CHAR;
- Korrekt : BOOLEAN;
- Space2 : POINTER;
- Anzahl,
- Verwandelt : INTEGER;
- (*-----------------------------------------------*)
- FUNCTION Wirklich (Frage : STRING) : BOOLEAN;
- (* Ja oder Nein *)
- VAR Ch : CHAR;
-
- BEGIN
- SetViewPort (MinX+1, MaxY-19, MaxX-1, MaxY-1, ClipOff);
- ClearViewPort;
- SetColor (2); OutTextXY (5, 5, Frage);
-
- REPEAT
- Ch := ReadKey
- UNTIL UpCase (Ch) IN ['J', 'N'];
- Wirklich := Ch IN ['J', 'j'];
- END;
- (*-----------------------------------------------*)
- PROCEDURE Initialisierung;
- (* die mittleren 16 Felder sind bereits umgewandelt *)
- (* mit der RANDOM-Function kann man eine zufällige *)
- (* Start-Konstellation ausgeben lassen *)
-
- VAR I, J : INTEGER;
-
- BEGIN
- FillChar (Feld, SizeOf (Feld), #1); (* normaler Stein *)
- I := 17;
- REPEAT
- FOR J := 1 TO 4 DO Feld [I+J] := 0; (* verwandelter Stein *)
- I := I + 8; (* Feld 18 - 21 usw *)
- UNTIL I > 41;
- Anzahl := 1; Verwandelt := 16;
-
- GraphikInit (CGA, CGAC2);
- SetTextStyle (SmallFont, HorizDir, 4);
- SetColor (2);
- MachRaster (StartX, Spalten, DeltaX, StartY, Zeilen, DeltaY, TRUE);
- SetColor (3); OutTextXY (130, 1, 'I N V E R S O');
- END;
- (*-----------------------------------------------*)
- PROCEDURE ZeigSteine;
-
- VAR TempZeile, TempSpalte, HilfX, HilfY : INTEGER;
-
- BEGIN
-
- FOR TempZeile := 0 TO 7 DO BEGIN
- HilfY := StartY + 3 + DeltaY * TempZeile;
- FOR TempSpalte := 0 TO 7 DO BEGIN
- HilfX := StartX + 3 + DeltaX * TempSpalte;
- CASE Feld [TempZeile * 8 + TempSpalte] OF
- 1 : PutImage (HilfX, HilfY, Sprite1^, NormalPut)
- ELSE PutImage (HilfX, HilfY, Sprite2^, NormalPut);
- END; (* CASE Feld [..] *)
- END; (* FOR TempSpalte *)
- END; (* FOR TempZeile *)
-
- SetColor (0); (* alte Werte löschen *)
- OutTextXY (200, 150, 'Zuege : ' + Int2Str (Anzahl - 2, 4));
- OutTextXY (200, 170, 'Verwandelt : ' + Int2Str (Verwandelt - 1, 4));
-
- SetColor (1);
- OutTextXY (200, 150, 'Zuege : ' + Int2Str (Anzahl - 1, 4));
- OutTextXY (200, 170, 'Verwandelt : ' + Int2Str (Verwandelt, 4));
-
- Anzahl := SUCC(Anzahl);
- Verwandelt := SUCC(Verwandelt);
-
- END;
- (*-----------------------------------------------*)
- PROCEDURE INTRO;
- (*----------*)
- PROCEDURE Stein_1_Setzen;
- BEGIN
- TextBackGround (Green); WRITE (Stein); TextBackGround (Black);
- END;
- (*----------*)
- PROCEDURE Stein_2_Setzen;
- BEGIN
- TextBackGround (Red); WRITE (Stein); TextBackGround (Black);
- END;
- (*----------*)
- BEGIN
- TextMode (C80);
- CLRSCR; GOTOXY (36,1); INVERS; WRITE (' INVERSO '); Normal;
- TextColor (White);
- GOTOXY (3,5);
- WRITE ('Ihre Aufgabe bei diesem Spiel ist es, auf einem');
- WRITE (' Brett mit 64 Feldern alle');
- GOTOXY (3,6);
- WRITE ('durch "'); Stein_1_Setzen; WRITE ('" angezeigten Steine in "');
- Stein_2_Setzen;
- WRITE ('" Spielsteine zu verwandeln.');
- GOTOXY (26,9);
-
- WRITE ('Dabei gelten folgende REGELN :');
-
- GOTOXY (3,11);
- WRITE ('1 - Es darf nur diagonal gesprungen werden.');
- GOTOXY (3,12);
- WRITE ('2 - Es darf nur mit "'); Stein_1_Setzen; WRITE ('" über "');
- Stein_1_Setzen;
- WRITE ('" in ein Feld mit "');
- Stein_2_Setzen;
- WRITE ('" gesprungen werden.');
- GOTOXY (1,14);
- WRITE ('>>> Das Feld mit "');
- Stein_2_Setzen;
- WRITE ('" wird dabei zu "'); Stein_1_Setzen;
- WRITE ('", die 2 Felder mit "'); Stein_1_Setzen; WRITE ('" werden zu "');
- Stein_2_Setzen;
- WRITE ('". <<<');
- GOTOXY (30,17); WRITE ('Spiel-Abbruch mit CTRL-Q');
- GOTOXY (30,23);
- INVERS;
- WRITE (' Weiter mit Tastendruck ');
- NORMAL;
- REPEAT UNTIL KEYPRESSED;
- END;
- (*-----------------------------------------------*)
- PROCEDURE EingabeFeld;
-
- BEGIN
- SetColor (1);
- BAR (195, 25, 305, 65);
- (* Space zum Löschen definieren *)
- GetMem (Space2, ImageSize (0, 0, 20, 10));
- GetImage (280, 40, 300, 50, Space2^);
- SetColor (0);
- OutTextXY (225, 30, 'Zugeingabe :');
- OutTextXY (205, 40, 'von Feld :');
- OutTextXY (205, 50, 'nach Feld :');
- SetColor (1);
- END;
- (*-----------------------------------------------*)
- PROCEDURE ZugEingabe (Start : BYTE; Zulaessig : BYTE ;
- VAR Zug1, Zug2 : CHAR);
-
- VAR PositionNeu, PNZeile, PNSpalte,
- PositionAlt, PAZeile, PASpalte,
- AktZeile : INTEGER;
- OK : BOOLEAN;
- (*----------*)
- PROCEDURE Kontrolle;
- (* überprüft den eingegebenen Zug und wandelt *)
- (* die Steine um *)
-
- BEGIN
- PositionNeu := (ORD(Zug2) - 49) * 8 + (ORD(Zug1) - 65);
- PNZeile := PositionNeu DIV 8 ;
- PNSpalte := PositionNeu AND 7; (* entspricht MOD 8 *)
- IF Feld [PositionNeu] = Zulaessig THEN Korrekt := TRUE;
- IF (Zulaessig = 0) AND Korrekt THEN
- BEGIN
- Korrekt :=
- (ABS (PNZeile - PAZeile) = 2) AND (ABS (PNSpalte - PASpalte) = 2);
-
- IF Korrekt THEN
- BEGIN (* Neue Belegung *)
- Feld [ROUND((PositionNeu + PositionAlt)/2)] := 0;
- Feld [PositionAlt] := 0;
- Feld [PositionNeu] := 1;
- END
- ELSE Beep (400, 200);
-
- END
- ELSE BEGIN
- PositionAlt := PositionNeu; (* Zwischenspeicherung *)
- PAZeile := PNZeile;
- PASpalte := PNSpalte;
- END
- END;
- (*----------*)
- BEGIN
- Korrekt := FALSE;
-
- IF Start = 1 THEN
- BEGIN
- AktZeile := 40;
- PutImage (280, AktZeile + 10, Space2^, NormalPut);
- END
- ELSE AktZeile := 50;
-
- PutImage (280, AktZeile, Space2^, NormalPut);
- REPEAT (* Eingabe der Spalte *)
- HolZeichen (Zug1); Zug1 := UpCase (Zug1);
- OK := Zug1 IN ['A'..'H', ^Q];
- UNTIL OK;
- IF Zug1 = ^Q THEN BEGIN Korrekt := TRUE; EXIT; END;
- OutTextXY (280, AktZeile, Zug1);
-
- REPEAT (* Eingabe der Zeile *)
- HolZeichen (Zug2);
- OK := Zug2 IN ['1'..'8'];
- UNTIL OK;
-
- OutTextXY (287, AktZeile, Zug2);
- Kontrolle;
- END;
- (*-----------------------------------------------*)
- PROCEDURE Spielen;
- (* Abbruch mit CTRL-Q *)
- BEGIN
- REPEAT
- REPEAT
- ZugEingabe (1, 1, Von1, Von2); (* Start-Feld *)
- IF Von1 <> ^Q THEN
- ZugEingabe (2, 0, Nach1, Nach2); (* Ziel-Feld *)
- IF NOT Korrekt THEN Beep (400, 200);
- IF (Von1 = ^Q) OR (Nach1 = ^Q) THEN EXIT;
- UNTIL (Korrekt);
- ZeigSteine;
- UNTIL Verwandelt = SUCC (Max);
- END;
- (*-----------------------------------------------*)
- BEGIN
- REPEAT
- INTRO;
- Initialisierung;
- ZeigSteine;
- EingabeFeld;
-
- Spielen;
-
- UNTIL NOT Wirklich ('Noch ein Spiel ? <J> / <N> : ');
- GraphikEnde;
- END.