Schach in Java - Allgemeine Frage zur Architektur

Bitte aktiviere JavaScript!
Hallo, ich bin Java-Anfänger und habe mir als Trainingsprojekt vorgenommen, ein kleines Schachprogramm (vorerst keinen Computer ;-)) zu schreiben.

Dazu habe ich eine Superklasse 'Figur' mit den Attributen 'Spielfarbe' , Standort_horizontal und Standort_vertikal, sowie der Methode settoboard(h,v) gebildet. Daneben für jeden Typ von Spielfigur jeweils eine Kindklasse (also Turm, Dame, Pferd usw), in der dann hauptsächlich die Methode 'zugtest(von, nach)' drinsteht, wo also gecheckt wird, ob der eingegebene Zug erlaubt ist.
Das Schachbrett ist ein zweidimensionales Array für den Datentyp Figur.

Und genau da ist das Problem: wenn ich die Spielfiguren Turm, Pferd usw im Array ablege, kann ich nicht mehr auf deren Kindklassen-Methoden zugreifen, weil im Array ja der Datentyp der Elternklasse verlangt wird. Ich kann zwar nach der jeweiligen Kindklasse casten, aber das krieg ich irgendwie nur mit zig unschönen if-Abfragen hin.

Es gäbe auch den Workaround, den Zugcheck einfach ebenfalls in die Elternklasse zu packen und der Eltern-(und dann einzigen) Klasse 'Figur' halt noch das Attribut 'typ' zu geben. Das ist aber wenig elegant und ich will ja die Verwendung von Superklassen lernen.

Was wäre in dieser Konstellation eine elegante Lösung?

Danke für Tipps,
Christian
 
Die (abstrakte) Superklasse enthält die (ggf. abstrakte) Methode zugtest. Der Rest geschieht automatisch (Polymorphie).
 
Weiterhin kann der Zugtest sehr umfangreich ausfallen:
(König) darf noch rochiert werden ? Steht er im Schach oder überschreitet er ein Feld auf welchem Schach gegeben wird ? Haben König und der entspr. Turm schon einmal gezogen ? Sind die Felder der Grundreihe frei von anderen Figuren ? Steht der König nach einem ausgeführten Zug im Schach ? Führt ein eigener Zug zum Schachgebot des eigenen Königs (dieser wäre natürlich illegal) ?
(Bauer) darf er ein oder zwei Felder vorziehen ? Darf er vertikal schlagen ? Ist die "En-Passant-Regel" anwendbar ? In welche Figuren darf er beim Einzug auf die Grundreihe verwandelt werden ?
Bei den restlichen Figuren ob diese regelgemäss ziehen dürfen: keine Steine im Weg, kein zu parierendes Schach, Zug endet nicht ausserhalb des Spielfelds...
 
Okay, danke schonmal. Das ist wahrscheinlich etwas, was ich mir heute Abend nochmal genauer anschauen muss.

Der Zugtest ist ja aber doch für jede Kindklasse anders. Trotzdem in der Elternklasse?
 
Du schreibst den Zugtest ja quasi nur als "Dummy" in die Elternklasse. Diese Methode wird dann in jeder Childklasse überschrieben.
 
Weiterhin kann der Zugtest sehr umfangreich ausfallen:
(König) darf noch rochiert werden ? Steht er im Schach oder überschreitet er ein Feld auf welchem Schach gegeben wird ? Haben König und der entspr. Turm schon einmal gezogen ? Sind die Felder der Grundreihe frei von anderen Figuren ? Steht der König nach einem ausgeführten Zug im Schach ? Führt ein eigener Zug zum Schachgebot des eigenen Königs (dieser wäre natürlich illegal) ?
(Bauer) darf er ein oder zwei Felder vorziehen ? Darf er vertikal schlagen ? Ist die "En-Passant-Regel" anwendbar ? In welche Figuren darf er beim Einzug auf die Grundreihe verwandelt werden ?
Bei den restlichen Figuren ob diese regelgemäss ziehen dürfen: keine Steine im Weg, kein zu parierendes Schach, Zug endet nicht ausserhalb des Spielfelds...
Das ist mir klar. Deshalb will ich den Zugtest ja innerhalb der jeweiligen Kindklasse haben, so dass ich Bauern, Königen und Türmen Rochade- bzw Enpassant-Marker verpassen kann, die die anderen nicht brauchen.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben