home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* STRATEGO.PAS *)
- (* Version für Turbo Pascal 3.0 *)
- (* ------------------------------------------------------ *)
- PROGRAM STRATEGO;
-
- CONST Max = 36;
- Stein_1 = #111;
- Stein_2 = #223;
- Runde : INTEGER = 1;
- Spieler : INTEGER = 2;
-
- TYPE Brett = RECORD (* 0 = leeres Feld *)
- Besitzer : 0..2;
- Vorhanden : 0..4;
- Zulaessig : 0..4;
- END;
-
- VAR Feld : ARRAY [1..Max] OF Brett;
- Zeile, Spalte : CHAR;
- ZE, SP : INTEGER;
- Fertig : BOOLEAN;
- (* ------------------------------------------------------ *)
- 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;
- 2..5, 7, 12,
- 13,18,19,24,
- 25,30,32..35 : Zulaessig := 3
- ELSE Zulaessig := 4;
- END;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE INVERS; (* LOWVIDEO bei CP/M *)
- BEGIN TextColor(0); TextBackGround(15) END;
- (* ------------------------------------------------------ *)
- PROCEDURE NORMAL; (* NORMVIDEO bei CP/M *)
- BEGIN TextColor(15); TextBackGround(0) END;
- (* ------------------------------------------------------ *)
- PROCEDURE BELL; (* WRITE (^G) fuer CP/M *)
- BEGIN Sound (800); Delay (50); NoSound; END;
- (* ------------------------------------------------------ *)
- PROCEDURE Steine_Im_Feld (Pos : INTEGER);
- VAR XFeld, YFeld : INTEGER;
-
- PROCEDURE SetzeStein;
- BEGIN
- CASE Spieler OF
- 1 : WRITE (Stein_1);
- 2 : BEGIN INVERS; WRITE (Stein_2); NORMAL; END;
- END;
- END;
-
- PROCEDURE Leer;
- BEGIN
- GOTOXY (XFeld, YFeld); WRITE ('':3);
- GOTOXY (XFeld,SUCC(YFeld)); WRITE ('':3);
- END;
-
- PROCEDURE EinStein;
- BEGIN
- GOTOXY (XFeld, YFeld); SetzeStein;
- END;
-
- PROCEDURE ZweiSteine;
- BEGIN
- EinStein;
- GOTOXY (XFeld+2, YFeld); SetzeStein;
- END;
-
- PROCEDURE DreiSteine;
- BEGIN
- ZweiSteine;
- GOTOXY (XFeld, SUCC(YFeld)); SetzeStein;
- END;
-
- PROCEDURE VierSteine;
- BEGIN
- DreiSteine;
- GOTOXY (XFeld+2,SUCC(YFeld)); SetzeStein;
- END;
-
- BEGIN (* Steine_Im_Feld *)
- XFeld := 5 + 6 * SP;
- YFeld := 2 + 3 * ZE;
- 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
- BELL;
- WITH Feld[FeldNummer] DO BEGIN
- Vorhanden := SUCC (Vorhanden);
- Besitzer := Spieler;
- END;
- Wo;
- Steine_Im_Feld (FeldNummer);
- BELL;
- 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;
- BEGIN
- REPEAT
- Explodiert := FALSE;
- FOR Stelle := 1 TO Max DO
- IF Feld [Stelle].Vorhanden >= Feld [Stelle].Zulaessig
- THEN BEGIN
- Explosion (Stelle);
- Explodiert := TRUE;
- END;
- UNTIL NOT Explodiert;
- 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;
- IF Runde > 1 THEN BEGIN
- IF (FelderVonEins =0) OR (FelderVonZwei = 0)
- THEN BEGIN
- GOTOXY (25,23); WRITE ('SIEGER : Spieler ');
- WRITE (Spieler,' in Runde ',Runde);
- REPEAT UNTIL KEYPRESSED;
- Fertig := TRUE;
- END;
- END;
- IF Spieler = 2 THEN Runde := SUCC(Runde);
- GOTOXY (55,2); WRITE ('Runde ',Runde);
- GOTOXY (70,19); WRITE (FelderVonEins:2,' Feld(er)');
- GOTOXY (70,20); WRITE (FelderVonZwei:2,' Feld(er)');
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE SpielBeschreibung;
- CONST Zeile : INTEGER = 5;
-
- PROCEDURE TITEL;
- BEGIN
- CLRSCR;
- GOTOXY (36,1); INVERS; WRITE (' STRATEGO '); NORMAL;
- END;
-
- BEGIN
- TITEL;
- GOTOXY (2, Zeile);
- WRITE ('Die Aufgabe bei diesem Spiel ist es, auf ',
- 'einem Brett mit 36 Feldern alle');
- GOTOXY (2, Zeile+1);
- WRITE ('Steine des Gegners zu zerstoeren.');
- 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 abhaengig von seiner Lage ',
- 'eine bestimmte maximale Kapazitaet');
- 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 ',
- 'Kapazitaet, so werden die 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 gesetzt werden.');
- GOTOXY (31,23); INVERS;
- WRITE (' Weiter mit Tastendruck '); NORMAL;
- REPEAT UNTIL KEYPRESSED;
- TITEL;
- 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#32#32;
- XL : INTEGER = 8;
- YL : INTEGER = 3;
- VAR Schleife : INTEGER;
-
- PROCEDURE Spalte;
- BEGIN
- GOTOXY (XL-2,YL); WRITE (Schleife);
- END;
-
- PROCEDURE Zeile2;
- VAR Zaehler : INTEGER;
- BEGIN
- YL := SUCC(YL);
- GOTOXY (XL,YL);
- FOR Zaehler := 1 TO 6 DO WRITE (VE,Leer);
- WRITE (VE);
- END;
-
- PROCEDURE Zeile3;
- VAR Zaehler : INTEGER;
- BEGIN
- YL := SUCC(YL);
- GOTOXY (XL,YL); WRITE (ZR);
- FOR Zaehler := 1 TO 5 DO BEGIN
- WRITE (HO,HO,HO,HO,HO,KR);
- END;
- WRITE (HO,HO,HO,HO,HO,ZL);
- END;
-
- BEGIN (* SpielBrett *)
- FOR Schleife := 1 TO 6 DO BEGIN
- GOTOXY (XL-2+6*Schleife,YL); WRITE (CHR(64+Schleife));
- END;
- XL := SUCC(XL); YL := SUCC(YL);
- GOTOXY (XL,YL); WRITE (E1);
- FOR Schleife := 1 TO 5 DO WRITE (HO,HO,HO,HO,HO,ZU);
- WRITE (HO,HO,HO,HO,HO,E2);
- FOR Schleife := 1 TO 5 DO BEGIN
- Zeile2; Zeile2; Spalte; Zeile3;
- END;
- Schleife := SUCC(Schleife); Zeile2; Zeile2; Spalte;
- YL := SUCC(YL);
- GOTOXY (XL,YL); WRITE (E3);
- FOR Schleife := 1 TO 5 DO WRITE (HO,HO,HO,HO,HO,ZO);
- WRITE (HO,HO,HO,HO,HO,E4);
- GOTOXY (52,12); WRITE ('Eingabebeispiel : A1');
- GOTOXY (52,14); WRITE ('Ende mit "^Q"');
- GOTOXY (52,18); INVERS; WRITE (' ':17);
- GOTOXY (52,19); WRITE (' Spieler 1 : ',Stein_1,' ');
- GOTOXY (52,20); WRITE (' Spieler 2 : ',Stein_2,' ');
- GOTOXY (52,21); WRITE (' ':17); NORMAL;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE WerIstDran;
- BEGIN
- IF Spieler = 1 THEN Spieler := 2 ELSE Spieler := 1;
- INVERS;
- GOTOXY (50,5);
- WRITE (' Zugeingabe Spieler ',Spieler,' : ');
- GOTOXY (50,7); WRITE (' ':14);
- GOTOXY (50,8); WRITE (' auf Feld : ');
- GOTOXY (50,9); WRITE (' ':14);
- NORMAL;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE ZugEingabe;
- VAR Korrekt, OK : BOOLEAN;
-
- PROCEDURE Fehler;
- BEGIN
- BELL;
- GOTOXY (32,23); INVERS; WRITE (' Nicht zulaessig ! ');
- BELL;
- DELAY (1000);
- NORMAL; GOTOXY (32,23); CLREOL;
- 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
- GOTOXY (65,8); CLREOL;
- REPEAT
- READ (KBD, Spalte);
- Spalte := UPCASE (Spalte);
- OK := Spalte IN ['A'..'F',^Q];
- UNTIL OK;
- IF Spalte = ^Q THEN HALT;
- WRITE (Spalte);
- REPEAT
- READ (KBD, Zeile);
- OK := Zeile IN ['1'..'6'];
- UNTIL OK;
- WRITE (Zeile);
- Kontrolle;
- UNTIL Korrekt;
- END;
- (* ------------------------------------------------------ *)
- BEGIN
- SpielBeschreibung;
- SpielBrett;
- Initialisierung;
- REPEAT
- WerIstDran;
- ZugEingabe;
- Probe;
- SpielStand;
- UNTIL Fertig
- END.
- (* ------------------------------------------------------ *)
- (* Ende von STRATEGO.PAS *)