Strategiespiel: Designfrage, welches Objekt kennt / kontrolliert die Regeln des Spieles
-
Moin,
ich schreibe gerade ein rundenbasiertes Strategiespiel und zwar einen Imperialismus Clon.
Die Weltkarte in Imperialismus ist gekachelt. Also habe ich eine Klasse Map, die mehrere Objekte vom Typ Tile enthält. Auf den einzelnen Tiles können Gebäude gebaut werden, welche Gebäude auf welchen Tiles, das steht irgendwo in einem XML-File und ist unterschiedlich. Jetzt ist die Frage, wie überprüfe ich das in meinem Code.Soll ich die Logik den Tiles mitgeben und dann irgendwo in Tile::methodXY prüfen oder eher die Tiles stumpf lassen und eine Klasse für gerade solche Überprüfungen schreiben?
Ich persönlich bin da grade etwas unsicher. Ich brauche das ja noch häufiger in anderen Zusammenhängen. Ich kann das natürlich in die Tileklasse packen und da machen. Die Tiles würde ich dann von einer Factory erstellen lassen, die ihnen einimpft, was erlaubt ist und was nicht. Das Problem an dem Ansatz ist, dass das nicht nur von der Beschaffenheit eines Tiles sondern auch von anderen Elementen des Spielverlaufs abhängen kann. (Gerade auch in anderen Zusammenhängen). Also die Logik in eine andere Klasse packen. Frage ist jetzt: Für jeden Teilbereich eines Spiels eine eigene Klasse? Eine große Klasse für alle solcher Regelprüfungen? Freie Funktionen (dann doch eher eine Klasse um Parameter zu sparen)?
Wie habt ihr das in euren Projekten gelöst, wie würdet ihr das machen?
-
Ich bin mir nicht sicher, ob ich alles richtig verstanden habe, aber hier mal ein paar Vorschläge. Wenn es verschiedene Tiles wie z.B. Ebene, Wald, Berge, Wüste, Wasser gibt und es primär von der Bodenbeschaffenheit abhängt, welche Gebäude wo gebaut werden, würde ich diese Information nicht pro Tile speichern. Schliesslich würdest du sonst unnötig Informationen duplizieren, die du wieder konsistent halten müsstest.
Man könnte zwar dennoch eine Tile-Methode verwenden. Da aber wahrscheinlich mit den Informationen, was wo gebaut werden kann, einiges an Status verbunden ist (Tabelle oder so), lohnt sich vielleicht eine eigene Klasse dafür. Diese könntest du in einer übergeordneten als Member haben. Welche Klasse ist denn für den Bau von Gebäuden zuständig?
Map? Dann könnte das die übergeordnete Klasse sein.Und eine grosse Schnittstelle ist dafür auch nicht nötig. Sowas wie eine
bool-Abfragefunktion, die einen Gebäudetypen und andere relevante Umstände als Parameter nimmt und dann intern entscheidet, ob der Bau möglich ist, sollte reichen.