home *** CD-ROM | disk | FTP | other *** search
- (********************************************************)
- (* *)
- (* Modul: ZUGGEN.INC *)
- (* Projekt: CHESS *)
- (* Autor: Michael Thielscher *)
- (* erstellt am: 17.04.89 *)
- (* *)
- (********************************************************)
-
- PROCEDURE Zuggenerator (VAR Stellung: StellungsTyp;
- VAR ZugListe: ZuglistenTyp; VAR ZugZahl: BYTE);
-
- VAR Feld : FeldTyp;
- Figur : FigurenTyp;
-
- PROCEDURE ZugEintragen (vonFeld, nachFeld : FeldTyp);
- BEGIN
- WITH Stellung DO BEGIN
- IF Brett[nachFeld] = Leer THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- von := vonFeld; nach := nachFeld; NeueFigur := Leer;
- Schlagzug := FALSE; Rochade := 0
- END (* with *)
- END (* then *)
- ELSE
- IF (am_Zug = (Brett[nachFeld] IN [S_Bauer..S_Koenig])) AND (Brett[nachFeld] <> Illegal) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- von := vonFeld; nach := nachFeld; NeueFigur := Leer;
- Schlagzug := TRUE; hit := Brett[nachFeld]; ep := 0
- END (* with *)
- END (* then *)
- END (* with *)
- END; (* ZugEintragen *)
-
- PROCEDURE Koenig;
- VAR i: 1..8;
- BEGIN
- FOR i := 1 TO 8 DO ZugEintragen(Feld, Feld+K_Weite[i])
- END; (* Koenig *)
-
- PROCEDURE Dame;
- VAR i: 1..8;
- F: FeldTyp;
- BEGIN
- WITH Stellung DO
- FOR i := 1 TO 8 DO BEGIN
- F := Feld;
- REPEAT
- F := F + K_Weite[i]; ZugEintragen(Feld, F)
- UNTIL Brett[F] <> Leer
- END (* for *)
- END; (* Dame *)
-
- PROCEDURE Turm;
- VAR i: 1..4;
- F: FeldTyp;
- BEGIN
- WITH Stellung DO
- FOR i := 1 TO 4 DO BEGIN
- F := Feld;
- REPEAT
- F := F + K_Weite[i]; ZugEintragen(Feld, F)
- UNTIL Brett[F] <> Leer
- END (* for *)
- END; (* Turm *)
-
- PROCEDURE Laeufer;
- VAR i: 5..8;
- F: FeldTyp;
- BEGIN
- WITH Stellung DO
- FOR i := 5 TO 8 DO BEGIN
- F := Feld;
- REPEAT
- F := F + K_Weite[i]; ZugEintragen(Feld, F)
- UNTIL Brett[F] <> Leer
- END (* for *)
- END; (* Laeufer *)
-
- PROCEDURE Springer;
- VAR i: 1..8;
- BEGIN
- FOR i := 1 TO 8 DO ZugEintragen(Feld, Feld+S_Weite[i])
- END; (* Springer *)
-
- PROCEDURE Bauer;
- BEGIN
- WITH Stellung DO
- IF am_Zug THEN BEGIN
- IF Feld < 80 THEN BEGIN
- IF Brett[Feld+10] = Leer THEN BEGIN
- ZugEintragen(Feld, Feld+10);
- IF (Feld < 39) AND (Brett[Feld+20] = Leer) THEN
- ZugEintragen(Feld, Feld+20)
- END; (* then *)
- IF Brett[Feld+ 9] IN [S_Bauer..S_Koenig] THEN ZugEintragen(Feld, Feld+ 9);
- IF Brett[Feld+11] IN [S_Bauer..S_Koenig] THEN ZugEintragen(Feld, Feld+11);
- IF (en_pass > 0) AND (ABS(Feld - (60+en_pass)) = 1) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- von := Feld; nach := 70+en_pass; NeueFigur := Leer;
- Schlagzug := TRUE; hit := S_Bauer; ep := en_pass
- END (* with *)
- END (* then *)
- END (* then *)
- ELSE BEGIN
- IF Brett[Feld+10] = Leer THEN
- FOR Figur := W_Springer TO W_Dame DO BEGIN
- ZugEintragen(Feld, Feld+10); ZugListe[ZugZahl].NeueFigur := Figur
- END; (* for *)
- IF Brett[Feld+9] IN [S_Springer..S_Koenig] THEN
- FOR Figur := W_Springer TO W_Dame DO BEGIN
- ZugEintragen(Feld, Feld+9); ZugListe[ZugZahl].NeueFigur := Figur
- END; (* for *)
- IF Brett[Feld+11] IN [S_Springer..S_Koenig] THEN
- FOR Figur := W_Springer TO W_Dame DO BEGIN
- ZugEintragen(Feld, Feld+11); ZugListe[ZugZahl].NeueFigur := Figur
- END (* for *)
- END (* else *)
- END (* then *)
- ELSE BEGIN
- IF Feld > 39 THEN BEGIN
- IF Brett[Feld-10] = Leer THEN BEGIN
- ZugEintragen(Feld, Feld-10);
- IF (Feld > 80) AND (Brett[Feld-20] = Leer) THEN
- ZugEintragen(Feld, Feld-20)
- END; (* then *)
- IF Brett[Feld- 9] IN [W_Bauer..W_Koenig] THEN ZugEintragen(Feld, Feld- 9);
- IF Brett[Feld-11] IN [W_Bauer..W_Koenig] THEN ZugEintragen(Feld, Feld-11);
- IF (en_pass > 0) AND (ABS(Feld - (50+en_pass)) = 1) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- von := Feld; nach := 40+en_pass; NeueFigur := Leer;
- Schlagzug := TRUE; hit := W_Bauer; ep := en_pass
- END (* with *)
- END (* then *)
- END (* then *)
- ELSE BEGIN
- IF Brett[Feld-10] = Leer THEN
- FOR Figur := S_Springer TO S_Dame DO BEGIN
- ZugEintragen(Feld, Feld-10); ZugListe[ZugZahl].NeueFigur := Figur
- END; (* for *)
- IF Brett[Feld-9] IN [W_Springer..W_Koenig] THEN
- FOR Figur := S_Springer TO S_Dame DO BEGIN
- ZugEintragen(Feld, Feld-9); ZugListe[ZugZahl].NeueFigur := Figur
- END; (* for *)
- IF Brett[Feld+11] IN [W_Springer..W_Koenig] THEN
- FOR Figur := S_Springer TO S_Dame DO BEGIN
- ZugEintragen(Feld, Feld-11); ZugListe[ZugZahl].NeueFigur := Figur
- END (* for *)
- END (* else *)
- END (* else *)
- END; (* Bauer *)
-
- PROCEDURE Rochaden;
- BEGIN
- WITH Stellung DO
- IF am_Zug THEN BEGIN
- IF Rochaden[1] AND (Brett[22] = Leer) AND (Brett[23] = Leer) AND (Brett[24] = Leer) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- Schlagzug := FALSE; Rochade := 1
- END (* with *)
- END; (* then *)
- IF Rochaden[2] AND (Brett[26] = Leer) AND (Brett[27] = Leer) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- Schlagzug := FALSE; Rochade := 2
- END (* with *)
- END (* then *)
- END (* then *)
- ELSE BEGIN
- IF Rochaden[3] AND (Brett[92] = Leer) AND (Brett[93] = Leer) AND (Brett[94] = Leer) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- Schlagzug := FALSE; Rochade := 3
- END (* with *)
- END; (* then *)
- IF Rochaden[4] AND (Brett[96] = Leer) AND (Brett[97] = Leer) THEN BEGIN
- ZugZahl := SUCC(ZugZahl);
- WITH ZugListe[ZugZahl] DO BEGIN
- Schlagzug := FALSE; Rochade := 4
- END (* with *)
- END (* then *)
- END (* else *)
- END; (* Rochaden *)
-
- BEGIN (* Zuggenerator *)
- ZugZahl := 0;
- Rochaden;
- WITH Stellung DO
- FOR Feld := 21 TO 98 DO BEGIN
- Figur := Brett[Feld];
- IF (am_Zug = (Figur IN [W_Bauer..W_Koenig])) AND (NOT (Figur IN [Leer, Illegal])) THEN
- CASE Figur OF
- W_Bauer, S_Bauer : Bauer;
- W_Springer, S_Springer: Springer;
- W_Laeufer, S_Laeufer : Laeufer;
- W_Turm, S_Turm : Turm;
- W_Dame, S_Dame : Dame;
- W_Koenig, S_Koenig : Koenig
- END (* case *)
- END (* for *)
- END; (* Zuggenerator *)