{***************************************************************************} {* Der Zuglisten-Generator *} {***************************************************************************} PROCEDURE GenZugListe(VAR SF: Spielfeld; AnDerReihe:Spieler; VAR ZL: ZugListe); TYPE Richtung = -1..1; VAR erlaubt: boolean; i, j : Richtung; S, Z : 1..maxzahl; e : boolean; PROCEDURE Sort(VAR ZL: ZugListe); {einfaches Sortieren durch Auswahl} VAR i,j,m: byte; t: Zug; FUNCTION kleiner(X,Y:Zug):boolean; FUNCTION d(w:byte):byte; BEGIN IF (w=1) OR (w=Groesse) THEN d:=1 ELSE d:=0 END; BEGIN {kleiner} kleiner:=(d(X.Spalte)+d(X.Zeile))>(d(Y.Spalte)+d(Y.Zeile)) END; {kleiner} BEGIN {Sort} WITH ZL DO FOR i:=1 TO Anzahl-1 DO BEGIN m:=i; FOR j:=i+1 TO Anzahl DO IF kleiner(Zuege[j],Zuege[m]) THEN m:=j; IF m<>i THEN BEGIN t:=Zuege[i]; Zuege[i]:=Zuege[m]; Zuege[m]:=t END END END; PROCEDURE check(rx, ry: Richtung; SX, SY: byte); VAR x,y,s,z: byte; geg: boolean; BEGIN x:=SX; y:=SY; REPEAT x:=x+rx; y:=y+ry; e:=(x>0) AND (x<=Groesse) AND (y>0) AND (y<=Groesse); IF e THEN geg:=(SF[x,y]<>Gegner[AnderReihe]) UNTIL NOT(e) OR geg; IF NOT(geg) OR NOT(e) THEN exit; s:=x; z:=y; IF (S>0) AND (S<=Groesse) THEN IF (Z>0) AND (Z<=Groesse) THEN IF SF[S,Z]=AnDerReihe THEN BEGIN SX:=SX+rx; SY:=SY+ry; IF (SX<>S) OR (SY<>Z) THEN erlaubt:=true; END END; {check} BEGIN {GenZugListe} WITH ZL DO BEGIN Anzahl:=0; FOR S:=1 TO Groesse DO FOR Z:=1 TO Groesse DO IF SF[S,Z]=leer THEN BEGIN erlaubt:=false; FOR i:=-1 TO 1 DO FOR j:=-1 TO 1 DO IF (i<>0) OR (j<>0) THEN check(i,j,S,Z); IF erlaubt THEN BEGIN Anzahl:=succ(Anzahl); WITH Zuege[Anzahl] DO BEGIN Spalte:=S; Zeile:=Z END END END END; KannNicht[AnDerReihe]:=ZL.Anzahl=0; Sort(ZL) END;