Ich mache ein Text Adventure-Spiel in Groovy als eine Art Übung, und ich stoße in einen seltsamen Fehler.
Im Moment habe ich enum
für die Richtungen, in die ein Spieler gehen kann, die derzeit Norden, Süden, Osten, Westen, Auf und Ab enthalten.
Ich habe eine Klasse Room
, die Map
anderer verbundener Räume und deren Richtungen enthält. Wenn ich eine Room
zu einer anderen Room
bei einer bestimmten Direction
hinzufüge, möchte ich auch die aktuelle Room
zu der anderen Room
in der entgegengesetzten Richtung hinzufügen können.
Beispiel: Wenn ich eine Verbindung von Raum 1 zu Raum 2 nach Norden hinzufüge, möchte ich in der Lage sein, gleichzeitig eine Verbindung von Raum 2 zu Raum 1 hinzuzufügen.
Momentan versuche ich dies mithilfe einer enum
namens Direction
mit einer angehängten Instanzvariable opposite
(vom Typ Direction
) zu implementieren. Ist das nicht erlaubt? Ich erhalte keine Compilerfehler oder ähnliches, aber ich kann es nicht funktionieren lassen.
Hier ist die vollständige enum
Deklaration:
Und das ist die Methode, von der ich es nenne:
%Vor% wobei connections
ein public Map<Direction, Spot>
ist.
In diesem Fall wird ein Eintrag zu connections
hinzugefügt, der wie folgt aussieht:
Jede Hilfe wäre großartig. Danke!
Groovy scheint zu umgehen, was in Java ein Kompilierungsfehler ist:
%Vor% Der groovy Compiler beklagt sich nicht darüber, sondern initialisiert die Enum-Werte, die Vorwärtsdeklarationen als null
benötigen:
Ausgaben :
%Vor% Eine Lösung, die in Java anscheinend gut funktioniert, ist das Hinzufügen eines Blocks static
in der Klasse Direction
, um% zu initialisieren. co_de% -Werte. Übersetzt zu Groovy, das wäre:
Was nun die korrekten Werte ausgibt :
%Vor%Aber ich finde den ersten klarer, da er diese magischen Zahlen für die Indizes nicht benötigt hehe.
Jetzt werde ich wahrscheinlich ein bisschen in die Golfländer kommen, aber Sie können die entgegengesetzte Richtung ohne die Notwendigkeit eines zusätzlichen Feldes bekommen , nur mit den Enum-Werten opposite
(ihr Index):
Es ist nicht so gruselig wie es aussieht! Sogar Richtungen (Nord, Ost, Hoch) geben die Richtung bei ordinal()
als ihr Gegenteil zurück, während ungerade Richtungen (die anderen) die Einsen bei ordinal() + 1
zurückgeben. Natürlich ist es stark abhängig von der Reihenfolge der Elemente in der Enum, aber, magst du nicht die Prägnanz? = D
Es sieht so aus, als ob die Hälfte von Directions
nicht initialisiert wird, wenn der Enum-Konstruktor aufgerufen wird. Das heißt, wenn Sie North(South)
aufrufen, wurde South nicht initialisiert. Es steht an der Reihe.
Sie befinden sich in einem Hühner- / Eier-Paradoxon, bei dem alle der Enum-Konstanten initialisiert werden müssen, bevor eins von ihnen sein kann. Es sieht so aus, als müssten Sie einen Teil Ihres Codes reorganisieren, um dies zu berücksichtigen. Ich könnte vorschlagen:
%Vor% Dies verwendet den bitweisen Operator ~
, um Gegensätze zu unterscheiden.