So, nach dem mir meine Schwester mal unser ur-alt-Monopoly (noch von vor der Euro-Umstellung) rumgebracht hat und ich endlich mal die Gelegenheit hatte mich etwas genauer mit den Gemeinschafts- und Ereigniskarten zu befassen - die ich trotz intensiver Suche in mehreren Sprachen ums Verrecken einfach nicht im Netz finden konnte (copyright?) - kam mir nun die Frage nach dem Design des Codes. Dabei war mir klar: Ich muss vorher die Karten halbwegs sinnvoll strukturieren. Dabei ist mir aufgefallen: Es gibt letztlich nur 4 Typen von Karten:
- Der Spieler bekommt Geld.
- Der Spieler verliert Geld.
- Der Spieler bewegt sich.
- Spezial: jeweils die beiden Knast-Frei-Karten sowie die eine Ereigniskarte die zur Zahlung auffordert oder sonst auf das Ziehen einer Gemeinschaftskarte verweist.
Weiter gibt es mögliche Unterteilungen:
-
Der Spieler bekommt Geld …
a) von der Bank.
b) von anderen Spielern. -
Der Spieler verliert Geld …
a) an die Bank.
b) an andere Spieler. -
Der Spieler bewegt sich und …
a) erhält Geld …
I) von der Bank.
II) von anderen Spielern.
b) verliert Geld …
I) an die Bank.
II) an andere Spieler.
c) hat die Möglichkeit ein Grundstück zu kaufen, eine Versteigerung zu starten oder aufzuwerten. -
Für die Spezial-Karten fehlt mir aktuell noch die mögliche ausführliche Analyse bzw. ein Konzept der Umsetzung, da die Knast-Frei-Karten ja erst vom Spieler selbst ausgelöst werden bzw. sich bei Ziehen der anderen besagten Karte die Möglichkeit für ein weiteres Ziehen einer weiteren Karte ergibt - was ja so im “normalen” Spiel-Ablauf nicht drin ist - und daher irgendwie einen komplizierten Sonderfall darstellt.
Ergibt sich schon mal ein doch recht verzweigter Baum was bei einem Treffer auf ein Ereignis- bzw. Gemeinschaftsfeld so alles passieren kann.
Für den Code selbst macht es keinen Unterschied ob ich eine Gemeinschafts- oder eine Ereigniskarte ziehe - also brauche ich dafür keine unnötige Unterteilung in zwei Klassen und kann mit einer gemeinsamen Klasse “Card” arbeiten. Auch fällt ein Flag für den Typ weg da die Karten in zwei getrennten Listen (jeweils 16) gehalten werden. Eine Karte muss selbst also auch nicht wissen ob sie eine Gemeinschafts- oder eine Ereigniskarte ist.
Nun frage ich mich aber: Ist es sinnvoll eine Unterteilung nach dem oben erklärten Baum zu machen? Denn ob ein Spieler Geld bekommt oder verliert - und ob diese gegenüber der Bank oder anderen Spielern passiert - ist meiner Ansicht nach auf der gleichen Ebene. Man kann also wie oben nach erhalten/verlieren -> Bank/andere Spieler gehen oder nach Bank/andere Spieler -> erhalten/verlieren. Ich denke hier werde ich mich einfach für eine der beiden Varianten entscheiden müssen - da ich mir zumindest keine kombinierte Unterteilung so richtig vorstellen kann.
Auch wäre dann grundsätzlich noch die Frage: Auf welches Objekt soll die Karte wirken? Wenn ich also Card.doAction(T) habe - von welchem Typ sollte T sein? Mögliche Idee wäre vom Typ Player - da eine Aktion auf einem bestimmten Spieler ausgeführt wird (Erhalt/Verlust von Geld, Bewegung, Knast-Frei/erneutes Ziehen) und die Interaktion mit dem Rest des Spiels (also über die aktuellen Session auch mit den anderen Spielern) bereits abgebildet ist (so in die Richtung currentSession.getPlayer() oder sowas).
Ihr seht: Hier und da die eine oder andere Idee hab ich schon - aber ich stehe dann doch vor der Frage: Wie nun weiter?
Es gibt ja auch noch andere Baustellen wie z.B. dynamische Regeln - also in Richtung Begrenzung von Häusern/Hotels, “Steuern” in Frei Parken oder an die Bank?, doppeltes Income auf Los …
Ich fürchte einfach jetzt schon nur durch die Überlegung während des Schreibens unnötig Spaghetti-Code zu “erdenken” den ich eigentlich durch eine halbwegs saubere Struktur vermeiden will.
Kleine Anmerkung am Rande: Es soll erstmal ohne größere Geschosse wie DI-Frameworks oder modular via OSGI ablaufen. Darüber kann ich mir, wenn Refactoring nötig wird, immer noch Gedanken machen.
Danke erstmal für alle die sich hier mit dran beteiligen - ich geh mich in der Zwischenzeit mal mit den möglichen Copyright-Problemen vertraut machen …