(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: Schach: Überprüfung, ob Zug erlaubt
6. Jun 2005, 14:43
Versuch doch auch mal Folgendes;
Es gibt ja für die Figuren verschiedene Zugmöglichkeiten, also z.B:
Delphi-Quellcode:
Const
ccXfwd : Array [0..7] Of TPoint= ( (1,0),.... ( 8,0) );
ccXbwd : Array [0..7] Of TPoint= ( (-1,0),.... (-8,0) );
ccYfwd : Array [0..7] Of TPoint ( (0,1) .... (0,8) );
ccYbwd : Array [0..7] Of TPoint ( (0,-1) .... (0,-8) );
ccKnight : Array [0..7] Of TPoint = ( (2,1),(1,2),(-1,2),(-2,1),(1,-2),(2,-1), (-2,-1), (-1,-2));
// Das gleiche noch für die Diagonalen (ccUL, ccDL, ccUR, ccDR für Up/Down Left/Right);
Procedure CheckMove (aFigur : TSchachFigur; aPosition : TPoint; aBrett : TSchachBrett);
Begin
Case aFigure of
Springer : CheckIt (aPosition, ccKnight, False );
Turm : Begin
Checkit (aPosition, ccXfwd, True);
Checkit (aPosition, ccXbwd, True);
Checkit (aPosition, ccYfwd, True);
Checkit (aPosition, ccYbwd, True);
End;
Dame : Begin
Checkit (aPosition, ccXfwd, True);
Checkit (aPosition, ccXbwd, True);
Checkit (aPosition, ccYfwd, True);
Checkit (aPosition, ccYbwd, True);
Checkit (aPosition, ccUL, True);
Checkit (aPosition, ccUR, True);
Checkit (aPosition, ccDL, True);
Checkit (aPosition, ccDR, True);
End;
Läufer : Begin ... nur die ccUL,ccUR,ccDL,ccDR etc. End;
...
End;
Damit erschlägst Du alles, bis auf en-passant und die Rochade. Da muss man ja extra testen.
Das CheckIt ist auch simpel, indem es zu der aPosition alle Elemente der Zugliste addiert. Der zweite (Bool-) Parameter gibt an, ob der Weg bis zur Zielposition frei sein muss, oder nicht. Der Turm kann z.B. nicht 5 Felder nach rechts, wenn auf dem 3.Feld jemand steht. Beim Springer findet dieser Check nicht statt.
Mit dem Verfahren erstellst Du auch eine Liste aller legalen Züge.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
|