{$M 65520, 80000, 655360}

PROGRAM chessteg (INPUT,OUTPUT);

(****************************************************************)

(* (c) 1994 1995 Paul Koop chessteg didaktisches Schachprogramm *)

(* das didaktische Schachprogramm chessteg wurde                *)

(* urspruenglich im rahmen der entwicklung der                 *)

(* Algorithmisch Rekursive Sequenzanalyse                       *)

(* zur ueberpruefung der verwendbarkeit von                     *)

(* spielbaeumen und alpha beta suche entwickelt                 *)

(* nicht als spielstarkes programm beabsichtigt                 *)

(* liegt seine staerke in der didaktischen verwendbarkeit       *)

(*                                                              *)

(* fuer dos (derivate) unix (derivate) turbo-pascal free-pascal *)

(* das programm darf mit copyright paul koop kostenfrei zu      *)

(* nicht kommerziellen zwecken verwendet werden                 *)

(****************************************************************)

 USES crt;

(* Deklarationen **********************************************)

(* Konstanten                                                 *)

 

 

CONST cweiss       =      1;

      cschwarz     =     -1;

      c0           =      0;

      c119         =    119;

      cl           =      7;

      ct           =     14;

      cd           =     21;

      ck           =     99;

      dumy         =    100;

      leer         =      0;

      czufall      =     10;

      ceins        =      1;

      ctiefe       =      5;

      c1000        =   1000;

 

      A1=21;

      A2=31;

      A3=41;

      A4=51;

      A5=61;

      A6=71;

      A7=81;

      A8=91;

      B1=22;

      B2=32;

      B3=42;

      B4=52;

      B5=62;

      B6=72;

      B7=82;

      B8=92;

      C1=23;

      C2=33;

      C3=43;

      C4=53;

      C5=63;

      C6=73;

      C7=83;

      C8=93;

      D1=24;

      D2=34;

      D3=44;

      D4=54;

      D5=64;

      D6=74;

      D7=84;

      D8=94;

      E1=25;

      E2=35;

      E3=45;

      E4=55;

      E5=65;

      E6=75;

      E7=85;

      E8=95;

      F1=26;

      F2=36;

      F3=46;

      F4=56;

      F5=66;

      F6=76;

      F7=86;

      F8=96;

      G1=27;

      G2=37;

      G3=47;

      G4=57;

      G5=67;

      G6=77;

      G7=87;

      G8=97;

      H1=28;

      H2=38;

      H3=48;

      H4=58;

      H5=68;

      H6=78;

      H7=88;

      H8=98;

 

      cmaxInteger =  32767;

      cminInteger = -32768;

 

TYPE  Tfigurenliste = ^Tfigur;

      Tfigur = RECORD

                art:Byte;

                farbe:SHORTINT;

                pos:c0..c119;

                geschlagen:BOOLEAN;

                vor,nach:Tfigurenliste;

               END;

 

 

 

      Tzugliste = ^Tzug;

      Tzug = RECORD

              vonpos,nachpos,art: Byte;

            farbe:SHORTINT;

              geschlagen:Tfigurenliste;

              vor,nach:Tzugliste;

             END;

 

 

      Tbrett= ARRAY(.c0..c119.) OF SHORTINT;

 

      Tziehe = RECORD

                vonpos,nachpos,art:BYTE;

                farbe:SHORTINT;

                geschlagen:Tfigurenliste;

               END;

 

CONST brett:Tbrett = (

                      dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,

                      dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,leer,leer,leer,leer,leer,leer,leer,leer,dumy,

                      dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,

                      dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy,dumy

                     );

 

VAR

     bewertung,zaehler:INTEGER;

     figurenliste         :Tfigurenliste;

     endmatt,patt:BOOLEAN;

 

 

(* Funktionen                                                 *)

 

 

PROCEDURE zeigebrett(VAR brett:Tbrett);

VAR i:INTEGER;

BEGIN

textcolor(white);

writeln('______A__B__C__D__E__F__G__H');

write('_'); for i:=110 TO 119 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.))); textcolor (white); END; writeln;

write('_'); for i:=100 TO 109 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.))); textcolor (white); END; writeln;

 

write('8'); for i:=90 TO 99 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('7'); for i:=80 TO 89 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('6'); for i:=70 TO 79 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('5'); for i:=60 TO 69 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('4'); for i:=50 TO 59 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('3'); for i:=40 TO 49 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('2'); for i:=30 TO 39 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

write('1'); for i:=20 TO 29 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.)):3); textcolor (white); END; writeln;

 

 

write('_'); for i:=10 TO 19 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.))); textcolor (white); END; writeln;

write('_'); for i:=0 TO 9 DO

  BEGIN IF (brett(.i.)<c0) THEN textcolor (red); write(abs(brett(.i.))); textcolor (white); END; writeln;

 

writeln('______A__B__C__D__E__F__G__H');

END;

 

 

PROCEDURE schreibePosition (pos:INTEGER);

BEGIN

 CASE pos OF

 

      A1:write('A1');

      A2:write('A2');

      A3:write('A3');

      A4:write('A4');

      A5:write('A5');

      A6:write('A6');

      A7:write('A7');

      A8:write('A8');

      B1:write('B1');

      B2:write('B2');

      B3:write('B3');

      B4:write('B4');

      B5:write('B5');

      B6:write('B6');

      B7:write('B7');

      B8:write('B8');

      C1:write('C1');

      C2:write('C2');

      C3:write('C3');

      C4:write('C4');

      C5:write('C5');

      C6:write('C6');

      C7:write('C7');

      C8:write('C8');

      D1:write('D1');

      D2:write('D2');

      D3:write('D3');

      D4:write('D4');

      D5:write('D5');

      D6:write('D6');

      D7:write('D7');

      D8:write('D8');

      E1:write('E1');

      E2:write('E2');

      E3:write('E3');

      E4:write('E4');

      E5:write('E5');

      E6:write('E6');

      E7:write('E7');

      E8:write('E8');

      F1:write('F1');

      F2:write('F2');

      F3:write('F3');

      F4:write('F4');

      F5:write('F5');

      F6:write('F6');

      F7:write('F7');

      F8:write('F8');

      G1:write('G1');

      G2:write('G2');

      G3:write('G3');

      G4:write('G4');

      G5:write('G5');

      G6:write('G6');

      G7:write('G7');

      G8:write('G8');

      H1:write('H1');

      H2:write('H2');

      H3:write('H3');

      H4:write('H4');

      H5:write('H5');

      H6:write('H6');

      H7:write('H7');

      H8:write('H8');

 

 ELSE

      write('fehler bei position');

 END;

