Hallo Java-Community
Immer wieder passiert es mir, dass ich zwar eine lauffähige Version hinbekomme, der Code aber sehr unschön ist. Ich habe mir deshalb vorgenommen, etwas mehr auf das Design zu achten. Ich habe dabei oft das Problem, dass ich nicht genau weiss, wo ich verschiedenste Codestücke unterbringen soll.
Nachfolgendes Beipspiel zeigt mein Problem glaube ich ziemlich gut. Ich habe versucht, ein Snake-Spiel mit Hilfe eines MVC-Patterns zu bauen. Soweit klappt alles bestens. Ich habe dazu vereinfacht folgende Modell-Klassen.
SnakeModel: (Beschreibt die Lage und Richtung der Schlange)
- Vector<FieldPoint> coveredFieldPoints
- int Direction
WallModel (Die Lage der Wände)
- private Vector<FieldPoint> wallPieces
FruitModel (beschreibt die Lage aller einzusammelnden "Früchte")
- Vector<Fruit> fruits
GameStatus (beeinhaltet Informationen zum Spielstand)
- int points
- boolean gameOver
Ferner:
FieldPoint
- int x
- int y
Fruit
- int value
- FieldPoint location
Soweit alles gut. Gehen wir davon aus, dass das Spiel läuft und die Lage der Schlange ständig angepasst wird (coveredFieldPoints). Die Frage die sich mir nun stellt ist, wo bringe ich die Logik, resp. Interaktion der Modelle zusammen.
Beipielsweise muss ich bei jedem Schritt der Schlange prüfen, ob sie in eine Wand oder in in eigenen Schwanz gefahren ist --> GameOver.
Ich habe dies als Methode "checkGameOverStatus" in der Klasse GameStatus untergebracht. Dazu übergebe ich der Methode das SnakeModel und das WallModel. Dies finde ich prinzipiell noch ok, da ich ja eine Eigenschaft der Klasse GameStatus, namentlich das Feld gameOver setzen will. Oder gehört das auch schon nicht hierhin?
Anders sieht es aber aus, wenn ich den Spielstand (die Punkte) updaten möchte. Wiederum erstelle ich eine Methode "updatePoints" in der Klasse Gamestatus, der ich das SnakeModel und das FruitModel übergebe. Ich prüfe dann, ob die Schlange gerade eine Frucht gefressen hat und erhöhe Allenfalls den Spielstand. Auch hier bin ich der Meinung, dass man das hier machen kann, da ein Feld von Gamestatus betroffen ist.
Wird nun aber eine Frucht "gefressen" muss diese Frucht natürlich auch aus dem FruitModel entfernt werden und eine neue Frucht gesetzt werden. Heute habe ich das direkt in der "updatePoints" der Klasse GameStatus integriert. Dies aber lediglich darum, da ich hier um die Punkte zu aktualisieren ebenfalls prüfen muss, ob eine Frucht gefressen wurde. Hingehören tut es hier aber eigentlich nicht, oder? Schliesslich besagt der Name der Methode ja updatePoints und wenn ich darin das FruitModel anpasse passiert etwas, was man so nicht erwarten würde.
Meine Frage nun, wo gehört die Anpassung des FruitModels denn hin? Ihr seht, ich habe allgemein Probleme die Interaktion verschiedenen Modelle an geeigneter Stelle zu verküpfen und wäre froh um Inputs.
Vielen Dank
edit0r
Immer wieder passiert es mir, dass ich zwar eine lauffähige Version hinbekomme, der Code aber sehr unschön ist. Ich habe mir deshalb vorgenommen, etwas mehr auf das Design zu achten. Ich habe dabei oft das Problem, dass ich nicht genau weiss, wo ich verschiedenste Codestücke unterbringen soll.
Nachfolgendes Beipspiel zeigt mein Problem glaube ich ziemlich gut. Ich habe versucht, ein Snake-Spiel mit Hilfe eines MVC-Patterns zu bauen. Soweit klappt alles bestens. Ich habe dazu vereinfacht folgende Modell-Klassen.
SnakeModel: (Beschreibt die Lage und Richtung der Schlange)
- Vector<FieldPoint> coveredFieldPoints
- int Direction
WallModel (Die Lage der Wände)
- private Vector<FieldPoint> wallPieces
FruitModel (beschreibt die Lage aller einzusammelnden "Früchte")
- Vector<Fruit> fruits
GameStatus (beeinhaltet Informationen zum Spielstand)
- int points
- boolean gameOver
Ferner:
FieldPoint
- int x
- int y
Fruit
- int value
- FieldPoint location
Soweit alles gut. Gehen wir davon aus, dass das Spiel läuft und die Lage der Schlange ständig angepasst wird (coveredFieldPoints). Die Frage die sich mir nun stellt ist, wo bringe ich die Logik, resp. Interaktion der Modelle zusammen.
Beipielsweise muss ich bei jedem Schritt der Schlange prüfen, ob sie in eine Wand oder in in eigenen Schwanz gefahren ist --> GameOver.
Ich habe dies als Methode "checkGameOverStatus" in der Klasse GameStatus untergebracht. Dazu übergebe ich der Methode das SnakeModel und das WallModel. Dies finde ich prinzipiell noch ok, da ich ja eine Eigenschaft der Klasse GameStatus, namentlich das Feld gameOver setzen will. Oder gehört das auch schon nicht hierhin?
Anders sieht es aber aus, wenn ich den Spielstand (die Punkte) updaten möchte. Wiederum erstelle ich eine Methode "updatePoints" in der Klasse Gamestatus, der ich das SnakeModel und das FruitModel übergebe. Ich prüfe dann, ob die Schlange gerade eine Frucht gefressen hat und erhöhe Allenfalls den Spielstand. Auch hier bin ich der Meinung, dass man das hier machen kann, da ein Feld von Gamestatus betroffen ist.
Wird nun aber eine Frucht "gefressen" muss diese Frucht natürlich auch aus dem FruitModel entfernt werden und eine neue Frucht gesetzt werden. Heute habe ich das direkt in der "updatePoints" der Klasse GameStatus integriert. Dies aber lediglich darum, da ich hier um die Punkte zu aktualisieren ebenfalls prüfen muss, ob eine Frucht gefressen wurde. Hingehören tut es hier aber eigentlich nicht, oder? Schliesslich besagt der Name der Methode ja updatePoints und wenn ich darin das FruitModel anpasse passiert etwas, was man so nicht erwarten würde.
Meine Frage nun, wo gehört die Anpassung des FruitModels denn hin? Ihr seht, ich habe allgemein Probleme die Interaktion verschiedenen Modelle an geeigneter Stelle zu verküpfen und wäre froh um Inputs.
Vielen Dank
edit0r