Ich versuche ein Gefühl dafür zu bekommen, wie man objektorientiert gestaltet und denkt, und möchte ein Feedback von der Community zu diesem Thema erhalten. Das Folgende ist ein Beispiel für ein Schachspiel, das ich auf OO-Weise entwerfen möchte. Dies ist ein sehr umfassendes Design, und ich konzentriere mich in dieser Phase nur darauf, herauszufinden, wer für welche Nachrichten verantwortlich ist und wie die Objekte miteinander interagieren, um das Spiel zu simulieren. Bitte weisen Sie darauf hin, ob es Elemente mit schlechtem Design gibt (hohe Kopplung, schlechte Kohäsion usw.) und wie Sie diese verbessern können.
Das Schachspiel hat die folgenden Klassen
- Tafel
- Spieler
- Stück
- Quadrat
- Schachspiel
Das Board besteht aus Quadraten, sodass das Board für die Erstellung und Verwaltung von Square-Objekten verantwortlich gemacht werden kann. Jedes Stück befindet sich auch auf einem Quadrat, sodass jedes Stück auch einen Verweis auf das Quadrat hat, auf dem es sich befindet. (Macht das Sinn?). Jedes Stück ist dann dafür verantwortlich, sich von einem Feld zum anderen zu bewegen. Die Spielerklasse enthält Verweise auf alle Teile, die er besitzt, und ist auch für deren Erstellung verantwortlich (Sollte der Spieler Teile erstellen?). Der Spieler hat eine Methode takeTurn, die wiederum eine Methode movePiece aufruft, die zur Stückklasse gehört, die die Position der Figur von ihrer aktuellen Position an eine andere Position ändert. Jetzt bin ich verwirrt darüber, wofür genau die Board-Klasse verantwortlich sein muss. Ich nahm an, dass es notwendig war, um den aktuellen Status des Spiels zu bestimmen und zu wissen, wann das Spiel vorbei ist. Aber wenn ein Stück es ändert ' s Ort wie soll das Board aktualisiert werden? Sollte es eine separate Anordnung von Quadraten beibehalten, auf denen Teile vorhanden sind und die aktualisiert werden, wenn sich Teile bewegen?
Außerdem erstellt ChessGame zunächst die Brett- und Spielerobjekte, die wiederum Quadrate bzw. Steine erstellen und die Simulation starten. Kurz gesagt, so könnte der Code in ChessGame aussehen
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
Ich bin mir nicht sicher, wie der Status des Boards aktualisiert wird. Sollte das Stück einen Verweis auf die Tafel haben? Wo soll die Verantwortung liegen? Wer hat welche Referenzen? Bitte helfen Sie mir bei Ihren Eingaben und weisen Sie auf Probleme bei diesem Entwurf hin. Ich konzentriere mich bewusst nicht auf Algorithmen oder weitere Details des Spiels, da ich mich nur für den Designaspekt interessiere. Ich hoffe, diese Community kann wertvolle Erkenntnisse liefern.
canMove()
Funktion verwendet. Und wenn der Umzug abgeschlossen ist, aktualisieren alle anderen Teile ihre eigene innere Kopie des Bretts. Ich weiß, dass es nicht optimal ist, aber es war zu dieser Zeit interessant, C ++ zu lernen. Später sagte mir ein Freund eines Nicht-Schachspielers, dass er classes
für jedes Feld statt für jede Figur haben würde. Und dieser Kommentar kam mir sehr interessant vor.
takeTurn()
wenn der Zug von p1 das Spiel beendet. Weniger pingeliger Kommentar: Ich finde es natürlicher, die Spieler anzurufenwhite
undblack
.