So ein Schach Programm ist diesbezüglich ein sehr interessantes Projekt. Ich habe mich da auch schon einmal heran gewagt.
Das war hier noch nicht Thema und ich hoffe, dass ich da noch nicht zu sehr vorgreife:
Was der TE derzeit macht ist erst einmal eine Analyse von möglichen Zügen:
- Jede Figur kann von ihrer Position gewisse Schritte gehen. Hier gibt es neben den "üblichen" Zügen (a.la. Bauer zieht ein Feld vor) dann noch die unüblichen ("Bauer kann beim ersten Mal zwei Felder vorziehen", "Bauer schlägt nicht gerade aus", "bauer schlägt schräg", "bauer kann en passant schlagen", "König und Turm können eine Rochade machen") ...
- Es gibt Kriterien für ungültige Züge:
Üblich ist hier z.B. Ziel-Feld ist durch eigene Figur belegt. Aber es gibt dann auch sehr schnell Spezialfälle, denn beim Bauen gilt z.B. dass beim gerade aus ziehen keine gegnerische Figur da stehen darf, beim schräg ziehen muss eine gegnerische Figur da stehen. Bei der Rochade dürfen König und Turm nicht bewegt worden sein, die Felder dazwischen müssen leer sein, die Felder dürfen nicht bedroht werden.
Generell gilt immer das Kriterium: Nach dem Zug darf der eigene König nicht bedroht sein, es sei denn, der Zug schlägt den gegnerischen König.
Ich fand, dass man dies sehr schön objektorientiert darstellen konnte. Ich habe damals den Ansatz gewählt, dass ich halt die Figuren entsprechend modelliert hatte und dann ganz viele Klassen hatte. Das ging recht gut, aber mir gefiel nicht ganz so gut, dass ich dann in der Figur selbst ein Verhalten hatte, das ich dann in überschriebenen Klassen wieder durch überschreiben entfernt hatte. Da wäre heute mein veränderter Ansatz, dass man das Strategy Pattern verwendet, d.h. das Verhalten ist in einer eigenen Klassenstruktur gekapselt. Vermutlich wird man dann auch keine eigenen Klassen mehr für König, Dame u.s.w. brauchen, denn alles sind nur Figuren mit einem Verhalten und dieses Verhalten ist halt in Klassen gekapselt....
Aber egal. Worauf ich eigentlich nur etwas hinaus wollte, war dann halt meine Lösung damals:
Alle Schritte, die möglich waren, wurden definiert mit Gültigkeitsregeln:
Bauer hatte also als Optionen: ein Schritt vor, zwei Schritt vor, Schritt nach rechts vorne, Schritt nach links vorne. Und es gab halt eine Bewertung, ob der Schritt erlaubt ist: Ein Schritt geradeaus: Feld muss leer sein. Zwei Schritt geradeaus: Feld vor dem Bauen und das Zielfeld müssen leer sein, Bauer muss auf seine Grundposition stehen, Schritt schräg: Feindliche Figur muss auf dem Feld stehen oder letzter Zug des Gegners setzte einen Bauen zwei Felder vor neben den Bauern.
Was dann halt nur an weiteren Bereichen kommt:
a) Zug Durchführung: Wenn ein Zug durchgeführt wird, dann gibt es Aktionen, z.B. das Entfernen einer gegnerischen Figur.
b) Stellungsbewertung: So man einen Computerspieler haben will, dann muss man da etwas bewerten.
c) Um b zu verbessern: Bibliotheken: Eröffnung ist trivial (Da bewegt man sich einfach in einem Baum bis ein Zug kommt, der nicht im Baum enthalten ist) und Endspiel wird schwerer: Sowohl Bauernendspiel: Wie bekomme ich gezielt einen Bauen durch? als auch dass Schachmatt setzen: König + x (+y) gegen König. Es wäre schade, wenn man ein Patt hat, nur weil der Computer nicht mit König und Dame den König schachmatt setzen kann.
Und gewisse Flags (Figur schon bewegt) hatte ich nicht. Es werden ja die Züge erfasst und dann ist das eine einfache Suche. Es geht ja in der Regel nur um eine zweistellige Anzahl an Zügen: Die Züge sind dann im Speicher und sind schnell durchsuchbar um zu sehen, ob Turm oder König bereits bewegt wurden.