END;

 

 

PROCEDURE schreibeFigur (art:INTEGER);

BEGIN

 CASE art OF

       7:write('Weisser   Laeufer');

      14:write('Weisser   Turm   ');

      21:write('Weisse    Dame   ');

      99:write('Weisser   Koenig ');

      -7:write('Weisser   Laeufer');

     -14:write('Schwarzer Turm   ');

     -21:write('Schwarze  Dame   ');

     -99:write('Schwarzer Koenig ');

 

 ELSE

         write('fehler bei art   ');

 END;

END;

 

 

FUNCTION figurenListeGenerieren(VAR figurenliste:Tfigurenliste):Tfigurenliste;

 VAR neuefigur,aktuell,wurzel:Tfigurenliste;

 BEGIN

 

  (*fuenf Figuren*)

 

  new(neuefigur);aktuell:=neuefigur;wurzel:=aktuell;

  neuefigur^.art:=ck;neuefigur^.farbe:=cschwarz;

  neuefigur^.pos:=E8;brett(.E8.):=ck*cschwarz;

  neuefigur^.geschlagen:=false;

  neuefigur^.vor:=NIL;

 

 

(*

  new(neuefigur);

  neuefigur^.art:=ct;neuefigur^.farbe:=cweiss;

  neuefigur^.pos:=A2;brett(.A2.):=ct*cweiss;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

 

 

  new(neuefigur);

  neuefigur^.art:=ct;neuefigur^.farbe:=cschwarz;

  neuefigur^.pos:=H8;brett(.H8.):=ct*cschwarz;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

 

 

 

 

  new(neuefigur);

  neuefigur^.art:=cl;neuefigur^.farbe:=cweiss;

  neuefigur^.pos:=C1;brett(.C1.):=cl*cweiss;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

 

 

  new(neuefigur);

  neuefigur^.art:=cl;neuefigur^.farbe:=cschwarz;

  neuefigur^.pos:=C8;brett(.C8.):=cl*cschwarz;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

*)

 

  new(neuefigur);

  neuefigur^.art:=ct;neuefigur^.farbe:=cschwarz;

  neuefigur^.pos:=D5;brett(.D5.):=ct*cschwarz;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

 

  new(neuefigur);

  neuefigur^.art:=cd;neuefigur^.farbe:=cschwarz;

  neuefigur^.pos:=D8;brett(.D8.):=cd*cschwarz;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

(*

  new(neuefigur);

  neuefigur^.art:=cd;neuefigur^.farbe:=cweiss;

  neuefigur^.pos:=D1;brett(.D1.):=cd*cweiss;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

*)

 

  new(neuefigur);

  neuefigur^.art:=ck;neuefigur^.farbe:=cweiss;

  neuefigur^.pos:=E1;brett(.E1.):=ck*cweiss;

  neuefigur^.geschlagen:=false;

  neuefigur^.nach:=nil;

  neuefigur^.vor:=aktuell;

  aktuell^.nach:=neuefigur;

  aktuell:= neuefigur;

 

  figurenListeGenerieren:=wurzel;

 

 

 

 END;

 

 

PROCEDURE abbauFigurenListe(VAR figurenliste:Tfigurenliste);

BEGIN

  writeln('abbau figurenliste');

  IF (figurenliste^.nach<>nil) THEN abbauFigurenListe(figurenliste^.nach);

  dispose(figurenliste);figurenliste:=NIL;

END;

 

FUNCTION geschlagenefigur(feld:Byte):Tfigurenliste;

 VAR aktuell,geschlagen:Tfigurenliste;

 BEGIN

  aktuell:=figurenliste;

  geschlagen:=NIL;

  WHILE (aktuell<>nil)

   DO

   BEGIN

    IF ((aktuell^.pos=feld)AND(aktuell^.geschlagen=false))

     THEN BEGIN geschlagen:=aktuell; geschlagenefigur:=geschlagen;exit; END;

    aktuell:=aktuell^.nach;

   END;

   geschlagenefigur:=geschlagen;

 END;

 

 

 

