home *** CD-ROM | disk | FTP | other *** search
- PROGRAM STRATEGO;
- (* System : MS-DOS Sprache : Turbo Pascal 4.0 *)
- (* V.1.0.a - 12.10.88 CGA-Version *)
-
- {$R-,S+,I+,D+,T-,F+,V+,B+,N-,L+ }
- {$M 16384,0,655360 }
-
- USES CRT, DOS, Graph, SpieleGraph, StratSp1, StratSp2, StratSp;
- (* in Spielegraph : GraphDir an die eigenen Verzeichnisse anpassen ! *)
- (* die StratSp*.*-Units enthalten die Sprites *)
-
- CONST Max = 36;
-
- StartX : INTEGER = 20;
- DeltaX : INTEGER = 26;
- Zeilen : INTEGER = 6;
- StartY : INTEGER = 30;
- DeltaY : INTEGER = 26;
- Spalten: INTEGER = 6;
-
- TYPE Brett = RECORD
- Besitzer : 0..2; (* 0 = leeres Feld *)
- Vorhanden : 0..4;
- Zulaessig : 0..4;
- END;
-
- VAR Feld : ARRAY [1..Max] OF Brett;
- Zeile, Spalte : CHAR;
- ZE, SP : INTEGER;
- Fertig : BOOLEAN;
- Space2 : POINTER;
- Runde, Spieler: 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 (1); OutTextXY (5, 1, Frage);
-
- REPEAT
- Ch := ReadKey
- UNTIL UpCase (Ch) IN ['J', 'N'];
- Wirklich := Ch IN ['J', 'j'];
- END;
- (*-----------------------------------------------*)
- PROCEDURE Initialisierung;
-
- VAR Pos : INTEGER;
-
- BEGIN
- FILLCHAR (Feld, SIZEOF (Feld),#0);
- FOR Pos := 1 TO Max DO
- WITH Feld [Pos] DO
- CASE Pos OF
- 1, 6, 31, 36 : Zulaessig := 2; (* Eckfelder *)
- 2..5, 7, 12,
- 13,18,19,24,
- 25,30,32..35 : Zulaessig := 3 (* Randfelder *)
- ELSE Zulaessig := 4; (* Innenfelder *)
- END;
- Runde := 1; Spieler := 2;
-
- GraphikInit (CGA, CGAC2);
- SetTextStyle (SmallFont, HorizDir, 4);
- SetColor (1);
- Bar (StartX, StartY, StartX + Spalten * DeltaX, StartY + Zeilen * DeltaY);
- SetColor (2);
- MachRaster (StartX, Spalten, DeltaX, StartY, Zeilen, DeltaY, TRUE);
- SetColor (3); OutTextXY (130, 1, 'S T R A T E G O');
- SetFillStyle (1, 1);
- BAR (180, 24, 315, 64);
- GetMem (Space2, ImageSize (0, 0, 20, 10));
- GetImage (280, 40, 300, 50, Space2^);
- SetColor (2);
- OutTextXY (240, 10, 'Runde ' + Int2Str (Runde, 3));
- SetColor (2);
- OutTextXY (200, 150, Int2Str (0, 2) + ' Feld(er)');
- SetColor (1);
- OutTextXY (200, 165, Int2Str (0, 2) + ' Feld(er)');
- END;
- (*-----------------------------------------------*)
- PROCEDURE Steine_Im_Feld (Pos : INTEGER);
-
- VAR XFeld, YFeld, DX, DY : INTEGER;
- (*----------*)
- PROCEDURE SetzeStein;
-
- BEGIN
- CASE Spieler OF
- 1 : PutImage (XFeld + DX, YFeld + DY, Sprite1^, NormalPut);
- 2 : PutImage (XFeld + DX, YFeld + DY, Sprite2^, NormalPut);
- END;
- END;
- (*----------*)
- PROCEDURE Leer;
- BEGIN
- PutImage (XFeld + 0, YFeld + 0, Sprite3^, NormalPut);
- PutImage (XFeld + 10, YFeld + 0, Sprite3^, NormalPut);
- PutImage (XFeld + 0, YFeld + 10, Sprite3^, NormalPut);
- PutImage (XFeld + 10, YFeld + 10, Sprite3^, NormalPut);
- END;
- (*----------*)
- PROCEDURE EinStein;
- BEGIN
- DX := 0; DY := 0; SetzeStein;
- END;
- (*----------*)
- PROCEDURE ZweiSteine;
- BEGIN
- EinStein;
- DX := 10; DY := 0; SetzeStein;
- END;
- (*----------*)
- PROCEDURE DreiSteine;
- BEGIN
- ZweiSteine;
- DX := 0; DY := 10; SetzeStein;
- END;
- (*----------*)
- PROCEDURE VierSteine;
- BEGIN
- DreiSteine;
- DX := 10; DY := 10; SetzeStein;
- END;
- (*----------*)
- BEGIN (* Steine_Im_Feld *)
-
- XFeld := StartX + 5 + 26 * (SP - 1);
- YFeld := StartY + 5 + 26 * (ZE - 1);
-
- CASE Feld [Pos].Vorhanden OF
- 1 : EinStein;
- 2 : ZweiSteine;
- 3 : DreiSteine;
- 4 : VierSteine;
- ELSE Leer;
- END;
- END;
- (*-----------------------------------------------*)
- PROCEDURE Explosion (Ort : INTEGER);
-
- VAR FeldNummer : INTEGER;
- (*----------*)
- PROCEDURE Wo;
-
- BEGIN
- ZE := (FeldNummer - 1) DIV 6 + 1;
- SP := FeldNummer - 6 * (ZE - 1);
- END;
- (*----------*)
- PROCEDURE Deckung;
-
- BEGIN
- Beep (800, 50);
- WITH Feld[FeldNummer] DO BEGIN
- Vorhanden := SUCC (Vorhanden);
- Besitzer := Spieler;
- END;
- Wo;
- Steine_Im_Feld (FeldNummer);
- Beep (800, 50);
- END;
- (*----------*)
- BEGIN (* Explosion *)
- Feld [Ort].Vorhanden := 0;
- FeldNummer := Ort; Wo;
- Steine_Im_Feld (FeldNummer);
- IF Ort - 6 > 0 THEN BEGIN FeldNummer := Ort - 6; Deckung; END;
- IF Ort + 6 <= 36 THEN BEGIN FeldNummer := Ort + 6; Deckung; END;
- IF SP - 1 > 0 THEN BEGIN FeldNummer := Ort - 1; Deckung; END;
- IF SP + 1 < 6 THEN BEGIN FeldNummer := Ort + 1; Deckung; END;
- END;
- (*-----------------------------------------------*)
- PROCEDURE Probe;
- VAR Stelle : 1..36;
- Explodiert : BOOLEAN;
- FelderVonEins,
- FelderVonZwei : INTEGER;
-
- BEGIN
- REPEAT
- FelderVonEins := 0; FelderVonZwei := 0;
- Explodiert := FALSE;
- FOR Stelle := 1 TO Max DO
- BEGIN
- IF Feld [Stelle].Vorhanden >= Feld [Stelle].Zulaessig THEN
- BEGIN
- Explosion (Stelle);
- Explodiert := TRUE;
- END;
- IF Feld [Stelle].Besitzer = 1 THEN FelderVonEins := SUCC(FelderVonEins);
- IF Feld [Stelle].Besitzer = 2 THEN FelderVonZwei := SUCC(FelderVonZwei);
- END; (* FOR Stelle := 1 TO Max *)
- UNTIL (NOT Explodiert) OR (FelderVonEins = 0) OR (FelderVonZwei = 0);
- END;
- (*-----------------------------------------------*)
- PROCEDURE SpielStand;
-
- VAR FelderVonEins, FelderVonZwei, Kasten : INTEGER;
-
- BEGIN
- FelderVonEins := 0; FelderVonZwei := 0; Fertig := FALSE;
- FOR Kasten := 1 TO Max DO
- BEGIN
- IF Feld [Kasten].Besitzer = 1 THEN FelderVonEins := SUCC(FelderVonEins);
- IF Feld [Kasten].Besitzer = 2 THEN FelderVonZwei := SUCC(FelderVonZwei);
- END;
-
-
- FOR Kasten := 0 TO 1 DO PutImage (200 + Kasten * 8, 151, Space^, NormalPut);
- FOR Kasten := 0 TO 1 DO PutImage (200 + Kasten * 8, 166, Space^, NormalPut);
- SetColor (2);
- OutTextXY (200, 150, Int2Str (FelderVonEins,2));
- SetColor (1);
- OutTextXY (200, 165, Int2Str (FelderVonZwei,2));
-
- IF Runde > 1 THEN
- BEGIN
- IF (FelderVonEins =0) OR (FelderVonZwei = 0) THEN
- BEGIN
- SetColor (3);
- OutTextXY (10, 190, 'SIEGER : Spieler ' + Int2Str (Spieler, 1)
- + ' in Runde' + Int2Str (Runde, 3));
- REPEAT UNTIL KEYPRESSED;
- Fertig := TRUE;
- END;
- END;
-
- IF Spieler = 2 THEN Runde := SUCC(Runde);
-
- SetColor (2);
- FOR Kasten := 0 TO 2 DO PutImage (276 + Kasten * 8, 11, Space^, NormalPut);
- OutTextXY (276, 10, Int2Str (Runde, 3));
-
- END;
- (*-----------------------------------------------*)
- PROCEDURE SpielBeschreibung;
-
- CONST Zeile : INTEGER = 5;
- (*----------*)
- BEGIN
- TextMode (Co80);
- CLRSCR; GOTOXY (36,1); INVERS; WRITE (' STRATEGO '); NORMAL;
- GOTOXY (2, Zeile);
- WRITE ('Die Aufgabe bei diesem Spiel ist es, auf einem Brett mit 36');
- WRITE (' Feldern alle');
- GOTOXY (2, Zeile+1);
- WRITE ('Steine des Gegners zu zerstören.');
- GOTOXY (26, Zeile+4);
- TextBackground (0); TextColor (9);
- WRITE ('Dabei gelten folgende REGELN :');
- NORMAL;
- GOTOXY (2, Zeile+6);
- WRITE ('1 - Die Steine werden abwechselnd gesetzt.');
- GOTOXY (2, Zeile+7);
- WRITE ('2 - Jedes Feld hat abhängig von seiner Lage eine bestimmte');
- WRITE (' maximale Kapazität');
- INVERS;
- GOTOXY (24, Zeile+8); WRITE (' ':32);
- GOTOXY (24, Zeile+9);
- WRITE (' >>> Eckfelder : 2 Steine <<< ');
- GOTOXY (24, Zeile+10);
- WRITE (' >>> Randfelder : 3 Steine <<< ');
- GOTOXY (24, Zeile+11);
- WRITE (' >>> Innenfelder : 4 Steine <<< ');
- GOTOXY (24, Zeile+12); WRITE (' ':32);
- NORMAL;
- GOTOXY (2, Zeile+13);
- WRITE ('3 - Erreicht ein Feld seine maximale Kapazität, so werden die');
- WRITE (' Steine explo-');
- GOTOXY (6, Zeile+14);
- WRITE ('sionsartig auf die Nachbarfelder geschleudert.');
- GOTOXY (2, Zeile+15);
- WRITE ('4 - Auf ein irgendwann vom Gegner besetztes Feld darf nicht');
- WRITE (' gesetzt werden.');
- GOTOXY (31, 22); WRITE ('Spielabbruch mit CTRL-Q');
- GOTOXY (31,24); INVERS; WRITE (' Weiter mit Tastendruck '); NORMAL;
- REPEAT UNTIL KEYPRESSED;
- END;
- (*-----------------------------------------------*)
- PROCEDURE WerIstDran;
-
- BEGIN
- IF Spieler = 1 THEN Spieler := 2 ELSE Spieler := 1;
- PutImage (280, 32, Space2^, NormalPut);
- SetColor (0);
- OutTextXY (185, 32, 'Zugeingabe Spieler' + Int2Str (Spieler, 2) + ' :');
- OutTextXY (200, 48, 'auf Feld : ');
- END;
- (*-----------------------------------------------*)
- PROCEDURE ZugEingabe;
-
- VAR Korrekt, OK : BOOLEAN;
-
- PROCEDURE Fehler;
-
- BEGIN
- Beep (300, 50);
- SetColor (3);
- OutTextXY (100, 187, ' Nicht zulaessig ! ');
- Beep (800, 50);
- DELAY (1000);
- SetColor (0);
- OutTextXY (100, 187, ' Nicht zulaessig ! ');
- END;
- (*----------*)
- PROCEDURE Kontrolle;
-
- VAR Pos : 1..36;
-
- BEGIN
- ZE := (ORD (Zeile)-48); SP := (ORD (Spalte)-64);
- Pos := (ZE - 1) * 6 + SP;
- IF (Feld [Pos].Besitzer = Spieler) OR (Feld [Pos].Besitzer = 0) THEN
- WITH Feld [Pos] DO BEGIN
- Besitzer := Spieler;
- Vorhanden := SUCC (Vorhanden);
- Korrekt := TRUE;
- Steine_Im_Feld (Pos);
- END
- ELSE Fehler;
- END;
- (*----------*)
- BEGIN (* ZugEingabe *)
-
- Korrekt := FALSE;
-
- REPEAT
- PutImage (280, 48, Space2^, NormalPut);
- PutImage (287, 48, Space2^, NormalPut);
-
- REPEAT
- HolZeichen (Spalte); Spalte := UpCase (Spalte);
- OK := Spalte IN ['A'..'F', ^Q];
- UNTIL OK;
-
- IF Spalte = ^Q THEN BEGIN Fertig := TRUE; EXIT; END;
- OutTextXY (280, 48, Spalte);
-
- REPEAT
- HolZeichen (Zeile);
- OK := Zeile IN ['1'..'6'];
- UNTIL OK;
-
- OutTextXY (287, 48, Zeile);
-
- Kontrolle;
- UNTIL Korrekt;
- END;
- (*-----------------------------------------------*)
- (* Spielabbruch mit CTRL-Q *)
- BEGIN
- REPEAT
- Fertig := FALSE;
- SpielBeschreibung;
- Initialisierung;
- REPEAT
- WerIstDran;
- ZugEingabe;
- IF NOT Fertig THEN BEGIN Probe; SpielStand; END;
- UNTIL Fertig;
- UNTIL NOT Wirklich ('Noch ein Spiel ? <J> / <N> : ');
- GraphikEnde;
- END.