Hey, ich habe vor ein paar Wochen Schach geschrieben, welches auch funktioniert.
Nun wollte ich es etwas erweitern und noch ein paar Regeln implementieren.
Das Problem ist, dass ich wohl meine Klassen nicht sehr gut geplant habe bzw irgendwie meine Methoden zu sehr "verschachtelt" habe.
Mein jetziger Ablauf:
Controller:
erstellt GUi und ChessGame
ChessGame:
erstellt das ChessBoard
setzt die Figuren auf das board
ChessBoard:
ein zweidimensionales Array von ChessFigures
Das board weiß wo sich die Figuren befinden, die Figuren selbst wissen es nicht.
DIe Regeln wohin die FIguren springen dürfen sind in jeder FIgurklasse einzeln implementiert sonst nirgends (das ist mM nach schon ein Fehler).
Okay, nicht in jeder Klasse - Vererbung....
Jedenfalls sobald die Methode getAvailDestinations() aufgerufen wird, wird eben gecheckt wohin die springen dürfen und dann wird ein zweidimensionales bool Array zurückgegeben.
Dieses zurückgegebene Array wird der move() im board übergeben, welche eben dann springt, wenn der Ort zu dem gesprungen werden soll auch im destinations[][] ein true gesetzt ist.
So weit so gut.
Nun, möchte ich für meine Bauern enPassant und Rochade implementieren.
Leider stehe ich da nun an.
Wenn ich meine canDoEnPassant() einfach mit der getavaildest() Methode verbinde, dann würde es bedeuten, dass ich immer zwei true-Einträge zurückgebe welche aber gar nicht korrekt sein müssten.
Sprich, ich könnte zwar dahin springen und enPassant machen, jedoch wird in dieser Methode nur geschaut wo ich alles hingehen darf und nicht ob ich dort hingehe.
Ich habs zwar mal so probiert aber es funktioniert nicht wirklich.
Ich habe nämlich ein int doneDraws welche eben die gemachten Züge angeben soll.
Jedoch ist diese irgendwie nie korrekt, sie erhöht sich immer.
Ich erhöhe sie wenn ein Zug getan wurde, nur ist es so als ob ich sie nicht für die jeweilige Instanz erhöhe sondern eher für die jeweilige Klasse.
Aber auch da gibt es eine inkonsistenz:
Ich mache zB.: einen Zug weis, dann ist die var auf 1 dann mit Schwarz-> var=1
dann ziehe ich wieder mit dem gleichen weisen ist sie auf 2
dann ziehe ich mit einem ANDEREN Schwarzen und die var ist auf 2 obwohl sie für diesen eigentlich auf eins sein sollte. Dann mit nem anderen Weisen ist sie auf 3.....
Ich weis einfach nicht wo ich das überprüfen soll und wo ich dann den gegnerischen Bauern killen soll.
Ich hoffe mal jemand von euch hat eine erlösende Idee für mich.
PS: Code kann ich noch nachreichen
Nun wollte ich es etwas erweitern und noch ein paar Regeln implementieren.
Das Problem ist, dass ich wohl meine Klassen nicht sehr gut geplant habe bzw irgendwie meine Methoden zu sehr "verschachtelt" habe.
Mein jetziger Ablauf:
Controller:
erstellt GUi und ChessGame
ChessGame:
erstellt das ChessBoard
setzt die Figuren auf das board
ChessBoard:
ein zweidimensionales Array von ChessFigures
Das board weiß wo sich die Figuren befinden, die Figuren selbst wissen es nicht.
DIe Regeln wohin die FIguren springen dürfen sind in jeder FIgurklasse einzeln implementiert sonst nirgends (das ist mM nach schon ein Fehler).
Okay, nicht in jeder Klasse - Vererbung....
Jedenfalls sobald die Methode getAvailDestinations() aufgerufen wird, wird eben gecheckt wohin die springen dürfen und dann wird ein zweidimensionales bool Array zurückgegeben.
Dieses zurückgegebene Array wird der move() im board übergeben, welche eben dann springt, wenn der Ort zu dem gesprungen werden soll auch im destinations[][] ein true gesetzt ist.
So weit so gut.
Nun, möchte ich für meine Bauern enPassant und Rochade implementieren.
Leider stehe ich da nun an.
Wenn ich meine canDoEnPassant() einfach mit der getavaildest() Methode verbinde, dann würde es bedeuten, dass ich immer zwei true-Einträge zurückgebe welche aber gar nicht korrekt sein müssten.
Sprich, ich könnte zwar dahin springen und enPassant machen, jedoch wird in dieser Methode nur geschaut wo ich alles hingehen darf und nicht ob ich dort hingehe.
Ich habs zwar mal so probiert aber es funktioniert nicht wirklich.
Ich habe nämlich ein int doneDraws welche eben die gemachten Züge angeben soll.
Jedoch ist diese irgendwie nie korrekt, sie erhöht sich immer.
Ich erhöhe sie wenn ein Zug getan wurde, nur ist es so als ob ich sie nicht für die jeweilige Instanz erhöhe sondern eher für die jeweilige Klasse.
Aber auch da gibt es eine inkonsistenz:
Ich mache zB.: einen Zug weis, dann ist die var auf 1 dann mit Schwarz-> var=1
dann ziehe ich wieder mit dem gleichen weisen ist sie auf 2
dann ziehe ich mit einem ANDEREN Schwarzen und die var ist auf 2 obwohl sie für diesen eigentlich auf eins sein sollte. Dann mit nem anderen Weisen ist sie auf 3.....
Ich weis einfach nicht wo ich das überprüfen soll und wo ich dann den gegnerischen Bauern killen soll.
Ich hoffe mal jemand von euch hat eine erlösende Idee für mich.
PS: Code kann ich noch nachreichen