FUNCTION generiereTurmzuege(farbe:SHORTINT;VAR aktuellefigur:Tfigurenliste):Tzugliste;

 CONST

      auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

 VAR feld:BYTE;

     neu,wurzel,aktuell:Tzugliste;

     PROCEDURE zieheNach(auf:SHORTINT);

     VAR suchende:BOOLEAN;

     BEGIN

         suchende:=false;

         feld:=aktuellefigur^.pos+auf;

         IF (

               ((aktuellefigur^.farbe=cweiss  )AND(brett(.feld.)>c0)

                AND(brett(.feld.)<>dumy))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR

               (brett(.feld.)=dumy)

            )

            THEN suchende:=true;

 

         WHILE ((brett(.feld.)<>dumy)AND(NOT(suchende)))

         DO

          BEGIN

           IF (neu=NIL)

            THEN

             BEGIN

              new(neu);

              neu^.geschlagen:=NIL;

              neu^.nach:=nil;neu^.vor:=nil;

              wurzel:=neu;

              aktuell:=neu;

             END

            ELSE

             BEGIN

             new(neu);

             neu^.geschlagen:=NIL;

             neu^.nach:=nil;neu^.vor:=aktuell;

             aktuell^.nach:= neu;

             aktuell:=neu;

             END;

           neu^.vonpos:=aktuellefigur^.pos;

           neu^.nachpos:=feld;

           neu^.farbe:=aktuellefigur^.farbe;

           neu^.art:=ct;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)<c0))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)>c0)

                 AND(brett(.feld.)<>dumy))

              )

           THEN

            BEGIN

             neu^.geschlagen:=geschlagenefigur(feld);

             suchende:=true;

            END;

            feld:=feld+auf;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)>c0))

               OR((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR(brett(.feld.)=dumy)

              ) THEN suchende:=true;

          END;

 

     END;

  BEGIN

     neu:=nil;aktuell:=nil;wurzel:=nil;

 

     zieheNach(auf);

     zieheNach(ab);

 

     zieheNach(links);

     zieheNach(rechts);

 

     generiereTurmzuege:= wurzel;

 END;

 

FUNCTION generiereLaeuferzuege(farbe:SHORTINT;VAR aktuellefigur:Tfigurenliste):Tzugliste;

 CONST

      auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

 VAR feld:BYTE;

     neu,wurzel,aktuell:Tzugliste;

     PROCEDURE zieheNach(auf:SHORTINT);

     VAR suchende:BOOLEAN;

     BEGIN

         suchende:=false;

         feld:=aktuellefigur^.pos+auf;

         IF (

               ((aktuellefigur^.farbe=cweiss  )AND(brett(.feld.)>c0)

                AND(brett(.feld.)<>dumy))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR

               (brett(.feld.)=dumy)

            )

            THEN suchende:=true;

 

         WHILE ((brett(.feld.)<>dumy)AND(NOT(suchende)))

         DO

          BEGIN

           IF (neu=NIL)

            THEN

             BEGIN

              new(neu);

              neu^.geschlagen:=NIL;

              neu^.nach:=nil;neu^.vor:=nil;

              wurzel:=neu;

              aktuell:=neu;

             END

            ELSE

             BEGIN

             new(neu);

             neu^.geschlagen:=NIL;

             neu^.nach:=nil;neu^.vor:=aktuell;

             aktuell^.nach:= neu;

             aktuell:=neu;

             END;

           neu^.vonpos:=aktuellefigur^.pos;

           neu^.nachpos:=feld;

           neu^.farbe:=aktuellefigur^.farbe;

           neu^.art:=cl;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)<c0))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)>c0)

                 AND(brett(.feld.)<>dumy))

              )

           THEN

            BEGIN

             neu^.geschlagen:=geschlagenefigur(feld);

             suchende:=true;

            END;

            feld:=feld+auf;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)>c0))

               OR((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR(brett(.feld.)=dumy)

              ) THEN suchende:=true;

          END;

 

     END;

  BEGIN

     neu:=nil;aktuell:=nil;wurzel:=nil;

 

     zieheNach(auf+links);

     zieheNach(ab+links);

 

     zieheNach(auf+rechts);

     zieheNach(ab+rechts);

 

     generiereLaeuferzuege:= wurzel;

 END;

 

FUNCTION generiereDamezuege(farbe:SHORTINT;VAR aktuellefigur:Tfigurenliste):Tzugliste;

 CONST

      auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

 VAR feld:BYTE;

     neu,wurzel,aktuell:Tzugliste;

     PROCEDURE zieheNach(auf:SHORTINT);

     VAR suchende:BOOLEAN;

     BEGIN

         suchende:=false;

         feld:=aktuellefigur^.pos+auf;

         IF (

               ((aktuellefigur^.farbe=cweiss  )AND(brett(.feld.)>c0)

                AND(brett(.feld.)<>dumy))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR

               (brett(.feld.)=dumy)

            )

            THEN suchende:=true;

 

         WHILE ((brett(.feld.)<>dumy)AND(NOT(suchende)))

         DO

          BEGIN

           IF (neu=NIL)

            THEN

             BEGIN

              new(neu);

              neu^.geschlagen:=NIL;

              neu^.nach:=nil;neu^.vor:=nil;

              wurzel:=neu;

              aktuell:=neu;

             END

            ELSE

             BEGIN

             new(neu);

             neu^.geschlagen:=NIL;

             neu^.nach:=nil;neu^.vor:=aktuell;

             aktuell^.nach:= neu;

             aktuell:=neu;

             END;

           neu^.vonpos:=aktuellefigur^.pos;

           neu^.nachpos:=feld;

           neu^.farbe:=aktuellefigur^.farbe;

           neu^.art:=cd;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)<c0))

               OR

               ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)>c0)

                 AND(brett(.feld.)<>dumy))

              )

           THEN

            BEGIN

             neu^.geschlagen:=geschlagenefigur(feld);

             suchende:=true;

            END;

            feld:=feld+auf;

           IF (

               ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)>c0))

               OR((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

               OR(brett(.feld.)=dumy)

              ) THEN suchende:=true;

          END;

 

     END;

  BEGIN

     neu:=nil;aktuell:=nil;wurzel:=nil;

 

     zieheNach(auf+links);

     zieheNach(ab+links);

 

     zieheNach(auf+rechts);

     zieheNach(ab+rechts);

 

     zieheNach(auf);

     zieheNach(ab);

 

     zieheNach(links);

     zieheNach(rechts);

 

 

     generiereDamezuege:= wurzel;

 END;

 

 

FUNCTION attakiert(feld:SHORTINT; VAR aktuellefigur:Tfigurenliste):BOOLEAN;

CONST

      auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

VAR attacke,suchende:BOOLEAN;

    testfeld:SHORTINT;

 

FUNCTION vonTurmBedroht(feld,richtung:SHORTINT):BOOLEAN;

VAR attacke,suchende:BOOLEAN;

    testfeld:SHORTINT;

 

 BEGIN

  attacke:= false;suchende:=false;

  Testfeld:=feld+richtung;

  WHILE ((brett(.testfeld.)<>dumy)AND(NOT(suchende)))

  DO

  BEGIN

   IF (brett(.testfeld.)<>(aktuellefigur^.farbe*aktuellefigur^.art))

   THEN

   IF (

       (aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=ct)

       OR

       (aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-ct)

      )

      THEN BEGIN attacke:=true;suchende:=true;END;

      IF (brett(.testfeld.)<>leer) THEN suchende:=true;

   testfeld:=testfeld+richtung;

  END;

  vonTurmBedroht:=attacke;

 END;

 

 

FUNCTION vonLaeuferBedroht(feld,richtung:SHORTINT):BOOLEAN;

VAR attacke,suchende:BOOLEAN;

    testfeld:SHORTINT;

 

 BEGIN

  attacke:= false;suchende:=false;

  Testfeld:=feld+richtung;

  WHILE ((brett(.testfeld.)<>dumy)AND(NOT(suchende)))

  DO

  BEGIN

   IF (brett(.testfeld.)<>(aktuellefigur^.farbe*aktuellefigur^.art))

   THEN

   IF (

       (aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=cl)

       OR

       (aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-cl)

      )

      THEN BEGIN attacke:=true;suchende:=true;END;

      IF (brett(.testfeld.)<>leer)THEN suchende:=true;

   testfeld:=testfeld+richtung;

  END;

  vonLaeuferBedroht:=attacke;

 END;

 

FUNCTION vonDameBedroht(feld,richtung:SHORTINT):BOOLEAN;

VAR attacke,suchende:BOOLEAN;

    testfeld:SHORTINT;

 

 BEGIN

  attacke:= false;suchende:=false;

  Testfeld:=feld+richtung;

  WHILE ((brett(.testfeld.)<>dumy)AND(NOT(suchende)))

  DO

  BEGIN

   IF (brett(.testfeld.)<>(aktuellefigur^.farbe*aktuellefigur^.art))

   THEN

   IF (

       (aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=cd)

       OR

       (aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-cd)

      )

      THEN BEGIN attacke:=true;suchende:=true;END;

      IF (brett(.testfeld.)<>leer)THEN suchende:=true;

   testfeld:=testfeld+richtung;

  END;

  vonDameBedroht:=attacke;

 END;

 

 

FUNCTION vonKoenigBedroht(feld,richtung:SHORTINT):BOOLEAN;

VAR attacke,suchende:BOOLEAN;

    testfeld:SHORTINT;

 

BEGIN

 attacke:=false;

 testfeld:=feld+richtung;

 if (

     (aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=ck)

     OR

     (aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-ck)

    )

    THEN BEGIN attacke:=true;END;

 vonKoenigBedroht:=attacke;

 

END;

 

BEGIN

  attacke:=false;

  attacke:=vonTurmBedroht(feld,auf);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonTurmBedroht(feld,links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonTurmBedroht(feld,rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonTurmBedroht(feld,ab);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

 

  attacke:=vonLaeuferBedroht(feld,auf+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonLaeuferBedroht(feld,ab+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonLaeuferBedroht(feld,auf+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonLaeuferBedroht(feld,ab+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

 

 

  attacke:=vonDameBedroht(feld,auf);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,ab);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

 

  attacke:=vonDameBedroht(feld,auf+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,ab+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,auf+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonDameBedroht(feld,ab+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

 

 

  attacke:=vonKoenigBedroht(feld,auf+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,auf+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,ab+rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,ab+links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,auf);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,ab);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,rechts);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attacke:=vonKoenigBedroht(feld,links);

  IF attacke THEN BEGIN attakiert:=attacke; exit; END;

  attakiert:=attacke;

END;

 

 

FUNCTION generiereKoenigszuege(farbe:SHORTINT;VAR aktuellefigur:Tfigurenliste):Tzugliste;

 CONST

      auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

 VAR feld:BYTE;

     neu,wurzel,aktuell:Tzugliste;

 

     PROCEDURE zieheNach(auf:SHORTINT);

 

 

 

     BEGIN (* generiegrekoenigszuege() *)

         feld:=aktuellefigur^.pos+auf;

         IF (

             NOT

                (

                 ((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)>c0))

                 OR

                 ((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))

                 OR

                 (brett(.feld.)=dumy)

                )

            )

            AND

            (NOT(attakiert(feld,aktuellefigur)))

          THEN

           BEGIN

           IF (neu=NIL)

            THEN

             BEGIN

              new(neu);

              neu^.geschlagen:=NIL;

              neu^.nach:=nil;neu^.vor:=nil;

              wurzel:=neu;

              aktuell:=neu;

             END

            ELSE

             BEGIN

              new(neu);

              neu^.geschlagen:=NIL;

              neu^.nach:=nil;neu^.vor:=aktuell;

              aktuell^.nach:= neu;

              aktuell:=neu;

             END;

           neu^.vonpos:=aktuellefigur^.pos;

           neu^.nachpos:=feld;

           neu^.farbe:=aktuellefigur^.farbe;

           neu^.art:=ck;

           IF (

               (

                (aktuellefigur^.farbe=cweiss)AND(brett(.feld.)<c0)

               )

                OR

               (

                (aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)>c0)

                 AND

                 (brett(.feld.)<>dumy)

               )

              )

           THEN

            BEGIN

             neu^.geschlagen:=geschlagenefigur(feld);

            END;

           END;(* ENDE zieheNach*)

     END;

  BEGIN

     neu:=nil;aktuell:=nil;wurzel:=nil;

 

     zieheNach(auf+links);

     zieheNach(auf);

     zieheNach(auf+rechts);

     zieheNach(links);

     zieheNach(rechts);

     zieheNach(ab+links);

     zieheNach(ab);

     zieheNach(ab+rechts);

 

     generiereKoenigszuege:= wurzel;

 END;

 

 

 

 

FUNCTION zuggenerator (farbe:INTEGER):Tzugliste;

VAR neu,wurzel:Tzugliste;

    aktuell:Tfigurenliste;

BEGIN

 neu:=nil;wurzel:=nil;aktuell:=figurenliste;

 WHILE aktuell <> nil

 DO

 BEGIN

  IF ((aktuell^.farbe = farbe) AND (Not(aktuell^.geschlagen)))

  THEN

  BEGIN

   CASE aktuell^.art OF

    ck:

       IF (neu=nil)

       THEN

       BEGIN

        neu := generiereKoenigszuege(farbe,aktuell);

        wurzel := neu;

       END

       ELSE

       BEGIN

        neu^.nach := generiereKoenigszuege(farbe,aktuell);

        neu^.nach^.vor := neu

       END;

    ct:

       IF (neu=nil)

       THEN

       BEGIN

        neu := generiereTurmzuege(farbe,aktuell);

        wurzel := neu;

       END

       ELSE

       BEGIN

        neu^.nach := generiereTurmzuege(farbe,aktuell);

        neu^.nach^.vor := neu

       END;

    cl:

       IF (neu=nil)

       THEN

       BEGIN

        neu := generiereLaeuferzuege(farbe,aktuell);

        wurzel := neu;

       END

       ELSE

       BEGIN

        neu^.nach := generiereLaeuferzuege(farbe,aktuell);

        neu^.nach^.vor := neu

       END;

 

    cd:

       IF (neu=nil)

       THEN

       BEGIN

        neu := generiereDamezuege(farbe,aktuell);

        wurzel := neu;

       END

       ELSE

       BEGIN

        neu^.nach := generiereDamezuege(farbe,aktuell);

        neu^.nach^.vor := neu

       END;

 

 

   ELSE

    writeln ('zuggeneratorFehler');

   END

  END;

  IF neu <> nil THEN WHILE (neu^.nach <> nil) DO neu := neu^.nach;

  aktuell := aktuell^.nach;

 END;

 zuggenerator := wurzel;

END;

 

PROCEDURE zugAbbau(linie:STRING;farbe:SHORTINT; VAR zugliste:Tzugliste);

 

BEGIN

 IF(zugliste^.nach<>nil) THEN zugAbbau(linie,farbe,zugliste^.nach);

 dispose(zugliste); zugliste:=NIL;

END;

 

 

PROCEDURE figuren(figurenliste:Tfigurenliste);

VAR aktuell:Tfigurenliste;

BEGIN

 aktuell:=figurenliste;

 WHILE (aktuell<>NIL)

  DO

   BEGIN

    schreibeFigur(aktuell^.art*aktuell^.farbe);write(' ');

    schreibeposition(aktuell^.pos);write;

    IF aktuell^.geschlagen THEN write(' geschlagen ');

     writeln;

     aktuell:=aktuell^.nach;

   END

END;

 

 

 

FUNCTION bewerteZug (linie:STRING;farbe:INTEGER):INTEGER;

Var wert:INTEGER;

    horizontalwert,vertikalwert,zwischen:SHORTINT;

    feld:BYTE;

    aktuell:Tfigurenliste;

    suchende:BOOLEAN;

 

CONST auf   = 10;

      ab    =-10;

      links = -1;

      rechts= +1;

 

 

BEGIN (* BEWERTUNG ZUG mit bewerteZUG() *)

 wert:=0;

 aktuell:=figurenliste;

 WHILE (aktuell<>nil)

  DO

   BEGIN

    IF (NOT(aktuell^.geschlagen)AND(aktuell^.art=ct))

     THEN

         BEGIN

         wert:= wert+(aktuell^.art*aktuell^.farbe);

         suchende:=false;

         feld:=aktuell^.pos+auf;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         suchende:=false;

         feld:=aktuell^.pos+ab;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+rechts;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         END;(*if not geschlagen und turm*)

 

    IF (NOT(aktuell^.geschlagen)AND(aktuell^.art=cl))

     THEN

         BEGIN

         wert:= wert+(aktuell^.art*aktuell^.farbe);

         suchende:=false;

         feld:=aktuell^.pos+auf+rechts;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         suchende:=false;

         feld:=aktuell^.pos+ab+rechts;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+auf+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+ab+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         END;(*if not geschlagen und laeufer*)

 

    IF (NOT(aktuell^.geschlagen)AND(aktuell^.art=cd))

     THEN

         BEGIN

         wert:= wert+(aktuell^.art*aktuell^.farbe);

         suchende:=false;

         feld:=aktuell^.pos+auf+rechts;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         suchende:=false;

         feld:=aktuell^.pos+ab+rechts;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+auf+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+ab+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         suchende:=false;

         feld:=aktuell^.pos+auf;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+auf;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         suchende:=false;

         feld:=aktuell^.pos+ab;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+ab;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

          suchende:=false;

         feld:=aktuell^.pos+rechts;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((brett(.feld.)=leer)AND(NOT(suchende)))

         DO

          BEGIN

           wert:=wert+(1*aktuell^.farbe);

           feld:=feld+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

 

         END;(*if not geschlagen und dame*)

 

 

    IF ((NOT(aktuell^.geschlagen))AND(aktuell^.art=ck))

     THEN

      BEGIN (*KOENIGSBEWERTUNG*)

       wert:= wert+(aktuell^.art*aktuell^.farbe);

 

       (* zentrum koenig *)

        horizontalwert:=0;zwischen:=0;

        suchende:=false;

         feld:=aktuell^.pos+rechts;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((NOT(suchende)))

         DO

          BEGIN

           zwischen:=zwischen+(1*aktuell^.farbe);

           feld:=feld+rechts;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         (* rechts horizontalwert*)

         horizontalwert:=zwischen;zwischen:=0;

         suchende:=false;

         feld:=aktuell^.pos+links;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((NOT(suchende)))

         DO

          BEGIN

           zwischen:=zwischen+(1*aktuell^.farbe);

           feld:=feld+links;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         (* links horizontalwert*)

         IF abs(horizontalwert)>abs(zwischen) THEN horizontalwert:=zwischen;

         wert:=wert+horizontalwert;

 

         vertikalwert:=0;zwischen:=0;

        suchende:=false;

         feld:=aktuell^.pos+auf;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((NOT(suchende)))

         DO

          BEGIN

           zwischen:=zwischen+(1*aktuell^.farbe);

           feld:=feld+auf;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         (* auf vertikalwert*)

         vertikalwert:=zwischen;zwischen:=0;

         suchende:=false;

         feld:=aktuell^.pos+ab;

         IF(brett(.feld.)=dumy) THEN suchende:=true;

         WHILE((NOT(suchende)))

         DO

          BEGIN

           zwischen:=zwischen+(1*aktuell^.farbe);

           feld:=feld+ab;

           IF(brett(.feld.)=dumy) THEN suchende:=true;

          END;

         (* ab vertikalwert*)

         IF abs(vertikalwert)>abs(zwischen) THEN vertikalwert:=zwischen;

         wert:=wert+vertikalwert;

 

       (* umgebung koenig *)

 

       IF (

                 ((brett(.feld+auf.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+auf.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+auf.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

       IF (

                 ((brett(.feld+auf+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+auf+rechts.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+auf+rechts.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

       IF (

                 ((brett(.feld+auf+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+auf+links.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+auf+links.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

       IF (

                 ((brett(.feld+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+links.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+links.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

       IF (

                 ((brett(.feld+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+rechts.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+rechts.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

 

       IF (

                 ((brett(.feld+ab+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+ab+links.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+ab+links.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

 

       IF (

                 ((brett(.feld+ab+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+ab+rechts.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+ab+rechts.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

       IF (

                 ((brett(.feld+ab.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld.)<>dumy))

                 OR

                 ((brett(.feld+ab.)>c0)AND(aktuell^.farbe<c0))

                 OR

                 (brett(.feld+ab.)=leer)

           )

                THEN wert:=wert+(1*aktuell^.farbe);

 

       IF((attakiert(feld+auf       ,aktuell))OR(brett(.feld+auf.)=dumy       ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+auf+rechts,aktuell))OR(brett(.feld+auf+rechts.)=dumy))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+links     ,aktuell))OR(brett(.feld+links.)=dumy     ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+rechts    ,aktuell))OR(brett(.feld+rechts.)=dumy    ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+ab+links  ,aktuell))OR(brett(.feld+ab+links.)=dumy  ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+ab        ,aktuell))OR(brett(.feld+ab.)=dumy        ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+auf+links ,aktuell))OR(brett(.feld+auf+links.)=dumy ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld+ab+rechts ,aktuell))OR(brett(.feld+ab+rechts.)=dumy ))THEN wert:=wert-(1*aktuell^.farbe);

       IF((attakiert(feld           ,aktuell)))                                 THEN wert:=wert-(1*aktuell^.farbe);

 

      END;(*Koenigsbewertung*)

 

    aktuell:=aktuell^.nach;

   END;(*WHILE not nil*)

 bewerteZug := wert;

END;

 

 

PROCEDURE ComputerZugSetzen(VAR brett:Tbrett; VAR ziehe:Tziehe);

VAR aktuell:Tfigurenliste;

BEGIN

 brett(.ziehe.vonpos.):=leer;

 brett(.ziehe.nachpos.):=ziehe.art*ziehe.farbe;

(* writeln(' farbe ',ziehe.farbe,' art ',ziehe.art,' ', ziehe.farbe*ziehe.art,' ',brett(.ziehe.nachpos.));*)

 aktuell:=figurenliste;

 WHILE (aktuell<>nil)

  DO

   BEGIN

    IF (

        (aktuell^.pos=ziehe.vonpos)AND

        (NOT(aktuell^.geschlagen)) AND

        (aktuell^.art=ziehe.art)   AND

        (aktuell^.farbe=ziehe.farbe)

       )

    THEN

     BEGIN

      aktuell^.pos:=ziehe.nachpos;

 

     END;

    aktuell:=aktuell^.nach;

   END;

   IF (ziehe.geschlagen<>NIL)

   THEN ziehe.geschlagen^.geschlagen:=true;

END;

 

PROCEDURE brettZugSetzen (VAR brett:Tbrett;VAR ziehe:Tziehe);

VAR aktuell:Tfigurenliste;

BEGIN

 brett(.ziehe.vonpos.):=leer;

 brett(.ziehe.nachpos.):=ziehe.art*ziehe.farbe;

 aktuell:=figurenliste;

 WHILE (aktuell<>nil)

  DO

   BEGIN

    IF (

        (aktuell^.pos=ziehe.vonpos)AND

        (NOT(aktuell^.geschlagen)) AND

        (aktuell^.art=ziehe.art)   AND

        (aktuell^.farbe=ziehe.farbe)

       )

    THEN

     BEGIN

      aktuell^.pos:=ziehe.nachpos;

 

     END;

     aktuell:=aktuell^.nach;

   END;

   IF (ziehe.geschlagen<>NIL)

    THEN ziehe.geschlagen^.geschlagen:=true;

END;

 

PROCEDURE brettZugZuruecknehmen (VAR brett:Tbrett; VAR ziehe:Tziehe);

VAR aktuell:Tfigurenliste;

BEGIN

 brett(.ziehe.nachpos.):=leer;

 brett(.ziehe.vonpos.):=ziehe.art*ziehe.farbe;

 aktuell:=figurenliste;

 WHILE (aktuell<>nil)

  DO

   BEGIN

    IF (

        (aktuell^.pos=ziehe.nachpos)AND

        (NOT(aktuell^.geschlagen))  AND

        (aktuell^.art=ziehe.art)   AND

        (aktuell^.farbe=ziehe.farbe)

       )

     THEN

      BEGIN

       aktuell^.pos:=ziehe.vonpos;

      END;

       aktuell:=aktuell^.nach;

   END;

   IF (ziehe.geschlagen<>NIL)

        THEN

         BEGIN

          brett(.ziehe.nachpos.):=ziehe.geschlagen^.art*

                                 ziehe.geschlagen^.farbe;

                                 ziehe.geschlagen^.geschlagen:=false;

          ziehe.geschlagen:=NIL;

         END;

 

END;

 

FUNCTION matt (linie:STRING;farbe:SHORTINT; VAR figurenliste:Tfigurenliste):BOOLEAN;

VAR aktuell:Tfigurenliste;

    aktuellerzug,koenigszugliste:Tzugliste;

    zug:Tziehe;

    alternativen:BOOLEAN;

 

BEGIN

 matt:=true;

 alternativen:=false;

 aktuell:=figurenliste;

 koenigszugliste:=NIL;

 WHILE(aktuell <>NIL)

  DO

   BEGIN(*figurenliste*)

    IF ((aktuell^.art=ck)AND(aktuell^.farbe=farbe))THEN

     IF (attakiert(aktuell^.pos,aktuell))

       THEN

        BEGIN (*attakiert*)

        koenigszugliste:=nil;

        koenigszugliste:=generiereKoenigszuege(farbe,aktuell);

        aktuellerzug:=koenigszugliste;

        IF (aktuellerzug<>NIL)

         THEN

          BEGIN(*alternativen*)

          WHILE(aktuellerzug<>NIL)

           DO

            BEGIN

              zug.nachpos   :=aktuellerzug^.nachpos;

              zug.vonpos    :=aktuellerzug^.vonpos;

              zug.farbe     :=aktuellerzug^.farbe;

              zug.art       :=aktuellerzug^.art;

              zug.geschlagen:=aktuellerzug^.geschlagen;

 

              brettzugsetzen(brett,zug);

               IF NOT(attakiert(aktuell^.pos,aktuell))

                THEN alternativen:=true;

              brettzugzuruecknehmen(brett,zug);

             aktuellerzug:=aktuellerzug^.nach;

             END;(*ENDE ZUGLIST*)

             IF (alternativen) THEN matt:=false ELSE matt := true;

             IF (koenigszugliste<>NIL)

             THEN zugabbau(linie,farbe,koenigszugliste);

          END(*alternativen*)

          ELSE matt:=true;

        END(*IF attakiert()*)

        ELSE matt:=false;

   aktuell:=aktuell^.nach;

   END;(*figurenliste*)

 

 

 

END;(*matt*)

 

FUNCTION zaehleZugliste(zugliste:Tzugliste):INTEGER;

VAR aktuell:Tzugliste;zaehler:INTEGER;

BEGIN

 aktuell:=zugliste;zaehler:=c0;

 WHILE aktuell<>nil

 DO

 BEGIN

  zaehler:=zaehler+c1;

  aktuell:=aktuell^.nach;

 END

END;

 

FUNCTION schach(farbe:SHORTINT):BOOLEAN;

VAR aktuell:Tfigurenliste;

BEGIN

 aktuell:=figurenliste;

 WHILE (aktuell<>NIL)

 DO

 BEGIN

  IF ((aktuell^.art=ck)AND(aktuell^.farbe=farbe))

   THEN

   IF(attakiert(aktuell^.pos,aktuell)) THEN schach:=true ELSE schach:=false;

  aktuell:=aktuell^.nach;

 END

END;

 

FUNCTION alphabeta (farbe, alpha, beta, tiefe, maxTiefe: INTEGER;linie:STRING): INTEGER;

 VAR bewertung: INTEGER;

     zugliste,aktuell:Tzugliste;

     zug:Tziehe;

 

 

 BEGIN (*alphabeta*)

    IF (matt(linie,farbe,figurenliste))

    THEN

     BEGIN

      alphabeta:=(c1000+maxtiefe-tiefe)*-farbe;

     END

    ELSE

    BEGIN

    IF (tiefe = maxTiefe)

     THEN alphabeta := bewerteZug(linie,farbe)

    ELSE

    BEGIN

       zugliste:=nil;

       zugliste:= zuggenerator(farbe);

       aktuell := zugliste;

       WHILE aktuell <> NIL DO

       BEGIN

        zug.nachpos:=aktuell^.nachpos;

        zug.vonpos :=aktuell^.vonpos;

        zug.farbe  :=aktuell^.farbe;

        zug.art    :=aktuell^.art;

        zug.geschlagen:=aktuell^.geschlagen;

 

        brettZugSetzen (brett,zug);

 

        IF  (schach(farbe))

        THEN

        BEGIN

         brettZugZuruecknehmen (brett,zug);

        END

        ELSE

      BEGIN

 

        (* ANFANG nicht schach *)

        bewertung := AlphaBeta (-farbe,beta,alpha,tiefe+1,maxTiefe,linie+'-');

        IF ((farbe=cweiss)  AND(bewertung>alpha)) THEN alpha:=bewertung;

        IF ((farbe=cschwarz)AND(bewertung<alpha)) THEN alpha:=bewertung;

 

        brettZugZuruecknehmen (brett,zug);

 

 

        IF((farbe=cweiss)AND(alpha>=beta)AND(zugliste<>nil))

         THEN

          BEGIN

           IF (zugliste<>NIL)THEN  zugAbbau(linie,farbe,zugliste); zugliste:= NIL; alphabeta:= alpha; aktuell:=nil;

          END;

 

        IF((farbe=cschwarz)AND(alpha<=beta)AND(zugliste<>nil))

         THEN

          BEGIN

           IF (zugliste<>NIL)

            THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:= NIL;alphabeta:= alpha; aktuell:=nil; END;

          END;

        (* ENDE nicht schach *)

        END;

 

        IF (aktuell <>nil) THEN aktuell := aktuell^.nach;

       END;(*WHILE*)

       IF (zugliste<>NIL)

        THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:= NIL;alphabeta:= alpha; aktuell:=nil; END;

       AlphaBeta := alpha;

    END;(*ELSE bewertung*)

    END;(*ELSE MATT *)

  END;(*alphabeta*)

 

 

 

 

FUNCTION computerzug (farbe, alpha, beta, tiefe, maxTiefe: INTEGER;linie:STRING): INTEGER;

 VAR bewertung,zuglistenzaehler,schachzaehler: INTEGER;

     zugliste,aktuell:Tzugliste;

     zug,computerzieht:Tziehe;

     kannziehen:BOOLEAN;

 

 BEGIN

    kannziehen:=false;zuglistenzaehler:=c0;schachzaehler:=c0;

    IF (matt(linie,farbe,figurenliste))

    THEN

     BEGIN

      computerzug:=cmaxinteger*farbe; writeln(' matt erkannt ');

      endmatt:=true;

     END

    ELSE

    BEGIN

       (*writeln(' nicht matt ');*)

       zugliste:=nil;

       zugliste:= zuggenerator(farbe);

       zuglistenzaehler:=zaehleZugliste(zugliste);

       aktuell := zugliste;

       IF (zugliste<>NIL)THEN kannziehen:=true;

 

       zug.nachpos:=aktuell^.nachpos;

       zug.vonpos :=aktuell^.vonpos;

       zug.farbe  :=aktuell^.farbe;

       zug.art    :=aktuell^.art;

       zug.geschlagen:=aktuell^.geschlagen;

       computerzieht.nachpos:=aktuell^.nachpos;

       computerzieht.vonpos :=aktuell^.vonpos;

       computerzieht.farbe  :=aktuell^.farbe;

       computerzieht.art    :=aktuell^.art;

       computerzieht.geschlagen:=aktuell^.geschlagen;

 

       WHILE aktuell <> NIL DO

       BEGIN

 

        zug.nachpos:=aktuell^.nachpos;

        zug.vonpos :=aktuell^.vonpos;

        zug.farbe  :=aktuell^.farbe;

        zug.art    :=aktuell^.art;

        zug.geschlagen:=aktuell^.geschlagen;

 

 

        brettZugSetzen (brett,zug);

 

        IF  schach(farbe)

        THEN

        BEGIN

         brettZugZuruecknehmen (brett,zug); schachzaehler:=schachzaehler+c1;

        END

        ELSE

      BEGIN

 

        (* ANFANG nicht schach *)

 

 

        bewertung := alphabeta (-farbe,beta,alpha,tiefe+1,maxTiefe,linie+'-');

 

 

        IF ((farbe=cweiss)  AND(bewertung>alpha))

         THEN

          BEGIN

           alpha:=bewertung;

           computerzieht.nachpos:=aktuell^.nachpos;

           computerzieht.vonpos :=aktuell^.vonpos;

           computerzieht.farbe  :=aktuell^.farbe;

           computerzieht.art    :=aktuell^.art;

           computerzieht.geschlagen:=aktuell^.geschlagen;

          END;

        IF ((farbe=cschwarz)AND(bewertung<alpha))

         THEN

          BEGIN

           alpha:=bewertung;

           computerzieht.nachpos:=aktuell^.nachpos;

           computerzieht.vonpos :=aktuell^.vonpos;

           computerzieht.farbe  :=aktuell^.farbe;

           computerzieht.art    :=aktuell^.art;

           computerzieht.geschlagen:=aktuell^.geschlagen;

          END;

 

        brettZugZuruecknehmen (brett,zug);

 

         IF((farbe=cweiss)AND(alpha>=beta)AND(zugliste<>nil))

         THEN

          BEGIN

           IF (zugliste <>NIL)

            THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:=NIL;computerzug:= alpha; aktuell:=nil; END;

          END;

 

        IF((farbe=cschwarz)AND(alpha<=beta)AND(zugliste<>nil))

         THEN

          BEGIN

           IF (zugliste<>NIL)

            THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:=NIL;computerzug:= alpha; aktuell:=nil; END;

          END;

       (* ENDE nicht schach *)

        END;

 

        IF (aktuell<>NIL)THEN aktuell := aktuell^.nach;

       END;(*WHILE*)

 

 

      IF (kannziehen AND(zuglistenzaehler-schachzaehler>c0))

      THEN

      BEGIN

       write(linie,'COMPUTERZUG -> =');

 

       IF (farbe=cweiss) THEN write(' WEISS   AM ZUG ')

                         ELSE write(' SCHWARZ AM ZUG ');

       schreibePosition(computerzieht.vonpos );

       IF(computerzieht.geschlagen<>nil)

        THEN write(' SCHLAEGT NACH ') ELSE write(' NACH ');

       schreibePosition(computerzieht.nachpos);writeln;

       ComputerZugSetzen(brett,computerzieht);

       IF (zugliste<>nil)

       THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:=NIL; END;

      END(*kannziehen*)

      ELSE BEGIN writeln('die Stellung ist patt'); patt:=true; END;

       computerzug:= alpha;

      END;(*ELSE MATT*)

  END;(*computerzug*)

 

 

BEGIN (*Hauptprogramm*)

 figurenliste:=figurenListeGenerieren(figurenliste);

 endmatt:=false;patt:=false;

 clrscr;

 zeigebrett(brett);readln;clrscr;

REPEAT

   IF (NOT(endmatt)OR(patt))

    THEN

    BEGIN

     bewertung:=computerzug(cweiss,cminInteger,cmaxInteger,1,ctiefe,'-');

     writeln(bewertung,' computerzug');zeigebrett(brett);

     figuren(figurenliste);

     readln;clrscr;

    END;

   IF (NOT(endmatt)OR(patt))

   THEN

   BEGIN

    bewertung:=computerzug(cschwarz,cmaxInteger,cminInteger,1,ctiefe,'-');

    writeln(bewertung,' computerzug');zeigebrett(brett);

    figuren(figurenliste);

    readln;clrscr;

   END;

 UNTIL (endmatt OR patt);

  clrscr;writeln('matt');zeigebrett(brett);

 

 abbauFigurenListe(figurenliste);

 

END. (*Hauptprogramm*)