home *** CD-ROM | disk | FTP | other *** search
- PROGRAM INVERSO;
-
- (* System: MS-DOS Sprache: Turbo Pascal 3.0 *)
- (* (C) Gerd Kraus & PASCAL International *)
-
- CONST Max = 63; (* 8 * 8 - Spielfeld *)
- Stein_1 = '#'; (* normaler Stein *)
- Stein_2 = ' '; (* verwandelter Stein *)
-
- VAR Feld : ARRAY [0..Max] OF 0..1;
- Von1, Von2,
- Nach1, Nach2 : CHAR;
- Korrekt : BOOLEAN;
- Anzahl,
- Verwandelt : INTEGER;
-
- (*------------------------------------------------*)
- (* die mittleren 16 Felder sind bereits umgewan- *)
- (* delt, mit der RANDOM-Function kann man eine *)
- (* zufaellige Startkonstellation ausgeben lassen *)
-
- PROCEDURE Initialisierung;
-
- VAR I, J : INTEGER;
-
- BEGIN
- Anzahl := 1; Verwandelt := 16;
- (* normale Steine: *)
- FOR I := 0 TO Max DO Feld[I] := 1;
- I := 17; (* verwandelter Stein *)
- REPEAT
- FOR J := 1 TO 4 DO Feld [I+J] := 0;
- I := I + 8; (* Feld 18 - 21 usw. *)
- UNTIL I > 41;
- END;
-
- (*------------------------------------------------*)
- PROCEDURE INVERS; (* LOWVIDEO bei CPM *)
- BEGIN TextColor(0); TextBackGround(15) END;
-
- (*------------------------------------------------*)
- PROCEDURE NORMAL; (* NORMVIDEO bei CPM *)
- BEGIN TextColor(15); TextBackGround(0) END;
-
- (*------------------------------------------------*)
- PROCEDURE Stein_2_Setzen;
- BEGIN
- INVERS; Write (Stein_2); NORMAL
- END;
-
- (*------------------------------------------------*)
- PROCEDURE ZeigSteine;
-
- VAR Zeile, Spalte, X, Y : INTEGER;
-
- BEGIN
- X := 15; Y := 4;
- FOR Zeile := 0 TO 7 DO BEGIN
- FOR Spalte := 0 TO 7 DO BEGIN
- GotoXY (X - 2 + 4 * Spalte, Y+1);
- IF Feld [Zeile * 8 + Spalte] = 1 THEN
- Write (Stein_1)
- ELSE
- Stein_2_Setzen;
- END;
- Y := Y + 2;
- END;
- NORMAL;
- GotoXY (5,22);
- Write(' Anzahl der Zuege : ',Anzahl-1:5,' ');
- GotoXY (5,23);
- Write(' Umgewandelte Steine : ',Verwandelt:5,' ');
- Anzahl := Succ(Anzahl);
- Verwandelt := Succ(Verwandelt);
- NORMAL
- END;
-
- (*------------------------------------------------*)
- PROCEDURE INTRO;
-
- BEGIN
- ClrScr; GotoXY (36,1);
- INVERS; Write (' INVERSO '); NORMAL;
- GotoXY (3,5);
- Write ('Ihre Aufgabe bei diesem Spiel ist es,');
- Write (' auf einem Brett mit 64 Feldern alle');
- GotoXY (3,6);
- Write ('durch "', Stein_1, '" angezeigten ',
- 'Steine in "');
- Stein_2_Setzen;
- Write ('" Spielsteine zu verwandeln.');
- GotoXY (26,9);
- Write ('Dabei gelten folgende REGELN :');
- NORMAL; GotoXY (3,11);
- Write
- ('1 - Es darf nur diagonal gesprungen werden.');
- GotoXY (3,12);
- Write
- ('2 - Es darf nur mit "', Stein_1,'" ueber "');
- Write (Stein_1, '" 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);
- Write ('", die 2 Felder mit "', Stein_1,
- '" werden zu "');
- Stein_2_Setzen; Write ('". <<<');
- GotoXY (30,23); INVERS;
- Write (' Weiter mit Tastendruck ');
- NormVideo;
- REPEAT UNTIL KeyPressed;
- ClrScr; GotoXY (36,1);
- INVERS; Write (' INVERSO '); NORMAL;
-
- END;
-
- (*------------------------------------------------*)
- PROCEDURE SpielBrett;
- (* Linien fuer den erweiterten IBM-Zeichensatz: *)
- CONST E1 = #218; (* OBEN LINKS *)
- E2 = #191; (* OBEN RECHTS *)
- E3 = #192; (* UNTEN LINKS *)
- E4 = #217; (* UNTEN RECHTS *)
- VE = #179; (* VERTIKALE LINIE *)
- HO = #196; (* HORIZONTALE LINIE *)
- KR = #197; (* KREUZUNG *)
- ZL = #180; (* ZEIGER NACH LINKS *)
- ZR = #195; (* ZEIGER NACH RECHTS *)
- ZO = #193; (* ZEIGER NACH OBEN *)
- ZU = #194; (* ZEIGER NACH UNTEN *)
- Leer = #32#32#32;
-
- VAR I, J, K,
- X, Y : INTEGER;
-
- PROCEDURE ZEILE2;
-
- BEGIN
- Y := Succ(Y);
- GotoXY (X-2, Y); Write(K);
- GotoXY (X, Y);
- FOR J := 1 TO 8 DO Write (VE,Leer);
- Write (VE)
- END;
-
- PROCEDURE ZEILE3;
-
- BEGIN
- Y := Succ(Y);
- GotoXY (X, Y); Write (ZR);
- FOR I := 1 TO 7 DO BEGIN
- FOR J := 1 TO 3 DO Write (HO);
- Write (KR);
- END;
- Write (HO,HO,HO,ZL)
- END;
-
- BEGIN (* SpielBrett *)
- X := 10; Y := 3;
- FOR I := 1 TO 8 DO BEGIN
- GotoXY (X-1+4*I, Y); Write (Chr(64+I));
- END;
- X := Succ (X); Y := Succ (Y);
- GotoXY (X, Y); Write (E1);
- FOR I := 1 TO 7 DO Write (HO,HO,HO,ZU);
- Write (HO,HO,HO,E2);
- FOR K := 1 TO 7 DO BEGIN ZEILE2; ZEILE3; END;
- K := Succ(K); ZEILE2;
- Y := Succ (Y);
- GotoXY (X, Y); Write (E3);
- FOR I := 1 TO 7 DO Write (HO,HO,HO,ZO);
- Write (HO,HO,HO,E4);
- GotoXY (52,14); Write ('Eingabebeispiel : A1');
- GotoXY (52,16); Write ('Ende mit "^Q"')
- END;
-
- (*------------------------------------------------*)
- PROCEDURE EingabeFeld;
-
- BEGIN
- GotoXY (53,5); Write ('Zugeingabe :');
- INVERS;
- GotoXY (50,7); Write (' ':14);
- GotoXY (50,8); Write (' von Feld : ');
- GotoXY (50,9); Write (' ':14);
- GotoXY (50,10); Write (' nach Feld : ');
- GotoXY (50,11); Write (' ':14);
- NORMAL
- END;
-
- (*------------------------------------------------*)
- PROCEDURE ZugEingabe (Wo: BYTE; Zulaessig: BYTE;
- VAR Zug1, Zug2 : CHAR);
-
- VAR PositionNeu, PNZeile, PNSpalte,
- PositionAlt, PAZeile, PASpalte : INTEGER;
- OK : BOOLEAN;
-
- PROCEDURE Kontrolle;
- (* ueberprueft den eingegebenen Zug und wandelt *)
- (* die Steine um *)
-
- BEGIN
- PositionNeu := (Ord(Zug2) - 49) * 8
- + (Ord(Zug1) - 65);
- PNZeile := PositionNeu DIV 8;
- PNSpalte := PositionNeu 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 Write (Chr(7)); (* Piepser *)
- END
- ELSE BEGIN
- PositionAlt := PositionNeu;
- PAZeile := PNZeile;
- PASpalte := PNSpalte;
- END
- END;
-
- BEGIN
- Korrekt := FALSE;
- IF Wo = 8 THEN GotoXY (65, Wo + 2);
- ClrEol; (* Bis Zeilenende löschen *)
- GotoXY(65, Wo); ClrEol;
- REPEAT (* Eingabe der Spalte *)
- Read (Kbd,Zug1);
- Zug1 := UpCase(Zug1);
- OK := Zug1 IN ['A'..'H'];
- OK := OK OR (Ord(Zug1) = 17); (* Control-Q *)
- UNTIL OK;
- IF Ord(Zug1) = 17 THEN Halt; (* Programm-Ende *)
- Write (Zug1);
- REPEAT (* Eingabe der Zeile *)
- Read (Kbd,Zug2);
- OK := Zug2 IN ['1'..'8'];
- UNTIL OK;
- Write (Zug2);
- Kontrolle
- END;
-
- (*------------------------------------------------*)
- BEGIN
- INTRO;
- SpielBrett;
- Initialisierung;
- ZeigSteine;
- EingabeFeld;
- REPEAT
- REPEAT
- ZugEingabe(8,1,Von1,Von2); (* Start-Feld *)
- ZugEingabe(10,0,Nach1,Nach2); (* Ziel-Feld *)
- IF NOT Korrekt THEN Write (Chr(7));
- UNTIL Korrekt;
- ZeigSteine;
- UNTIL Verwandelt = Succ (Max)
- END.
-