Inhalt
Aktueller Ordner:
pascalCHESSTEG.PAS
(*************************************************************************)
(*************************************************************************)
{$M 65520, 80000, 655360}
PROGRAM chessteg (INPUT,OUTPUT);
(****************************************************************)
(* (c) 1994 1995 Paul Koop chessteg didaktisches Schachprogramm *)
(* das didaktische Schachprogramm chessteg wurde *)
(* urspruenglisch 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 *)
(* *)
(* mit enpassant als bewerterer Zug innerhalb Suchbaum *)
(* Bauernumwandlung in Dame, Turm, Springer oder Laeufer *)
(* nach umwandlungsfaehigem Bauernzug wird separat bewertet und *)
(* umgewandelt in Dame, Turm, Springer oder Laeufer *)
(* Rochade als Figurenumstellung an Stelle von bewertetem Zug *)
(* 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;
cb = 1;
cl = 4;
cs = 3;
ct = 5;
cd = 9;
ck = 99;
dumy = 100;
leer = 0;
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:INTEGER;
figurenliste :Tfigurenliste;
endmatt,patt,rochiertweiss,rochiertschwarz:BOOLEAN;
(* Funktionen *)
PROCEDURE schreibeBrettFigur(f:SHORTINT);
BEGIN
CASE f OF
cb: write('^');
cl: write('&');
cs: write('#');
ct: write('T');
cd: write('�');
ck: write('$');
ELSE write('.');
END;
END;
PROCEDURE zeigebrett2(VAR brett:Tbrett);
VAR i:INTEGER;
BEGIN
textcolor(white);
writeln('_ABCDEFGH_');
write('8'); for i:=91 TO 98 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('8');writeln;
write('7'); for i:=81 TO 88 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('7');writeln;
write('6'); for i:=71 TO 78 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('6');writeln;
write('5'); for i:=61 TO 68 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('5');writeln;
write('4'); for i:=51 TO 58 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('4');writeln;
write('3'); for i:=41 TO 48 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('3');writeln;
write('2'); for i:=31 TO 38 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('2');writeln;
write('1'); for i:=21 TO 28 DO
BEGIN IF (brett(.i.)<c0) THEN textcolor (red); schreibeBrettFigur(abs(brett(.i.))); textcolor (white); END; write('1');writeln;
writeln('_ABCDEFGH_');
END;
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
cb:write('Weisser Bauer');
cl:write('Weisser Laeufer');
cs:write('Weisser Springer');
ct:write('Weisser Turm ');
cd:write('Weisse Dame ');
ck:write('Weisser Koenig ');
-cb:write('Schwarzer Bauer');
-cl:write('Schwarzer Laeufer');
-cs:write('Schwarzer Springer');
-ct:write('Schwarzer Turm ');
-cd:write('Schwarze Dame ');
-ck:write('Schwarzer Koenig ');
ELSE
write('fehler bei art ');
END;
END;
FUNCTION figurenListeGenerieren():Tfigurenliste;
VAR neuefigur,aktuell,wurzel:Tfigurenliste;
BEGIN
(*Die beiden Koenige immer verwenden und nie veraendern oder ersetzen auch Reihenfolge nicht*)
(*niemals Koenige als Vorlage kopieren *)
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:=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;
(* hier folgen alle anderen Figuren *)
(*-------------------------------------------------------------------*)
(* -------------------DAMEN----------------------------------------- *)
(* schwarz ----------------------------------------------------------*)
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;
(* weiss ------------------------------------------------------------*)
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;
(*-------------------------------------------------------------------*)
(* -------------------TUERME---------------------------------------- *)
(* schwarz ----------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=ct;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=A8;brett(.A8.):=ct*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:=H8;brett(.H8.):=ct*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(* weiss ------------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=ct;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=H1;brett(.H1.):=ct*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=ct;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=A1;brett(.A1.):=ct*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(*-------------------------------------------------------------------*)
(* -------------------SPRINGER-------------------------------------- *)
(* schwarz ----------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=cs;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=B8;brett(.B8.):=cs*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cs;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=G8;brett(.G8.):=cs*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(* weiss ------------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=cs;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=B1;brett(.B1.):=cs*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cs;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=G1;brett(.G1.):=cs*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(*-------------------------------------------------------------------*)
(*-------------------------------------------------------------------*)
(* --------------------LAEUFER-------------------------------------- *)
(* schwarz ----------------------------------------------------------*)
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:=cl;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=F8;brett(.F8.):=cl*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(* weiss ------------------------------------------------------------*)
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:=cweiss;
neuefigur^.pos:=F1;brett(.F1.):=cl*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(*-------------------------------------------------------------------*)
(* -------------------BAUERN---------------------------mm----------- *)
(* schwarz ----------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=A7;brett(.A7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=B7;brett(.B7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=C7;brett(.C7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=D7;brett(.D7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=E7;brett(.E7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=F7;brett(.F7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=G7;brett(.G7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cschwarz;
neuefigur^.pos:=H7;brett(.H7.):=cb*cschwarz;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(* weiss ------------------------------------------------------------*)
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=A2;brett(.A2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=B2;brett(.B2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=C2;brett(.C2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=D2;brett(.D2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=E2;brett(.E2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=F2;brett(.F2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=G2;brett(.G2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
new(neuefigur);
neuefigur^.art:=cb;neuefigur^.farbe:=cweiss;
neuefigur^.pos:=H2;brett(.H2.):=cb*cweiss;
neuefigur^.geschlagen:=false;
neuefigur^.nach:=nil;
neuefigur^.vor:=aktuell;
aktuell^.nach:=neuefigur;
aktuell:= neuefigur;
(*-------------------------------------------------------------------*)
(* RUECKGABE der Liste nie veraendern --------------------mmmmm---- *)
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:Tfigurenliste;
BEGIN
aktuell:=figurenliste;
WHILE (aktuell<>nil)
DO
BEGIN
IF ((aktuell^.pos=feld)AND(aktuell^.geschlagen=false))
THEN BEGIN geschlagenefigur:=aktuell;exit; END;
aktuell:=aktuell^.nach;
END;
geschlagenefigur:=aktuell;
END;
FUNCTION generiereTurmzuege(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(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(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:BOOLEAN;
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: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;
FUNCTION vonBauerBedroht(feld,richtung:SHORTINT):BOOLEAN;
VAR attacke:BOOLEAN;
testfeld:SHORTINT;
BEGIN
attacke:=false;
testfeld:=feld+richtung;
if (
(aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=cb)
OR
(aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-cb)
)
THEN BEGIN attacke:=true;END;
vonBauerBedroht:=attacke;
END;
FUNCTION vonSpringerBedroht(feld,richtung:SHORTINT):BOOLEAN;
VAR attacke:BOOLEAN;
testfeld:SHORTINT;
BEGIN
attacke:=false;
testfeld:=feld+richtung;
if (
(aktuellefigur^.farbe<c0)AND(brett(.testfeld.)=cs)
OR
(aktuellefigur^.farbe>c0)AND(brett(.testfeld.)=-cs)
)
THEN BEGIN attacke:=true;END;
vonSpringerBedroht:=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;
attacke:=vonSpringerBedroht(feld,auf+auf+links);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,auf+auf+rechts);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,ab+ab+rechts);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,ab+ab+links);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,links+links+auf);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,links+links+ab);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,rechts+rechts+auf);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonSpringerBedroht(feld,rechts+rechts+ab);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonBauerBedroht(feld,auf*aktuellefigur^.farbe+links);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attacke:=vonBauerBedroht(feld,auf*aktuellefigur^.farbe+rechts);
IF attacke THEN BEGIN attakiert:=attacke; exit; END;
attakiert:=attacke;
END;
FUNCTION generiereKoenigszuege(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 generiereSpringerzuege(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 (* generiegrespringerzuege() *)
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)
)
)
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:=cs;
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+auf+links);
zieheNach(auf+auf+rechts);
zieheNach(ab+ab+rechts);
zieheNach(ab+ab+links);
zieheNach(links+links+ab);
zieheNach(links+links+auf);
zieheNach(rechts+rechts+auf);
zieheNach(rechts+rechts+ab);
generiereSpringerzuege:= wurzel;
END;
FUNCTION generiereBauernzuege(farbe:SHORTINT;VAR aktuellefigur:Tfigurenliste;letzterzug:Tziehe):Tzugliste;
CONST
auf = 10;
links = -1;
rechts= +1;
VAR feld:BYTE;
neu,wurzel,aktuell:Tzugliste;
PROCEDURE schlageNach(neupos:SHORTINT);
BEGIN (* generierebauerenzuege() *)
feld:=aktuellefigur^.pos+neupos;
IF (
NOT
(
((aktuellefigur^.farbe=cweiss)AND(brett(.feld.)>c0))
OR
((aktuellefigur^.farbe=cschwarz)AND(brett(.feld.)<c0))
OR
(brett(.feld.)=leer)
OR
(brett(.feld.)=dumy)
)
)(*Ende Not*)
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:=cb;
neu^.geschlagen:=geschlagenefigur(feld);
END;(*Ende IF NOT THEN normaler Schlag*)
IF (
(feld+(auf*-farbe)=letzterzug.nachpos)
AND
(letzterzug.art=cb)
AND
(letzterzug.farbe=-farbe)
AND
(brett(.feld.)=leer)
AND
(brett(.feld+(auf*-farbe).)=(cb*farbe))
)
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:=cb;
neu^.geschlagen:=geschlagenefigur(letzterzug.nachpos);
END;(*Ende IF NOT THEN enpassant Schlag*)
END;(* ENDE schlageNach*)
PROCEDURE zieheEinFeldNach(neupos:SHORTINT);
BEGIN (* generierebauerenzuege() *)
feld:=aktuellefigur^.pos+neupos;
IF(brett(.feld.)=leer)
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:=cb;
END;(* ENDE zieheEinFeldNach*)
END;
PROCEDURE zieheEinfachUndDoppelt(neupos:SHORTINT);
VAR suchende:BOOLEAN; zaehler:BYTE;
BEGIN
suchende:=false; zaehler:=c0;
feld:=aktuellefigur^.pos+neupos;
IF (
( (brett(.feld.)<>leer))
OR (brett(.feld.)=dumy)
)
THEN suchende:=true;
WHILE ((brett(.feld.)=leer)AND(NOT(suchende))AND (zaehler<2))
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:=cb;
zaehler:=zaehler+1;
feld:=feld+neupos;
IF (
( (brett(.feld.)<>leer))
OR(brett(.feld.)=dumy)
) THEN suchende:=true;
END; (*WHILE*)
END; (*zieheEinfachUndDoppelt*)
BEGIN (*Ausfuehrung generiereBauernzuege*)
neu:=nil;aktuell:=nil;wurzel:=nil;
IF (
(
(farbe=cweiss)
AND
(aktuellefigur^.pos<=H2)
)
OR
(
(aktuellefigur^.pos>=A7)AND(aktuellefigur^.pos<=H7)
AND
(farbe=cschwarz)
)
)
THEN
zieheEinfachUndDoppelt(auf*farbe)
ELSE zieheEinFeldNach(auf*farbe);
schlageNach((auf*farbe)+rechts);
schlageNach((auf*farbe)+links);
generiereBauernzuege:= wurzel;
END; (*generiereBauernzuege*)
FUNCTION zuggenerator (farbe:INTEGER;letzterzug:Tziehe):Tzugliste;
VAR neugeneriert,neu,wurzel:Tzugliste;
aktuell:Tfigurenliste;
BEGIN
neugeneriert:=nil;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
cb:
BEGIN
neugeneriert:=generiereBauernzuege(farbe,aktuell,letzterzug);
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu;
END;
END;
cl:
BEGIN
neugeneriert:=generiereLaeuferzuege(aktuell);
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu
END;
END;
cs:
BEGIN
neugeneriert:=generiereSpringerzuege(aktuell);
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu
END;
END;
ct:
BEGIN
neugeneriert:=generiereTurmzuege(aktuell);;
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu
END;
END;
cd:
BEGIN
neugeneriert:=generiereDamezuege(aktuell);
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu
END;
END;
ck:
BEGIN
neugeneriert:=generiereKoenigszuege(aktuell);
IF(neugeneriert<>nil) THEN
IF (neu=nil)
THEN
BEGIN
neu := neugeneriert;
wurzel := neu;
END
ELSE
BEGIN
neu^.nach := neugeneriert;
neu^.nach^.vor := neu
END;
END;
ELSE
BEGIN writeln ('zuggeneratorFehler aktuell^.art ',aktuell^.art,' aktuell^.farbe ',aktuell^.farbe,' aktuell^.pos',aktuell^.pos); readln; END
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 ():INTEGER;
Var wert:INTEGER;
feld:BYTE;
aktuell:Tfigurenliste;
suchende:BOOLEAN;
CONST auf = 10;
ab =-10;
links = -1;
rechts= +1;
FUNCTION zaehleFigurenliste(figurenliste:Tfigurenliste):INTEGER;
VAR aktuell:Tfigurenliste;zaehler:INTEGER;
BEGIN
aktuell:=figurenliste;zaehler:=c0;
WHILE aktuell<>nil
DO
BEGIN
IF NOT aktuell^.geschlagen THEN zaehler:=zaehler+c1;
aktuell:=aktuell^.nach;
END;
zaehleFigurenliste:=zaehler;
END;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
feld:=feld+ab+links;
IF(brett(.feld.)=dumy) THEN suchende:=true;
END;
suchende:=false;
feld:=aktuell^.pos+auf;
WHILE(
(
(brett(.feld.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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.)<>dumy)
)
AND(NOT(suchende))
)
DO
BEGIN
wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF(brett(.feld.)<>c0) THEN suchende:=true;
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);
IF (
((brett(.feld+auf.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf.)<>dumy))
OR
((brett(.feld+auf.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+auf.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+auf+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf+rechts.)<>dumy))
OR
((brett(.feld+auf+rechts.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+auf+rechts.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+auf+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf+links.)<>dumy))
OR
((brett(.feld+auf+links.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+auf+links.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+links.)<>dumy))
OR
((brett(.feld+links.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+links.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+rechts.)<>dumy))
OR
((brett(.feld+rechts.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+rechts.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+ab+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+ab+links.)<>dumy))
OR
((brett(.feld+ab+links.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+ab+links.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+ab+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+ab+rechts.)<>dumy))
OR
((brett(.feld+ab+rechts.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+ab+rechts.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+ab.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+ab.)<>dumy))
OR
((brett(.feld+ab.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+ab.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*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*)
IF ((NOT(aktuell^.geschlagen))AND(aktuell^.art=cs))
THEN
BEGIN (*SPRINGERBEWERTUNG*)
wert:= wert+(aktuell^.art*aktuell^.farbe);
(* umgebung Springer *)
IF (
((brett(.feld+auf+auf+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf+auf+rechts.)<>dumy))
OR
((brett(.feld+auf+auf+rechts.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+auf+auf+rechts.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe); //3 irrational 1 besser
IF (
((brett(.feld+auf+auf+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf+auf+links.)<>dumy))
OR
((brett(.feld+auf+auf+links.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+auf+auf+links.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+ab+ab+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+ab+ab+rechts.)<>dumy))
OR
((brett(.feld+ab+ab+rechts.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+ab+ab+rechts.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+ab+ab+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+ab+ab+links.)<>dumy))
OR
((brett(.feld+ab+ab+links.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+ab+ab+links.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+links+links+auf.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+links+links+auf.)<>dumy))
OR
((brett(.feld+links+links+auf.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+links+links+auf.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+links+links+ab.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+links+links+ab.)<>dumy))
OR
((brett(.feld+links+links+ab.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+links+links+ab.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+rechts+rechts+auf.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+rechts+rechts+auf.)<>dumy))
OR
((brett(.feld+rechts+rechts+auf.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+rechts+rechts+auf.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+rechts+rechts+ab.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+rechts+rechts+ab.)<>dumy))
OR
((brett(.feld+rechts+rechts+ab.)>c0)AND(aktuell^.farbe<c0))
OR
(brett(.feld+rechts+rechts+ab.)=leer)
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
END;(*Springerbewertung*)
IF ((NOT(aktuell^.geschlagen))AND(aktuell^.art=cb))
THEN
BEGIN (*BauernBEWERTUNG*)
wert:= wert+(aktuell^.art*aktuell^.farbe);
IF (
(brett(.feld+auf*aktuell^.farbe.)=leer)
)
THEN
BEGIN
wert:=wert+(1*aktuell^.farbe);
IF (brett(.feld.)>=A7) AND (brett(.feld.)<=H7) AND (brett(.feld+(auf+auf)*aktuell^.farbe.)=leer) AND (aktuell^.farbe=cschwarz) THEN wert:= wert+(aktuell^.art*aktuell^.farbe);
IF (brett(.feld.)<=H2) AND (brett(.feld+(auf+auf)*aktuell^.farbe.)=leer) AND (aktuell^.farbe=cweiss ) THEN wert:= wert+(aktuell^.art*aktuell^.farbe);
END;
IF (
((brett(.feld+auf*aktuell^.farbe+rechts.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf*aktuell^.farbe+rechts.)<>dumy))
OR
((brett(.feld+auf*aktuell^.farbe+rechts.)>c0)AND(aktuell^.farbe<c0))
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (
((brett(.feld+auf*aktuell^.farbe+links.)<c0)AND(aktuell^.farbe>c0)AND(brett(.feld+auf*aktuell^.farbe+links.)<>dumy))
OR
((brett(.feld+auf*aktuell^.farbe+links.)>c0)AND(aktuell^.farbe<c0))
)
THEN wert:=wert+(1*aktuell^.farbe)+ABS(brett(.feld.))*1*(aktuell^.farbe);
IF (brett(.feld+(10*aktuell^.farbe).)=dumy)THEN wert:=wert+((cd+cs+cl)*aktuell^.farbe);
IF (aktuell^.farbe = cweiss)
THEN wert:=wert+(aktuell^.pos DIV 10)
ELSE wert:=wert+(-1*(10-(aktuell^.pos DIV 10)));
END;(*Bauernbewertung*)
(* Zentrumsbewertung f�r alle Figuren zus�tzlich zu Beginn des Spiels *)
IF zaehleFigurenliste(figurenliste) >15 THEN
wert:=wert +(
(
(5-ABS(5-(aktuell^.pos MOD 10)))
+
(5-ABS(5-(aktuell^.pos DIV 10)))
)*aktuell^.farbe
);
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.geschlagen^.pos.):=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:=zuggenerator(farbe,zug); // Parameter Zug wird hier nicht benoetigt ist indefiniert uebergeben da im Spiel fuer en passant genutzt
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;
zaehleZugliste:=zaehler;
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;letzterzug:Tziehe): 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()
ELSE
BEGIN
zugliste:=nil;
zugliste:= zuggenerator(farbe,letzterzug);
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+'-',letzterzug);
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*)
PROCEDURE bauernumwandlung(farbe:SHORTINT;VAR figurenliste:Tfigurenliste;letzterBauernzug:Tziehe);
VAR
aktuellefigur:Tfigurenliste;
bewertungcs,bewertungcl,bewertungcd,bewertungct:Integer;
umgewandeltIn:Byte;
BEGIN
aktuellefigur:=figurenliste;
WHILE ((aktuellefigur^.pos<>letzterBauernzug.nachpos)AND (aktuellefigur<> NIL))
DO
BEGIN
aktuellefigur:=aktuellefigur^.nach;
END;
IF aktuellefigur<>NIL
THEN
BEGIN
aktuellefigur^.art:=cs;brett(.aktuellefigur^.pos.):=cs*farbe;
bewertungcs := AlphaBeta (-farbe,-farbe*cmaxInteger,-farbe*cminInteger,1,1,'-',letzterBauernzug);
umgewandeltIn :=bewertungcs;
aktuellefigur^.art:=cl;brett(.aktuellefigur^.pos.):=cl*farbe;
bewertungcl := AlphaBeta (-farbe,-farbe*cmaxInteger,-farbe*cminInteger,1,1,'-',letzterBauernzug);
aktuellefigur^.art:=cd;brett(.aktuellefigur^.pos.):=cd*farbe;
bewertungcd := AlphaBeta (-farbe,-farbe*cmaxInteger,-farbe*cminInteger,1,1,'-',letzterBauernzug);
aktuellefigur^.art:=ct;brett(.aktuellefigur^.pos.):=ct*farbe;
bewertungct := AlphaBeta (-farbe,-farbe*cmaxInteger,-farbe*cminInteger,1,1,'-',letzterBauernzug);
IF (farbe=cweiss)
THEN
BEGIN
IF bewertungcl >= bewertungcs
THEN
BEGIN
aktuellefigur^.art:=cl;brett(.aktuellefigur^.pos.):=cl*farbe;
umgewandeltIn:=bewertungcl;
END;
IF bewertungcd >= bewertungcl
THEN
BEGIN
aktuellefigur^.art:=cd;brett(.aktuellefigur^.pos.):=cd*farbe;
umgewandeltIn:=bewertungcd;
END;
IF bewertungct >= bewertungcd
THEN
BEGIN
aktuellefigur^.art:=ct;brett(.aktuellefigur^.pos.):=ct*farbe;
umgewandeltIn:=bewertungct;
END;
END
ELSE (*farbe=cschwarz*)
BEGIN
IF bewertungcl <= bewertungcs
THEN
BEGIN
aktuellefigur^.art:=cl;brett(.aktuellefigur^.pos.):=cl*farbe;
umgewandeltIn:=bewertungcl;
END;
IF bewertungcd <= bewertungcl
THEN
BEGIN
aktuellefigur^.art:=cd;brett(.aktuellefigur^.pos.):=cd*farbe;
umgewandeltIn:=bewertungcd;
END;
IF bewertungct <= bewertungcd
THEN
BEGIN
aktuellefigur^.art:=ct;brett(.aktuellefigur^.pos.):=ct*farbe;
umgewandeltIn:=bewertungct;
END;
END
END
ELSE write(' umgewandelt in Fehler');
write(' umgewandelt in '); schreibeFigur(umgewandeltIn);
END;
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,zug); // Paramter zug beim ersten Zug undefiniert
zuglistenzaehler:=zaehleZugliste(zugliste);
aktuell := zugliste;
IF (zugliste<>NIL)THEN
BEGIN
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;
END;
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+'-',zug);
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 ');
schreibeFigur (computerzieht.art*computerzieht.farbe);write(' ');schreibePosition(computerzieht.vonpos );
IF(computerzieht.geschlagen<>nil)
THEN write(' SCHLAEGT NACH ') ELSE write(' NACH ');
schreibePosition(computerzieht.nachpos);writeln;
ComputerZugSetzen(brett,computerzieht);
(*Damenumwandlung---------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
IF ((computerzieht.art=cb)AND((brett(.computerzieht.nachpos+(10*computerzieht.farbe).)=dumy)))THEN bauernumwandlung(computerzieht.farbe,figurenliste,computerzieht);
IF (zugliste<>nil)
THEN BEGIN zugAbbau(linie,farbe,zugliste); zugliste:=NIL; END;
END(*kannziehen*)
ELSE BEGIN writeln ('kannziehen ',kannziehen,' zuglistenzaehler ',zuglistenzaehler,' schachzaehler ',schachzaehler); writeln('die Stellung ist patt'); patt:=true; END;
computerzug:= alpha;
END;(*ELSE MATT*)
END;(*computerzug*)
PROCEDURE kleinerochade(figurenliste:Tfigurenliste;farbe:SHORTINT);
VAR aktuell:Tfigurenliste;
zaehler,Ex,Fx,Gx,Hx:BYTE;
CONST
rechts= +1;
BEGIN
aktuell:=figurenliste;
zaehler:=c0;
IF farbe=cschwarz
THEN
BEGIN
Ex:=E8;Hx:=H8;Fx:=F8;Gx:=G8;
END
ELSE
BEGIN
Ex:=E1;Hx:=H1;Fx:=F1;Gx:=G1;
END;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
IF NOT(attakiert(aktuell^.pos,aktuell)) THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+rechts,aktuell)) AND (brett(.Fx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+rechts+rechts,aktuell)) AND (brett(.Gx.)=leer))
THEN zaehler:=zaehler+1;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Hx)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
IF NOT(attakiert(aktuell^.pos,aktuell))
THEN zaehler:=zaehler+1;
aktuell:=aktuell^.nach;
END;
IF zaehler=4
THEN
BEGIN
aktuell:=figurenliste;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
aktuell^.pos:=Gx;brett(.Gx.):=ck*farbe;brett(.Ex.):=leer;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Hx)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
aktuell^.pos:=Fx;brett(.Fx.):=ct*farbe;brett(.Hx.):=leer;
END;
aktuell:=aktuell^.nach;
END;
END;
IF farbe=cweiss Then rochiertweiss:=true ELSE rochiertschwarz := true;
END;
FUNCTION kleinerochademoeglich(figurenliste:Tfigurenliste;farbe:SHORTINT):BOOLEAN;
VAR aktuell:Tfigurenliste;
zaehler,Ex,Fx,Gx,Hx:BYTE;
CONST rechts= +1;
BEGIN
aktuell:=figurenliste;
zaehler:=c0;
IF farbe=cschwarz
THEN
BEGIN
Ex:=E8;Hx:=H8;Fx:=F8;Gx:=G8;
END
ELSE
BEGIN
Ex:=E1;Hx:=H1;Fx:=F1;Gx:=G1;
END;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
IF NOT(attakiert(aktuell^.pos,aktuell)) THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+rechts,aktuell)) AND (brett(.Fx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+rechts+rechts,aktuell)) AND (brett(.Gx.)=leer))
THEN zaehler:=zaehler+1;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Hx)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
IF NOT(attakiert(aktuell^.pos,aktuell))
THEN zaehler:=zaehler+1;
aktuell:=aktuell^.nach;
END;
IF zaehler=4
THEN
kleinerochademoeglich:=true ELSE kleinerochademoeglich:=false;
END;
PROCEDURE grosserochade(figurenliste:Tfigurenliste;farbe:SHORTINT);
VAR aktuell:Tfigurenliste;
zaehler,Ax,Bx,Cx,Dx, Ex:BYTE;
CONST links = -1;
BEGIN
aktuell:=figurenliste;
zaehler:=c0;
IF farbe=cschwarz
THEN
BEGIN
Ax:=A8;Bx:=B8;Cx:=C8;Dx:=D8; Ex:=E8;
END
ELSE
BEGIN
Ax:=A1;Bx:=B1;Cx:=C1;Dx:=D1; Ex:=E1;
END;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
IF NOT(attakiert(aktuell^.pos,aktuell)) THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links,aktuell)) AND (brett(.Dx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links+links,aktuell)) AND (brett(.Cx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links+links+links,aktuell)) AND (brett(.Bx.)=leer))
THEN zaehler:=zaehler+1;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Ax)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
IF NOT(attakiert(aktuell^.pos,aktuell))
THEN zaehler:=zaehler+1;
aktuell:=aktuell^.nach;
END;
IF zaehler=5
THEN
BEGIN
aktuell:=figurenliste;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
aktuell^.pos:=Bx;brett(.Bx.):=ck*farbe;brett(.Ex.):=leer;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Ax)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
aktuell^.pos:=Cx;brett(.Cx.):=ct*farbe;brett(.Ax.):=leer;
END;
aktuell:=aktuell^.nach;
END;
END;
IF farbe=cweiss Then rochiertweiss:=true ELSE rochiertschwarz := true;
END;
FUNCTION grosserochademoeglich(figurenliste:Tfigurenliste;farbe:SHORTINT):BOOLEAN;
VAR aktuell:Tfigurenliste;
zaehler,Ax,Bx,Cx,Dx, Ex:BYTE;
CONST links = -1;
BEGIN
aktuell:=figurenliste;
zaehler:=c0;
IF farbe=cschwarz
THEN
BEGIN
Ax:=A8;Bx:=B8;Cx:=C8;Dx:=D8; Ex:=E8;
END
ELSE
BEGIN
Ax:=A1;Bx:=B1;Cx:=C1;Dx:=D1; Ex:=E1;
END;
WHILE (aktuell<>NIL)
DO
BEGIN
IF ((aktuell^.art=ck)AND (aktuell^.pos=Ex)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
BEGIN
IF NOT(attakiert(aktuell^.pos,aktuell)) THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links,aktuell)) AND (brett(.Dx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links+links,aktuell)) AND (brett(.Cx.)=leer))
THEN zaehler:=zaehler+1;
IF (NOT(attakiert(aktuell^.pos+links+links+links,aktuell)) AND (brett(.Bx.)=leer))
THEN zaehler:=zaehler+1;
END;
IF ((aktuell^.art=ct)AND (aktuell^.pos=Ax)AND (aktuell^.farbe=farbe)AND (aktuell^.geschlagen=false))
THEN
IF NOT(attakiert(aktuell^.pos,aktuell))
THEN zaehler:=zaehler+1;
aktuell:=aktuell^.nach;
END;
IF zaehler=5
THEN
grosserochademoeglich:=true ELSE grosserochademoeglich:=false;
END;
BEGIN (*Hauptprogramm*)
figurenliste:=figurenListeGenerieren();
endmatt:=false;patt:=false; rochiertweiss:=false;rochiertschwarz:=false;
clrscr;
zeigebrett(brett);(*figuren(figurenliste)*);readln;clrscr;
REPEAT
IF (NOT(endmatt)OR(patt))
THEN
BEGIN
IF (kleinerochademoeglich(figurenliste,cweiss) OR grosserochademoeglich(figurenliste,cweiss)) AND(NOT rochiertweiss)
THEN
BEGIN
IF kleinerochademoeglich(figurenliste,cweiss)
THEN
BEGIN
writeln(' Kleine Rochade Weiss');
kleinerochade(figurenliste,cweiss);
zeigebrett(brett);
(*figuren(figurenliste); *)
readln;clrscr;
END
ELSE
BEGIN
writeln(' Grosse Rochade Weiss');
grosserochade(figurenliste,cweiss);
zeigebrett(brett);
(*figuren(figurenliste); *)
readln;clrscr;
END
END
ELSE
BEGIN
bewertung:=computerzug(cweiss,cminInteger,cmaxInteger,1,ctiefe,'-');
writeln(bewertung,' computerzug');zeigebrett(brett);
(*figuren(figurenliste);*)
readln;clrscr;
END;
END;
IF (NOT(endmatt)OR(patt))
THEN
BEGIN
IF (kleinerochademoeglich(figurenliste,cschwarz) OR grosserochademoeglich(figurenliste,cschwarz)) AND(NOT rochiertschwarz)
THEN
BEGIN
IF kleinerochademoeglich(figurenliste,cschwarz)
THEN
BEGIN
writeln(bewertung,' Kleine Rochade Schwarz');
kleinerochade(figurenliste,cschwarz);
zeigebrett(brett);
(*figuren(figurenliste);*)
readln;clrscr;
END
ELSE
BEGIN
writeln(bewertung,' Grosse Rochade Schwarz');
grosserochade(figurenliste,cschwarz);
zeigebrett(brett);
(*figuren(figurenliste);*)
readln;clrscr;
END
END
ELSE
BEGIN
bewertung:=computerzug(cschwarz,cmaxInteger,cminInteger,1,ctiefe,'-');
writeln(bewertung,' computerzug');zeigebrett(brett);
(*figuren(figurenliste);*)
readln;clrscr;
END;
END;
UNTIL (endmatt OR patt);
clrscr;writeln('Spiel beendet');zeigebrett(brett);
abbauFigurenListe(figurenliste);
END. (*Hauptprogramm*)