Ersten Zug bestimmen

Hi,

ich arbeite gerade an einer Methode für einen Bauer in Schach, die die möglichen Felder zurückgiebt, auf denen man sich bewegen kann.
Damit das mit dem Doppelzug klappt muss ich wissen wann die Methode für einen bestimmten Bauern zum ersten mal aufgerufen wird.
Habe es zuerst mit ner boolean variable versucht die zuerst auf true ist und am ende der Methode auf false gesetzt wird aber dann wird sie ja bei jedem neuen Aufruf wieder auf true gesetzt.
Ich wüsste eine Möglichkeit, die wäre aber extrem aufwendig (Anfangsposition mit jeder Startposition jedes Bauers vergleichen für jede Farbe). Habe irgendwie im gefühl dass das einfacher gehen muss. Gibt es da irgend ne elegante Möglichkeit?

Grüße
Herbert
 
Damit das mit dem Doppelzug klappt muss ich wissen wann die Methode für einen bestimmten Bauern zum ersten mal aufgerufen wird.
Es ergibt sich ja schon aus der Position des Bauern, ob er bereits gezogen hat. Wenn ein weißer Bauer auf der 2. Reihe steht bzw. ein schwarzer auf der siebten, wurde er noch nicht gezogen. Wenn Position und Farbe bekannt sind braucht man also keine zusätzliche Variable.
 
  • Der Bauer kann als einziger Spielstein en passant schlagen. Hat ein gegnerischer Bauer im unmittelbar vorausgehenden gegnerischen Halbzug einen Doppelschritt gemacht und steht ein eigener Bauer so, dass er das dabei übersprungene Feld angreift, kann er den gegnerischen Bauern so schlagen, als ob dieser nur ein Feld aus der Ausgangsstellung vorgerückt wäre.
Das geht leider nicht... ohne die bisherige Historie der Partie zu kennen...
 
Habe es zuerst mit ner boolean variable versucht die zuerst auf true ist und am ende der Methode auf false gesetzt wird aber dann wird sie ja bei jedem neuen Aufruf wieder auf true gesetzt.
Dein Ansatz mit der boolean-Variablen ist schon sinnvoll. Die Funktionalität wird ja nicht nur beim Bauern, sondern auch bei Turm und König gebraucht. Wenn die Variable eine Instanzvariable deines Figur-Objekts ist, kannst du sie bei der Objekterzeugung auf true setzen und beim Methodenaufruf auf false.
 
Das geht leider nicht... ohne die bisherige Historie der Partie zu kennen...
Dazu wird aber nicht die ganze Historie sondern nur der letzte Zug des Gegners benötigt. Und es hat absolut nichts mit der Problematik des TE zu tun, in der es erst einmal rein um den Doppelzug ging.

Und die Nachfrage von @Der Wissende ist wohl auch mit darauf zurück zu führen, dass man beim Zitieren die Quelle mit angeben sollte.
 
Und für später ist noch zu kontrollieren, ob der jeweilige Bauernzug legal ist. Sprich: prüfen ob er ein Schachgebot (weiterhin) ermöglicht / verhindert.
 
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.
 
z.B. dass beim gerade aus ziehen keine gegnerische Figur da stehen darf,
--> oder eine eigene
Bei der Rochade (..) werden.
--> und der Rochade-willige König darf auch in der Ausgangsstellung nicht im Schach stehen
es sei denn, der Zug schlägt den gegnerischen König.
--> dann wäre der gegnerische Zug -unter FIDE-Regeln- aber selbst illegal.
Feindliche Figur muss auf dem Feld stehen
--> oder der Bauernzug gibt Schach
 
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.
Da muss man allerdings ein wenig aufpassen, dass man nicht versehentlich die Vertikalrochade zulässt.;)
es sei denn, der Zug schlägt den gegnerischen König.
Das kann ja eigentlich nicht passieren, denn dazu müsste der vorhergehende gegnerische Zug regelwidrig gewesen sein.

EDIT: Link zur Vertikalrochade war falsch. Hier ist der richtige: Pam-Krabbé-Rochade
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben