home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* HASE&JÄG.PAS *)
- (* Ein Strategie-Experiment in Turbo Pascal *)
- (* (c) 1991 Wolfgang Bartsch & TOOLBOX *)
- (* ------------------------------------------------------ *)
-
- PROGRAM Hase_und_Jaeger;
- USES Crt;
-
- TYPE An_der_Reihe = (Mensch, Computer);
- Position = RECORD Zeile, Spalte : BYTE END;
-
- CONST Wartezeit = 500;
-
- VAR Feld : ARRAY[0..9, 0..9] OF BYTE;
- Jaeger : ARRAY[1..4] OF Position;
- ZugListe : ARRAY[1..8] OF Position;
- T : Position;
- K, Anzahl, ZeilenMax, ZeilenMin,
- JNR, JZ, JS, NR, HZ, HS,
- Staerke, Ze, Sp : BYTE;
- Spieler : An_der_Reihe;
- OK, Computer_verliert, Mensch_verliert : BOOLEAN;
- Taste : CHAR;
-
- PROCEDURE Init;
- VAR Z, S : BYTE;
- BEGIN
- FOR Z := 0 TO 9 DO
- FOR S := 0 TO 9 DO Feld[Z, S] := 0; { verbotene Felder }
- FOR Z := 1 TO 8 DO
- FOR S := 1 TO 8 DO BEGIN
- IF Odd(Z) AND Odd(S) THEN Feld[Z, S] := 1;
- IF NOT Odd(Z) AND NOT Odd(S) THEN Feld[Z, S] := 1;
- { erlaubte Felder }
- IF (Z = 8) AND NOT Odd(S) THEN Feld[Z, S] := 2;
- { Jäger }
- END;
- FOR Z:=1 TO 4 DO BEGIN
- Jaeger[Z].Zeile := 8;
- Jaeger[Z].Spalte := 2 * Z
- END;
- HZ := 1;
- HS := 5;
- Feld[HZ, HS] := 8 { Hase }
- END;
-
- PROCEDURE Spielfeld;
- VAR Sp, Ze, K, Z, S : INTEGER;
- BEGIN
- ClrScr; TextColor(LightMagenta); GotoXY(20, 3);
- Write('H a s e und J ä g e r');
- TextColor(Yellow); Sp := 7; Ze := 6; GotoXY(Sp, Ze);
- Write(' 1 2 3 4 5 6 7 8');
- GotoXY(Sp, Ze + 1);
- Write(' ┌───┬───┬───┬───┬───┬───┬───┬───┐');
- FOR K := 1 TO 7 DO BEGIN
- GotoXY(Sp, Ze + 2 * K);
- Write(K, ' │ │ │ │ │ │ │ │ │', K:2);
- GotoXY(Sp, Ze + 1 + 2 * K);
- Write(' ├───┼───┼───┼───┼───┼───┼───┼───┤')
- END;
- GotoXY(Sp, Ze + 16);
- Write('8 │ │ │ │ │ │ │ │ │ 8');
- GotoXY(Sp, Ze + 17);
- Write(' └───┴───┴───┴───┴───┴───┴───┴───┘');
- GotoXY(Sp, Ze + 18);
- Write(' 1 2 3 4 5 6 7 8');
- FOR Z := 1 TO 8 DO
- FOR S := 1 TO 8 DO BEGIN
- GotoXY(Sp + 3 + (S - 1) * 4, Ze + 2 * Z);
- IF Feld[Z, S] = 0 THEN BEGIN
- TextColor(Yellow);
- Write('▓▓▓');
- END;
- IF Feld[Z, S] = 2 THEN BEGIN
- Write(' ');
- TextColor(LightRed);
- Write('O');
- END;
- IF Feld[Z, S] = 8 THEN BEGIN
- Write(' ');
- TextColor(LightGreen);
- Write('X')
- END;
- END;
- END;
-
- PROCEDURE Eingabe(VAR I, J : BYTE);
- VAR Sp, Ze : INTEGER;
- Taste : CHAR;
- BEGIN
- Sp := 50; Ze := 9; TextColor(White);
- GotoXY(Sp, Ze); Write('Deine Eingabe');
- GotoXY(Sp + 2, Ze + 2); Write('( │ )');
- GotoXY(Sp + 4, Ze + 2);
- REPEAT Taste := ReadKey UNTIL Taste IN['1'..'8'];
- Write(Taste); I := Ord(Taste) - Ord('0');
- GotoXY(Sp + 8, Ze + 2);
- REPEAT Taste := ReadKey UNTIL Taste IN['1'..'8'];
- Write(Taste); J := Ord(Taste) - Ord('0');
- END;
-
- PROCEDURE Fehler;
- VAR K : INTEGER;
- BEGIN
- FOR K := 1 TO 2 DO BEGIN
- GotoXY(50, 13); TextColor(LightMagenta + Blink);
- Write('Fehlerhafte Eingabe !'); Delay(Wartezeit);
- GotoXY(50, 13); TextColor(LightCyan + Blink);
- Write('Bitte wiederholen ! '); Delay(Wartezeit);
- END;
- GotoXY(50, 13); ClrEoL
- END;
-
- FUNCTION Hase_eingemauert : BOOLEAN;
- BEGIN
- Hase_eingemauert := (Feld[HZ - 1, HS - 1] <> 1) AND
- (Feld[HZ - 1, HS + 1] <> 1) AND
- (Feld[HZ + 1, HS + 1] <> 1) AND
- (Feld[HZ + 1, HS - 1] <> 1)
- END;
-
- PROCEDURE Zugliste_erstellen(VAR N : BYTE; Stark : BOOLEAN);
- VAR Z, K, Spalte_links, Spalte_rechts : BYTE;
- BEGIN
- ZeilenMax := 0; ZeilenMin := 9; N := 0;
- FOR K := 1 TO 4 DO BEGIN
- Z := Jaeger[K].Zeile - 1;
- IF Z + 1 > ZeilenMax THEN ZeilenMax := Z + 1;
- IF Z + 1 < ZeilenMin THEN ZeilenMin := Z + 1;
- ZugListe[2 * K - 1].Zeile := Z;
- ZugListe[2 * K].Zeile := Z;
- Spalte_links := Jaeger[K].Spalte - 1;
- Spalte_rechts := Jaeger[K].Spalte + 1;
- IF ((Feld[Z, Spalte_links] = 8) OR
- (Feld[Z, Spalte_rechts] = 8)) AND Stark THEN BEGIN
- ZugListe[2 * K - 1].Spalte := 0;
- ZugListe[2 * K].Spalte := 0;
- END
- { diagonal stehender Jäger bleibt stehen }
- ELSE
- IF ((HS=Jaeger[K].Spalte)
- AND (Jaeger[K].Zeile - HZ = 2))
- AND Stark THEN BEGIN
- ZugListe[2 * K - 1].Spalte := 0;
- ZugListe[2 * K].Spalte := 0;
- END { gegenüberstehender Jäger bleibt stehen }
- ELSE BEGIN
- IF Feld[Z,Spalte_links] = 1 THEN BEGIN
- Inc(N);
- ZugListe[2 * K - 1].Spalte := Spalte_links;
- END ELSE
- ZugListe[2 * K - 1].Spalte := 0;
- IF Feld[Z, Spalte_rechts] = 1 THEN BEGIN
- Inc(N);
- ZugListe[2 * K].Spalte := Spalte_rechts;
- END
- ELSE
- ZugListe[2*K].Spalte:=0
- END
- END
- END;
-
- PROCEDURE StrategieZug(VAR N : BYTE);
- VAR K, L, M : LONGINT;
- BEGIN
- L := 0; M := ZeilenMax;
- FOR K := 1 TO 4 DO
- L := 100 * L + 10 * Jaeger[K].Zeile + Jaeger[K].Spalte;
- L := L - (M - 4) * 10101010;
- N := 0; { falls kein Strategiezug möglich ist }
- IF L = 42444648 THEN
- IF Feld[M - 1, 7] = 8 THEN N := 2 ELSE N := 7;
- IF L = 42444637 THEN
- IF Feld[M - 1, 5] = 8 THEN N := 2 ELSE N := 5;
- IF L = 42443537 THEN
- IF Feld[M - 1, 3] = 8 THEN N := 7 ELSE N := 3;
- IF L = 42333537 THEN N := 1;
- IF L = 42332426 THEN N := 3;
- IF L = 42442426 THEN N := 3;
- IF L = 41434547 THEN
- IF Feld[M - 1, 2] = 8 THEN N := 7 ELSE N := 2;
- IF L = 32434547 THEN
- IF Feld[M - 1, 4] = 8 THEN N := 7 ELSE N := 4;
- IF L = 32344547 THEN
- IF Feld[M - 1, 6] = 8 THEN N := 2 ELSE N := 6;
- IF L = 32343647 THEN
- IF Feld[M - 1, 8] = 8 THEN N := 6 ELSE N := 8;
- IF L = 42443526 THEN
- IF Feld[M - 1, 3] = 8 THEN N := 7 ELSE N := 3;
- IF L = 42333526 THEN
- IF Feld[M - 3, 5] = 8 THEN N := 4
- ELSE IF Feld[M - 1, 1] = 8 THEN N := 3 ELSE N := 1;
- IF L = 41434536 THEN
- IF Feld[M - 2, 2] = 8 THEN N := 5 ELSE N := 2;
- IF L = 23254547 THEN N := 6;
- IF L = 23253647 THEN
- IF Feld[M - 1, 8] = 8 THEN N := 6 ELSE N := 8;
- IF L = 23344547 THEN
- IF Feld[M - 1, 6] = 8 THEN N := 4 ELSE N := 6;
- IF L = 23343647 THEN
- IF Feld[M - 3, 4] = 8 THEN N := 5
- ELSE IF Feld[M - 1, 8] = 8 THEN N := 6 ELSE N := 8;
- IF L = 33444637 THEN
- IF Feld[M - 1, 5] = 8 THEN N := 2 ELSE N := 5;
- IF L = 33443537 THEN
- IF Feld[M - 2, 4] = 8 THEN N := 7 ELSE N := 1;
- IF L = 22443537 THEN N := 3;
- IF L = 42243526 THEN
- IF Feld[M - 4, 4] = 8 THEN N := 2 ELSE N := 8;
- IF L = 42243517 THEN N := 6;
- IF L = 41433436 THEN
- IF Feld[M - 1, 2] = 8 THEN N := 7 ELSE N := 2;
- IF L = 32433436 THEN
- IF Feld[M - 2, 5] = 8 THEN N := 2 ELSE N := 6;
- IF L = 33444648 THEN
- IF Feld[M - 1, 7] = 8 THEN N := 4 ELSE N := 7;
- IF L = 24444637 THEN N := 5;
- IF L = 33443526 THEN
- IF Feld[M - 3, 3] = 8 THEN N := 1
- ELSE IF Feld[M - 2, 4] = 7 THEN N := 6 ELSE N := 2;
- IF L = 22443526 THEN N := 3;
- IF L = 24443526 THEN
- IF Feld[M - 4, 6] = 8 THEN N := 6 ELSE N := 3;
- IF L = 24443517 THEN N := 6;
- IF L = 24442617 THEN N := 3;
- IF L = 32434536 THEN
- IF Feld[M - 1, 4] = 8 THEN N := 2 ELSE N := 4;
- IF L = 23434536 THEN N := 4;
- IF L = 32432536 THEN N := 4;
- IF L = 33354648 THEN
- IF Feld[M - 1, 7] = 8 THEN N := 2 ELSE N := 7;
- IF L = 24443537 THEN N := 3;
- IF L = 43344547 THEN N := 1;
- IF L = 42443546 THEN N := 8;
- IF L = 33354637 THEN
- IF Feld[M - 2, 4] = 8 THEN N := 7 ELSE N := 3;
- IF L = 43344536 THEN N := 1;
- IF L = 42242617 THEN N := 2;
- IF L = 43343627 THEN N := 1;
- IF L = 23342547 THEN
- IF Feld[M - 4, 3] = 8 THEN N := 1 ELSE N := 7;
- IF L = 33244637 THEN N := 5;
- IF L = 32344536 THEN
- IF Feld[M - 2, 5] = 8 THEN N := 2 ELSE N := 8;
- IF L = 32344527 THEN N := 6;
- IF L = 12342547 THEN N := 3;
- IF L = 23344536 THEN
- IF Feld[M - 3, 6] = 8 THEN N := 8
- ELSE IF Feld[M - 2, 5] = 8 THEN N := 2 ELSE N := 7;
- IF L = 23344527 THEN N := 6;
- IF L = 12232547 THEN N := 7;
- IF L = 12342545 THEN N := 3;
- IF L = 23342545 THEN
- IF Feld[M - 3, 6] = 8 THEN N := 8
- ELSE IF Feld[M - 4, 3] = 8 THEN N := 1 ELSE N := 2;
- IF L = 12232545 THEN N := 8;
- IF L = 33443546 THEN N := 8;
- IF L = 22333546 THEN N := 8;
- END;
-
- FUNCTION Frei(N : BYTE) : BOOLEAN;
- VAR K : BYTE;
- BEGIN
- Frei := TRUE;
- FOR K := 1 TO 4 DO
- IF (K <> (N + 1) DIV 2) AND (ZugListe[N].Spalte > 0) THEN
- IF ZugListe[N].Spalte = Jaeger[K].Spalte THEN
- Frei := FALSE
- END;
-
- PROCEDURE Zufall(VAR N : BYTE);
- VAR V : BYTE;
- BEGIN
- V := 0;
- REPEAT
- N := Random(8) + 1; Inc(V)
- UNTIL (V = 200) OR ((ZugListe[N].Spalte > 0) AND
- (ZeilenMax - ZugListe[N].Zeile < 3) AND Frei(N));
- IF V = 200 THEN
- REPEAT
- N := Random(8) + 1
- UNTIL ZugListe[N].Spalte > 0;
- END;
-
- PROCEDURE ZufallsZug(VAR N : BYTE);
- VAR Zug, K : BYTE;
- Min, Entfernung : INTEGER;
- Zuege : ARRAY[1..4] OF BYTE;
- BEGIN
- Zug := 0;
- FOR K := 1 TO 8 DO BEGIN
- IF (ZugListe[K].Spalte > 0) AND
- (ZeilenMax - ZugListe[K].Zeile < 3) THEN BEGIN
- { Feld besetzen, das vom Hasen aus erreicht werden kann }
- IF ((HZ - 1 = ZugListe[K].Zeile) AND
- (HS - 1 = ZugListe[K].Spalte)) OR
- ((HZ - 1 = ZugListe[K].Zeile) AND
- (HS + 1 = ZugListe[K].Spalte)) OR
- ((HZ + 1 = ZugListe[K].Zeile) AND
- (HS + 1 = ZugListe[K].Spalte)) OR
- ((HZ + 1 = ZugListe[K].Zeile) AND
- (HS - 1 = ZugListe[K].Spalte)) THEN BEGIN
- Inc(Zug);
- Zuege[Zug] := K;
- END;
- END;
- END;
- IF Zug > 0 THEN N := Zuege[Random(Zug) + 1]
- { mehrere Felder, die besetzt werden könnten }
- ELSE BEGIN
- Min := 200;
- { der Jäger mit der kleinsten Entfernung }
- { zum Hasen wird gesetzt }
- FOR K := 1 TO 8 DO
- IF ZugListe[K].Spalte > 0 THEN BEGIN
- Entfernung := Sqr(ZugListe[K].Zeile - HZ) +
- Sqr(ZugListe[K].Spalte - HS);
- IF (Entfernung < Min) AND
- (ZeilenMax - ZugListe[K].Zeile < 3) THEN BEGIN
- Min := Entfernung;
- N := K
- END;
- END;
- END;
- IF N = 0 THEN Zufall(N)
- END;
-
- BEGIN { Hauptprogramm }
- REPEAT
- TextBackground(Blue); TextColor(Yellow); Randomize;
- ClrScr; Init;
- GotoXY(10,5); Write('Welche Spielstärke (1/2/3/4/5)? ');
- REPEAT
- Taste:=ReadKey
- UNTIL Taste IN ['1'..'5'];
- Write(Taste);
- Staerke := Ord(Taste) - Ord('0');
- GotoXY(10, 7);
- Write('Willst du den ersten Zug setzen (J/N)? ');
- REPEAT
- Taste:=UpCase(ReadKey)
- UNTIL Taste IN ['J', 'N'];
- IF Taste = 'J' THEN Spieler := Mensch
- ELSE Spieler := Computer;
- Computer_verliert := FALSE;
- Mensch_verliert := FALSE;
- Spielfeld;
- GotoXY(50, 15);
- Write('Spielstärke ', Staerke); ZeilenMax := 8;
- ZeilenMin := 8; HZ := 1;
- REPEAT
- IF Spieler = Mensch THEN BEGIN
- REPEAT
- OK := FALSE; Eingabe(Ze, Sp);
- IF (Sqr(HZ - Ze) + Sqr(HS - Sp) = 2) AND
- (Feld[Ze, Sp] = 1) THEN OK := TRUE
- ELSE Fehler
- UNTIL OK;
- GotoXY(10 + (HS - 1) * 4, 6 + 2 * HZ);
- Write(' ');
- Feld[HZ, HS] := 1;
- HZ := Ze; HS := Sp;
- GotoXY(10 + (HS - 1) * 4, 6 + 2 * HZ); Write(' ');
- TextColor(LightGreen); Write('X');
- TextColor(Yellow); Feld[HZ, HS] := 8;
- Zugliste_erstellen(Anzahl, FALSE);
- IF (HZ >= ZeilenMax) OR (Anzahl = 0) THEN
- Computer_verliert := TRUE
- END ELSE BEGIN
- IF Random(100) < 20 * Staerke THEN BEGIN
- Zugliste_erstellen(Anzahl, FALSE);
- StrategieZug(NR);
- IF (NR = 0) OR (ZugListe[NR].Spalte = 0) THEN
- ZufallsZug(NR)
- END ELSE BEGIN
- IF ZeilenMin>HZ+1 THEN BEGIN
- Zugliste_erstellen(Anzahl, FALSE);
- StrategieZug(NR);
- IF (NR = 0) OR (ZugListe[NR].Spalte = 0) THEN
- ZufallsZug(NR)
- END ELSE BEGIN
- Zugliste_erstellen(Anzahl, TRUE);
- IF Anzahl = 0 THEN
- Zugliste_erstellen(Anzahl, FALSE);
- IF Staerke = 1 THEN Zufall(NR)
- ELSE ZufallsZug(NR)
- END;
- END;
- JNR := (NR + 1) DIV 2;
- JZ := Jaeger[JNR].Zeile;
- JS := Jaeger[JNR].Spalte;
- GotoXY(10 + (JS - 1) * 4, 6 + 2 * JZ);
- Write(' ');
- Feld[JZ, JS] := 1;
- JZ := ZugListe[NR].Zeile;
- JS := ZugListe[NR].Spalte;
- Jaeger[JNR].Zeile := JZ;
- Jaeger[JNR].Spalte := JS;
- GotoXY(10 + (JS - 1) * 4, 6 + 2 * JZ);
- Write(' ');
- TextColor(LightRed); Write('O');
- TextColor(Yellow); Feld[JZ, JS] := 2;
- TextColor(LightCyan); GotoXY(50, 18);
- Write('Computer setzt auf ( ', JZ, ' │ ', JS, ' )');
- TextColor(Yellow); Delay(Wartezeit);
- FOR K := 1 TO 3 DO
- IF (Jaeger[K].Spalte = Jaeger[K + 1].Spalte) AND
- (Jaeger[K].Zeile > Jaeger[K + 1].Zeile) THEN
- BEGIN
- T := Jaeger[K];
- Jaeger[K] := Jaeger[K + 1];
- Jaeger[K + 1] := T
- END;
- IF Hase_eingemauert THEN
- Mensch_verliert:=TRUE;
- Zugliste_erstellen(Anzahl, FALSE);
- IF (HZ >= ZeilenMax) OR (Anzahl = 0) THEN
- Computer_verliert := TRUE
- END;
- IF Spieler=Mensch THEN Spieler:=Computer
- ELSE Spieler:=Mensch
- UNTIL Computer_verliert OR Mensch_verliert;
- GotoXY(51, 22); TextColor(Yellow);
- IF Computer_verliert THEN BEGIN
- Write('Der Hase hat die Jägerkette');
- GotoXY(51,23); Write('durchbrochen!')
- END;
- IF Mensch_verliert THEN
- Write('Der Hase ist umzingelt!');
- GotoXY(5,25); Write('Drücke die <LEERTASTE>');
- REPEAT Taste:=ReadKey UNTIL Taste=' ';
- TextBackground(Black); TextColor(LightGray); ClrScr;
- GotoXY(30, 11); Write('Noch einmal (J/N): ');
- REPEAT Taste:=UpCase(ReadKey) UNTIL Taste IN['J','N']
- UNTIL Taste='N'
- END.
-
- (* ------------------------------------------------------ *)
- (* Ende von HASE&JÄG.PAS *)
-