home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 08 / schach / zuggen.inc < prev   
Encoding:
Text File  |  1989-04-18  |  7.7 KB  |  207 lines

  1. (********************************************************)
  2. (*                                                      *)
  3. (*   Modul:         ZUGGEN.INC                          *)
  4. (*   Projekt:       CHESS                               *)
  5. (*   Autor:         Michael Thielscher                  *)
  6. (*   erstellt am:   17.04.89                            *)
  7. (*                                                      *)
  8. (********************************************************)
  9.  
  10. PROCEDURE Zuggenerator (VAR Stellung: StellungsTyp;
  11.                         VAR ZugListe: ZuglistenTyp; VAR ZugZahl: BYTE);
  12.  
  13.   VAR  Feld  : FeldTyp;
  14.        Figur : FigurenTyp;
  15.  
  16.   PROCEDURE ZugEintragen (vonFeld, nachFeld : FeldTyp);
  17.     BEGIN
  18.       WITH Stellung DO BEGIN
  19.         IF Brett[nachFeld] = Leer THEN BEGIN
  20.           ZugZahl := SUCC(ZugZahl);
  21.           WITH ZugListe[ZugZahl] DO BEGIN
  22.             von := vonFeld;  nach := nachFeld;  NeueFigur := Leer;
  23.             Schlagzug := FALSE;  Rochade := 0
  24.           END (* with *)
  25.         END (* then *)
  26.         ELSE
  27.           IF (am_Zug = (Brett[nachFeld] IN [S_Bauer..S_Koenig])) AND (Brett[nachFeld] <> Illegal) THEN BEGIN
  28.             ZugZahl := SUCC(ZugZahl);
  29.             WITH ZugListe[ZugZahl] DO BEGIN
  30.               von := vonFeld;  nach := nachFeld;  NeueFigur := Leer;
  31.               Schlagzug := TRUE;  hit := Brett[nachFeld];  ep := 0
  32.             END (* with *)
  33.           END (* then *)
  34.       END (* with *)
  35.     END; (* ZugEintragen *)
  36.  
  37.   PROCEDURE Koenig;
  38.     VAR i: 1..8;
  39.     BEGIN
  40.       FOR i := 1 TO 8 DO ZugEintragen(Feld, Feld+K_Weite[i])
  41.     END; (* Koenig *)
  42.  
  43.   PROCEDURE Dame;
  44.     VAR i: 1..8;
  45.         F: FeldTyp;
  46.     BEGIN
  47.       WITH Stellung DO
  48.         FOR i := 1 TO 8 DO BEGIN
  49.           F := Feld;
  50.           REPEAT
  51.             F := F + K_Weite[i];  ZugEintragen(Feld, F)
  52.           UNTIL Brett[F] <> Leer
  53.         END (* for *)
  54.     END; (* Dame *)
  55.  
  56.   PROCEDURE Turm;
  57.     VAR i: 1..4;
  58.         F: FeldTyp;
  59.     BEGIN
  60.       WITH Stellung DO
  61.         FOR i := 1 TO 4 DO BEGIN
  62.           F := Feld;
  63.           REPEAT
  64.             F := F + K_Weite[i];  ZugEintragen(Feld, F)
  65.           UNTIL Brett[F] <> Leer
  66.         END (* for *)
  67.     END; (* Turm *)
  68.  
  69.   PROCEDURE Laeufer;
  70.     VAR i: 5..8;
  71.         F: FeldTyp;
  72.     BEGIN
  73.       WITH Stellung DO
  74.         FOR i := 5 TO 8 DO BEGIN
  75.           F := Feld;
  76.           REPEAT
  77.             F := F + K_Weite[i];  ZugEintragen(Feld, F)
  78.           UNTIL Brett[F] <> Leer
  79.         END (* for *)
  80.     END; (* Laeufer *)
  81.  
  82.   PROCEDURE Springer;
  83.     VAR i: 1..8;
  84.     BEGIN
  85.       FOR i := 1 TO 8 DO ZugEintragen(Feld, Feld+S_Weite[i])
  86.     END; (* Springer *)
  87.  
  88.   PROCEDURE Bauer;
  89.     BEGIN
  90.       WITH Stellung DO
  91.         IF am_Zug THEN BEGIN
  92.           IF Feld < 80 THEN BEGIN
  93.             IF Brett[Feld+10] = Leer THEN BEGIN
  94.               ZugEintragen(Feld, Feld+10);
  95.               IF (Feld < 39) AND (Brett[Feld+20] = Leer) THEN
  96.                 ZugEintragen(Feld, Feld+20)
  97.             END; (* then *)
  98.             IF Brett[Feld+ 9] IN [S_Bauer..S_Koenig] THEN ZugEintragen(Feld, Feld+ 9);
  99.             IF Brett[Feld+11] IN [S_Bauer..S_Koenig] THEN ZugEintragen(Feld, Feld+11);
  100.             IF (en_pass > 0) AND (ABS(Feld - (60+en_pass)) = 1) THEN BEGIN
  101.               ZugZahl := SUCC(ZugZahl);
  102.               WITH ZugListe[ZugZahl] DO BEGIN
  103.                 von := Feld;  nach := 70+en_pass;  NeueFigur := Leer;
  104.                 Schlagzug := TRUE;  hit := S_Bauer;  ep := en_pass
  105.               END (* with *)
  106.             END (* then *)
  107.           END (* then *)
  108.           ELSE BEGIN
  109.             IF Brett[Feld+10] = Leer THEN
  110.               FOR Figur := W_Springer TO W_Dame DO BEGIN
  111.                 ZugEintragen(Feld, Feld+10);  ZugListe[ZugZahl].NeueFigur := Figur
  112.               END; (* for *)
  113.             IF Brett[Feld+9] IN [S_Springer..S_Koenig] THEN
  114.               FOR Figur := W_Springer TO W_Dame DO BEGIN
  115.                 ZugEintragen(Feld, Feld+9);  ZugListe[ZugZahl].NeueFigur := Figur
  116.               END; (* for *)
  117.             IF Brett[Feld+11] IN [S_Springer..S_Koenig] THEN
  118.               FOR Figur := W_Springer TO W_Dame DO BEGIN
  119.                 ZugEintragen(Feld, Feld+11);  ZugListe[ZugZahl].NeueFigur := Figur
  120.               END (* for *)
  121.           END (* else *)
  122.         END (* then *)
  123.         ELSE BEGIN
  124.           IF Feld > 39 THEN BEGIN
  125.             IF Brett[Feld-10] = Leer THEN BEGIN
  126.               ZugEintragen(Feld, Feld-10);
  127.               IF (Feld > 80) AND (Brett[Feld-20] = Leer) THEN
  128.                 ZugEintragen(Feld, Feld-20)
  129.             END; (* then *)
  130.             IF Brett[Feld- 9] IN [W_Bauer..W_Koenig] THEN ZugEintragen(Feld, Feld- 9);
  131.             IF Brett[Feld-11] IN [W_Bauer..W_Koenig] THEN ZugEintragen(Feld, Feld-11);
  132.             IF (en_pass > 0) AND (ABS(Feld - (50+en_pass)) = 1) THEN BEGIN
  133.               ZugZahl := SUCC(ZugZahl);
  134.               WITH ZugListe[ZugZahl] DO BEGIN
  135.                 von := Feld;  nach := 40+en_pass;  NeueFigur := Leer;
  136.                 Schlagzug := TRUE;  hit := W_Bauer;  ep := en_pass
  137.               END (* with *)
  138.             END (* then *)
  139.           END (* then *)
  140.           ELSE BEGIN
  141.             IF Brett[Feld-10] = Leer THEN
  142.               FOR Figur := S_Springer TO S_Dame DO BEGIN
  143.                 ZugEintragen(Feld, Feld-10);  ZugListe[ZugZahl].NeueFigur := Figur
  144.               END; (* for *)
  145.             IF Brett[Feld-9] IN [W_Springer..W_Koenig] THEN
  146.               FOR Figur := S_Springer TO S_Dame DO BEGIN
  147.                 ZugEintragen(Feld, Feld-9);  ZugListe[ZugZahl].NeueFigur := Figur
  148.               END; (* for *)
  149.             IF Brett[Feld+11] IN [W_Springer..W_Koenig] THEN
  150.               FOR Figur := S_Springer TO S_Dame DO BEGIN
  151.                 ZugEintragen(Feld, Feld-11);  ZugListe[ZugZahl].NeueFigur := Figur
  152.               END (* for *)
  153.           END (* else *)
  154.         END (* else *)
  155.     END; (* Bauer *)
  156.  
  157.   PROCEDURE Rochaden;
  158.     BEGIN
  159.       WITH Stellung DO
  160.         IF am_Zug THEN BEGIN
  161.           IF Rochaden[1] AND (Brett[22] = Leer) AND (Brett[23] = Leer) AND (Brett[24] = Leer) THEN BEGIN
  162.             ZugZahl := SUCC(ZugZahl);
  163.             WITH ZugListe[ZugZahl] DO BEGIN
  164.               Schlagzug := FALSE;  Rochade := 1
  165.             END (* with *)
  166.           END; (* then *)
  167.           IF Rochaden[2] AND (Brett[26] = Leer) AND (Brett[27] = Leer) THEN BEGIN
  168.             ZugZahl := SUCC(ZugZahl);
  169.             WITH ZugListe[ZugZahl] DO BEGIN
  170.               Schlagzug := FALSE;  Rochade := 2
  171.             END (* with *)
  172.           END (* then *)
  173.         END (* then *)
  174.         ELSE BEGIN
  175.           IF Rochaden[3] AND (Brett[92] = Leer) AND (Brett[93] = Leer) AND (Brett[94] = Leer) THEN BEGIN
  176.             ZugZahl := SUCC(ZugZahl);
  177.             WITH ZugListe[ZugZahl] DO BEGIN
  178.               Schlagzug := FALSE;  Rochade := 3
  179.             END (* with *)
  180.           END; (* then *)
  181.           IF Rochaden[4] AND (Brett[96] = Leer) AND (Brett[97] = Leer) THEN BEGIN
  182.             ZugZahl := SUCC(ZugZahl);
  183.             WITH ZugListe[ZugZahl] DO BEGIN
  184.               Schlagzug := FALSE;  Rochade := 4
  185.             END (* with *)
  186.           END (* then *)
  187.         END (* else *)
  188.     END; (* Rochaden *)
  189.  
  190.   BEGIN   (* Zuggenerator *)
  191.     ZugZahl := 0;
  192.     Rochaden;
  193.     WITH Stellung DO
  194.       FOR Feld := 21 TO 98 DO BEGIN
  195.         Figur := Brett[Feld];
  196.         IF (am_Zug = (Figur IN [W_Bauer..W_Koenig])) AND (NOT (Figur IN [Leer, Illegal])) THEN
  197.           CASE Figur OF
  198.             W_Bauer,    S_Bauer   : Bauer;
  199.             W_Springer, S_Springer: Springer;
  200.             W_Laeufer,  S_Laeufer : Laeufer;
  201.             W_Turm,     S_Turm    : Turm;
  202.             W_Dame,     S_Dame    : Dame;
  203.             W_Koenig,   S_Koenig  : Koenig
  204.           END (* case *)
  205.       END (* for *)
  206.   END; (* Zuggenerator *)
  207.