Static Variablen verbieten

Kaffebohne

Mitglied
Ich entwickle gerade ein Strategiespiel, wo es darum gehen soll, das Verhalten der Einheiten im voraus zu programmieren, anstatt sie persönlich zu steuern, das Spiel besteht also aus einer puren Simulation, in die man nicht eingreifen kann. Dabei sind die Einheiten selbstständig, haben ein eigenes Kartenwissen und ein definiertes kleines Gedächtnis und können untereinander kommunizieren. Ihre Entscheidungen müssen sie ca. jede Sekunde neu überdenken, wobei ihnen dafür nur ihr Kartenwissen, das Gedächtnis, und die Objekte in Sichtweite zur Verfügung stehen. Die Entscheidung besteht dann etwa in der Vorgabe einer Laufrichtung oder der Änderung des Gedächtnisses.
Die bequemste und für den "Spieler" wohl praktischste Lösung wäre nun, das Skript in Java schreiben zu lassen (das Spiel selbst ist in Java und Scala geschrieben), allerdings tut sich da das Problem auf, dass es offensichtlich möglich ist und geradezu einladend scheint, globale Variablen (falls man zur Ausführung des Skripts jedes Mal ein neues Objekt erstellt, kommen nur static Variablen infrage, daher der Titel) als unbegrenzten und gemeinsamen Speicher zu verwenden; man könnte also direkt das grundlegende Spielkonzept umgehen.

Gibt es dafür irgendwelche Lösungen, ohne ganz auf Java als Skriptsprache zu verzichten (z.B. etwa eine Klasse zu reinitialisieren)?
Vielen Dank für eure Hilfe!
 
Wenn man es gar nicht verhindern kann, könntest du in der eigentlichen Spiellogik beim Einlesen der "srkipte" zumindest über reflection überprüfen ob statische klassenvariablen oder methoden existieren (Und dann entsprechend den spieler als cheater darstellen und die verwendung des skriptes nicht erlauben ^^). Ansonsten fällt mir nur javascript mit entsprechenden scopes oder eine eigene DSL ein.
 
Wenn ich das richtig verstanden hab, dann schreibt der Spieler die Logik für die Figuren und beeinflusst dadurch das Spiel, und du möchtest verhindern, das er auf statische Variablen zugreifen kann oder welche anlegen kann, richtig?
 
@BRoll
Davon wusste ich noch gar nichts, es sieht auf jeden Fall nach einer akzeptablen Option aus, danke.
Gibt es eine elegantere Möglichkeit, alle vom Spieler geschriebenen Klassen zu ermitteln, als die class-Files durchzugehen?
@Viktim
Genau, nach jedem Denkzyklus (den man kurz gestalten sollte, da währenddessen die Einheit nichts tun kann), soll alles außer dem Gedächtnis und dem Kartenwissen vergessen werden, beim nächsten Zyklus bekommt man dann neue Informationen über die naheliegenden Objekte.
 
Zuletzt bearbeitet:
Was meinst du mit elegantere Möglichkeit? Irgendwo musst du die User-Klassen ja in deine Spiellogik einbringen -
und genau dort kannst du diese auch überprüfen auf statische Zugriffe. Und genau für diese Überprüfung ist es IMO am einfachsten
das per Reflection zu lösen - man könnte aber auch einen Parser schreiben der aus einem Quelltext überprüft ob dieser statische Elemente hat oder nicht. Daher finde ich Reflection schon relativ "elegant", da man sich sowas dann sparen würde. Oder meinst du mit elganter einen komplett anderen Ansatz?
 
Ich meinte, wie man am besten sieht, welche Klassen sich der Spieler definiert hat, um dann bei jeder einzelnen per Reflection die statischen Variablen zu überprüfen.
Wenn man schon Java zur Verfügung stellt, sollte man auch von der Objektorientierung profitieren können.
 
Sehe ich das richtig, dass es dann pro Denkzyklus pro Einheit eine eigene Klasse gibt, die zwar statische Variablen haben kann, die aber nur von dem einen erzeugten Objekt gesehen werden?
 
Wenn du pro Zyklus und pro Einheit die Klasse neu lädst, dann ja. Ich hab das aber bisher noch nicht gemacht, weshalb ich auch nichts zur Performance sagen kann. Wie viele Einheiten gibt es denn so in der Regel? Pro Zyklus, die wie du sagtest eine Sekunde ist, wird kein Problem sein.
 
Größenordnung 100 pro Spieler, würde ich sagen.
Kann man eigentlich andere aktive Objekte während der Laufzeit "aufspüren" und ansprechen? Das würde beide Varianten umgehen.
 
Alternativ könntest du auch einfach eine Scriptsprache benutzen. Da würde sich beispielsweise Lua anbieten, welches auch etwas einfacher zu lernen ist als Java. Lua ist allgemein sehr verbreitet, insbesondere um Spiellogik auszulagern
 

Zurück
Oben