{$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*)