FUNCTION Muehle_zu(ad:integer; Art:tstein):boolean; (* Testet, ob eine Nuehle geschlossen wurde *) BEGIN IF (Feld.Brett[Muehlen_Nachb[ad,0]]=Art) AND (Feld.Brett[Muehlen_Nachb[ad,1]]=Art) THEN Muehle_zu:=true ELSE Muehle_zu:=(Feld.Brett[Muehlen_Nachb[ad,3]]=Art) AND (Feld.Brett[Muehlen_Nachb[ad,2]]=Art); END; PROCEDURE Zug_ermitteln(Art:tstein); (* Liefert einen Zug zurueck; Anzahl=0, falls kein Zug moeglich *) LABEL exit; VAR j:integer; PROCEDURE teste_Muehle; (* Testen, ob eine Muehle geschlossen wurde; wenn ja dann schlagbaren Stein ermitteln *) LABEL exit; BEGIN Feld.Muehle:=false; IF Muehle_zu(Feld.zu,Art) THEN BEGIN WHILE Feld.Schl_Nr<23 DO BEGIN Feld.Schl_Nr:=succ(Feld.Schl_Nr); IF Feld.Brett[Feld.Schl_Nr]=geg[Art] THEN IF NOT Muehle_zu(Feld.Schl_Nr,geg[Art]) THEN BEGIN Feld.Anzahl:=1; Feld.Muehle:=true; GOTO EXIT; END; END; END; Feld.Schl_Nr:=-1; exit: END; BEGIN (* Zug ermitteln *) WITH Feld DO BEGIN Anzahl:=0; WITH Status[Art] DO IF steine+zaehler<3 THEN GOTO exit; IF Schl_Nr>-1 THEN teste_Muehle; WHILE ((k<23) OR (L>-1)) AND (Anzahl=0) DO BEGIN IF L=-1 THEN BEGIN (* Naechsten Stein behandeln *) k:=succ(k); Schl_Nr:=-1; END; CASE Status[Art].Modus OF Setzen : IF Brett[k]=leer THEN BEGIN Anzahl:=1; zu:=k; teste_Muehle; GOTO exit; END; Ziehen : IF Brett[k]=Art THEN BEGIN WHILE L<3 DO BEGIN L:=succ(L); j:=Nachbar[k,L]; IF j<>30 THEN IF Brett[j]=leer THEN BEGIN Anzahl:=1; von:=k; zu:=j; Brett[k]:=leer; teste_Muehle; Brett[k]:=Art; GOTO exit; END; END; (* while *) L:=-1; (* alle R1chtungen durch *) END; Springen: IF Brett[k]=Art THEN BEGIN WHILE L<23 DO BEGIN L:=succ(L); IF Brett[L]=leer THEN BEGIN Anzahl:=1; von:=k; zu:=L; Brett[k]:=leer; teste_Muehle; Brett[k]:=Art; GOTO exit; END; END; L:=-1; END; END; (* case *) END; (* while *) END; (* with *) exit: END; PROCEDURE mache_Zug(Stein:tstein; show:boolean); (* Zug ausfuehren und gegebenenfalls auf dem Spielbrett anzeigen *) PROCEDURE setze_Stein(ad:integer; Stein:tstein); VAR X,Y,z : integer; BEGIN IF show THEN BEGIN X:=ord(posit[ad][1])-ord('A'); Y:=ord(posit[ad][2])-ord('1'); gotoxy(20+X*4,5+Y*2); write(steine[Stein]); gotoxy(20+X*4,5+Y*2); delay(300); FOR z:=1 TO 3 DO BEGIN write(steine[Feld.Brett[ad]]); gotoxy(20+X*4,5+Y*2); delay(300); write(steine[Stein]); gotoxy(20+X*4,5+Y*2); delay(300); END; END; Feld.Brett[ad]:=Stein; END; BEGIN (* mache_Zug *) WITH Feld DO BEGIN CASE Status[Stein].Modus OF Setzen : BEGIN WITH Status[Stein] DO BEGIN steine:=succ(steine); zaehler:=pred(zaehler); IF zaehler=0 THEN Modus:=Ziehen; END; END; Springen, Ziehen : setze_Stein(von,leer); END; setze_Stein(zu,Stein); IF Muehle THEN WITH Status[geg[Stein]] DO BEGIN setze_Stein(Schl_Nr,leer); steine:=pred(steine); IF (steine=3) AND (zaehler=0) THEN Modus:=Springen; IF show THEN IF steine+zaehler<3 THEN verloren(geg[Stein]); END; END; END;