Game-Engine für textbasierendes Spiel: Architektur?

faraday

Mitglied
Hallo liebe Forumsgemeinde, ich hab da einige Fragen bezüglich der Architektur bzw. das Nutzen bestimmter Pattern. Ich versuche mich gerade an einem textbasierenden Adventure und versuche gerade eine Engine zu entwickeln. Die Welt soll durch eine Klasse World erzeugt werden. Da nur eine Welt existieren soll, hat der Konstruktur bereits folgende Struktur:
Java:
public class World {
	private Player player;
	private static World world; 
	
	private World( String name ) {
		this.player = new Player( name );
		this.generateWorld();
	}
	
	public static synchronized World getInstance( String name ) 
	{ 
		if ( world == null ) 
			world = new World( name ); 
		return world;
	}
	
	private void generateWorld() {
	}
Mit generateWorld() wird dann letztlich die Welt generiert. Wenn mich nicht alles täuscht heißt das Singleton-Pattern. Korrigiert mich bitte, wenn ich mich irre.

Jetzt frage ich mich allerdings, wie ich den Rest gestalten soll. Meine Eingabe soll durch eine Klasse InputHandler verarbeitet werden. Ist es nun sinnvoll die ganze Klasse mit statischen Fabrikmethoden auszustatten, der dann jedes mal die Welt-Instanz erzeugt/zurückgibt? Denn der Handler braucht ja die Information über die Welt.

Der Handler soll das Ganze dann an ein (noch nicht gedanklich entwickeltes) Eventsystem übergeben. Das funktioniert dann vermutlich am Besten über Observer/Observables, die ja bereits über die Bean implementiert sind. Oder?

Ich hoffe ich hab die Architekturen/Strukturen/Pattern jetzt nicht durcheinandergebracht und hoffe ihr könnt mir helfen meine Ideen in ein sinnvollen Gesamtkontext bzw Pattern zu übersetzen. Falls ich mich irgendwie unklar ausgedrückt habe, lasst es mich bitte wissen.

Liebe Grüße fara
 

Ruzmanz

Top Contributor
Das Singleton-Pattern ist nur notwendig (sollte nur verwendet werden), wenn es dringend erforderlich ist, dass es nur eine Instanz der Klasse gibt. Bei einem Spiel ist es i.d.R. irrelevant wie viele Maps es gibt. Es wird auf dem Bildschirm nur eine Map angezeigt, Beim Spiel-Neustart wäre es theoretisch egal ob ich die alte Map wegwerfe und eine neue erstelle ... Zudem ist deine Implementierung falsch:

World.getInstance("Max");
World.getInstance("Mustermann");
World.getInstance("Peter");

-> Was erwartest du als Entwickler? Drei verschiedene Welten für die einzelnen Personen oder eine Welt, bei dem der Spieler "Max" heißt?

Jetzt frage ich mich allerdings, wie ich den Rest gestalten soll. Meine Eingabe soll durch eine Klasse InputHandler verarbeitet werden. Ist es nun sinnvoll die ganze Klasse mit statischen Fabrikmethoden auszustatten, der dann jedes mal die Welt-Instanz erzeugt/zurückgibt? Denn der Handler braucht ja die Information über die Welt.

Dein InputHandler braucht die Informationen über deine Welt definitiv nicht. Er leitet die Eingaben nur an die jeweiligen Klassen weiter und dir kümmern sich selbst um die Verarbeitung. Simples Beispiel:

Java:
public class InputHandler {
    onInput(Key key) {
        if(key.getValue() == Key.ESC) {
              World.getInstance("Gustav").setPause(true);
        } 

       if(key.getValue() == Key.UP) {
               World.getInstance("Peter").getPlayer().moveUp(true); 
       }

       if(key.getValue() == Key.DOWN) {
               World.getInstance("Lasmiranda").getPlayer().moveDown(true); 
       }
   }
}

public class Player {
   public move() {
      if(moveDown ^ moveUp) {
           // move ...
      }
   }
}

Baue erstmal eine Engine ohne viel "static" und dann kann man nochmal drüber reden, wo es Probleme gibt und wie man diese evtl. mit Patterns lösen kann ...
 

faraday

Mitglied
Hey, vielen Dank für deine Antwort Ruzmanz! :)

Den "Schönheitsfehler" mit der Eingabe des Spielers hab ich bereits korrigiert. Stattdessen habe ich eine statische Methode eingefügt, die einen Spieler hinzufügt. Du bist also der Meinung, dass die World-Klasse Knotenpunkt jeglicher Aktionen sein sollte oder wie meinst du das?

Dass der Handler die Informationen nicht braucht seh ich ein! Aber dein Beispiel zeigt ja gerade genau den Vorteil der Singleton, nämlich dass ich alle Methoden dieser Klasse statisch aufrufen kann, ohne mir Gedanken um eine Instanz zu machen. Ferner wollte ich mit der Singleton-World sicherstellen, dass im Hintergrund nicht mehrere Welten geladen werden, sondern tatsächlich nur eine gleichzeitig. Ich weiß nicht wie aufwändig die Generierung einer Welt sein wird, darum war mir das vorerst wichtig. Ist das kein guter Gedanke?

Außerdem möchte ich das Ganze mit zwei Hintergründen machen (vielleicht sind meine Ziele auch zu hoch...).

Erstens: Ich möchte später Spielstände speichern können.
Zweitens: Ich möchte die Möglichkeit haben, die Engine von textbasierend auf grafisch erweitern zu können.

Was meinst du dazu?

Liebe Grüße fara
 

minzee

Bekanntes Mitglied
Die Zeitschrift "iX DEVELOPER" widmet sich in der aktuellen Ausgabe 1/2015 ganz der Spiele-Entwicklung. Das ist recht interessant. Es wird zwar alles nur extremst oberflächlich behandelt, aber es liefert doch ein paar interessante Infos.

Ich persönlich fand den Beitrag zur künstlichen Intelligenz recht interessant. Aber gleich vorweg: was in dem Artikel beschrieben wird, hat noch überhaupt nichts mit KI zu tun, weil in keinster Weise darauf eingegangen wird, wie ein System lernen kann. Was aber an dem Artikel interessant ist, wie man ein Spiel modular aufbauen kann.

Hier wird scheinbar auf das Command-Pattern zurückgegriffen. Für alle möglichen Aktionen gibt es eigene Bausteine. Die können dann beliebig in einer Baumstruktur (im Artikel "Behavior Tree" genannt) angeordnet werden. Statt also das ganze Programm in einem einzigen Stück zu schreiben, wird es in Bausteine aufgeteilt. Dadurch wird das Programm recht flexibel, da man Bausteine einfach aus dem Baum entfernen und irgendwo hinzufügen kann.

Neben Aktions-Bausteinen gibt es auch Bausteine, die den Datenfluss steuern. So gibt es z. B. Sequenz-, Selektor- und Iterator-Bausteine. Es kann auch rekursiv gearbeitet werden. Die Bausteine arbeiten alle mit einer gemeinsamen Datenbasis. Das ist eine key-value-Datenbank, die im Artikel "Blackboard" genannt wird. Gibt es einen Baustein, um eine Figur irgendwo hinzubewegen, steht im Blackboard die Position, wo sie hinbewegt werden soll. Die Position ist der value, mittels eines eindeutigen keys wird dieser value ausgelesen.

Was ich diesem Artikel leider nicht entnehmen konnte ist, woher die Bausteine ihre keys kennen. Ich vermute, die müssen ihnen im Konstruktor übergeben werden. Die sind sicher auch wichtig, um für rekursive Aufrufe Abbruchbedingungen definieren zu können. Leider ist die ganze iX-Ausgabe fast nur reine Theorie. Programme sind absolute Mangelware. Zu dem Beitrag "KÜNSTLICHE INTELLIGENZ" gibt es kein einziges Programm.

iX DEVELOPER gibt es im Zeitschriften-Handel, kostet 12,90 € in Deutschland, 14,20 € in Österreich und 25,80 CHF in der Schweiz. Informationen zum Behavior-Tree gibt es auf Behave Documentation (habe ich mir aber noch nicht durchgelesen).
 
Zuletzt bearbeitet:

minzee

Bekanntes Mitglied
Hier ein Pseudocode, wie das vielleicht aussehen könnte:
Java:
interface Node
{
   const FAILURE = 0;
   const RUNNING = 1;
   const SUCCESS = 2;
   int tick();
}
abstract class Control implements Node
{
   protected Node[] childs;
}
abstract class Action implements Node
{
}
class Sequence extends Control
{
   private int i;
   Sequence(Node[] childs)
   {
      this.childs = childs;
      i = 0;
   }
   int tick()
   {
      if(childs.length > 0)
      {
         childs[i].tick();
         i = (i + 1) % childs.length;
      }
      return Node.SUCCESS;
   }
}
class RunToPosition extends Action
{
   private Set<Object> blackboard;
   private string key;
   RunToPosition(Set<Object> blackboard, string key)
   {
      this.blackboard = blackboard;
      this.key = key;
   }
   int tick()
   {
      int position = blackboard.get(key);
      System.out.println("Laufe zu Position " + position);
   }
}
class Main
{
   public static void main(String[] args)
   {
      Set<Object> blackboard = new Set<Object>();
      blackboard.put("position1", 1);
      
      RunToPosition runTo1 = new RunToPosition(blackboard, "position1");
      
      Sequence root = new Sequence({runTo1});
      root.tick();
   }
}
Bitte nicht als Java-Programm ansehen. Es hat sicher mindestens 1001 Fehler ;)
Mehr Zeit habe ich jetzt leider nicht.
 
Zuletzt bearbeitet:

faraday

Mitglied
@minzee: Wenn ich das also recht verstehe, basiert das Ganze darauf eine endliche Menge an Aktionen zu definieren und ein Event anhand einer Sequenz dieser Aktionen, die nacheinander abgearbeitet werden, zu realisieren?

Liebe Grüße fara
 

minzee

Bekanntes Mitglied
Im Interface habe ich es schon angedeutet. Bei jedem Durchlauf (tick) werden die childs gecheckt. Ein child kann FAILURE, RUNNING oder SUCCESS zurückliefern. In meiner Klasse RunToPosition fehlt dieser return noch.

- Ist ein Baustein noch mit einer Aktion beschäftigt, liefert er RUNNING zurück. Z. B. eine Figur bewegt sich noch in Richtung seiner Zielposition.

- Hat ein Baustein nichts zu tun, weil er vielleicht irgendeine bestimmte Aktion bereits erfolgreich beendet hat, gibt er SUCCESS zurück. Z. B. eine Figur hat eine bestimmte Zielposition eingenommen.

- Kann ein Baustein ein geforderte Aktion nicht ausführen, gibt er FAILURE zurück. Z. B. eine Figur soll eine bestimmte Zielposition einnehmen, kann es jedoch nicht, weil sich dort bereits eine andere Figur befindet.

Der Baustein "Sequenz" ist nun ein ganz bestimmtes Steuerungselement. Ihm können mehrere childs übergeben werden.

- Liefert irgendeines dieser childs ein FAILURE, werden die folgenden childs nicht mehr abgearbeitet und das Sequenz-Steuerelement gibt selbst FAILURE zurück.

- Liefert einer dieser childs RUNNING, werden die folgenden childs ebenfalls nicht mehr abgearbeitet und das Sequenz-Steuerelement gibt ebenfalls RUNNING zurück. Sofern dieses Steuerelement beim nächsten Durchlauf (tick) jedoch nicht mehr RUNNING, sondern dann SUCCESS zurückliefert, werden die folgenden childs abgearbeitet.

- Liefern die childs SUCCESS, wird gleich das nächste child abgearbeitet.

Neben dem Baustein Sequenz gibt es noch weitere Steuerknoten. Die haben dann eine etwas andere Aufgabe und zeigen im Umgang mit den Rückmeldungen der childs ein etwas anderes Verhalten.

Zumindest habe ich das so verstanden. Sofern das so korrekt ist, vermute ich, dass man hier mit Threads arbeiten muss. Denn ich wüsste nicht, wie ansonst ein child ein RUNNING zurückgeben könnte. Aber vielleicht wisst ihr das, wie man so etwas programmieren kann.
 
Zuletzt bearbeitet:

faraday

Mitglied
Hey,
ich glaube das geht gerade etwas über meine Programmierkenntnisse hinaus. Das ließe sich sicher irgendwann implementieren - wenn mehr Zeit zur Verfügung steht. Aber generell die Idee, die Aktionen einzeln zu betrachten und Events als Objekte darzustellen, die sequenziell Aktionen durchlaufen, ist an sich ziemlich gut...denke ich.

Beizeiten werde ich mich mal mit deinem Link beschäftigen. Ich hab ihn bereits in meinen Favourites.^^

Liebe Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Wizzard-Game Java Basics - Anfänger-Themen 3
Jxhnny.lpz bouncing Ball (Brick-Breaker-Game) Java Basics - Anfänger-Themen 1
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
P Moore Nachbarschaft-Game of Life Java Basics - Anfänger-Themen 1
P 2D Game Java Basics - Anfänger-Themen 6
B Verwirrender Game Loop Java Basics - Anfänger-Themen 6
L Conways Game of Life Java Basics - Anfänger-Themen 4
J Game of life Java Basics - Anfänger-Themen 3
B "Snake"-Game verbuggt Java Basics - Anfänger-Themen 0
K Game of live Java Basics - Anfänger-Themen 4
F Java Collectors Game Hilfe Java Basics - Anfänger-Themen 4
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
E Belebeste Area im Game of Life suchen Java Basics - Anfänger-Themen 0
B Wer kennt einen Link für vollständiges, leichtverständliches "Game of Life"? Java Basics - Anfänger-Themen 1
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
C Game of life Java Basics - Anfänger-Themen 14
K Gutes Java 3D Game Tutorial gesucht Java Basics - Anfänger-Themen 6
Java-Insel Game-Konzept Java Basics - Anfänger-Themen 10
G Game Loop Problem Java Basics - Anfänger-Themen 9
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
V Start ins Java Game Development Java Basics - Anfänger-Themen 22
I Programm Game & AR Java Basics - Anfänger-Themen 13
P Game of Life Java Basics - Anfänger-Themen 18
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
D Game of Life - Nachbarn zählen Java Basics - Anfänger-Themen 8
Developer_X Game of Life Java Basics - Anfänger-Themen 10
L Game of life in einem FensterVisualisieren Java Basics - Anfänger-Themen 2
D Game of Life Java Basics - Anfänger-Themen 14
T Anagram Game - warum ist es auf 2 Packages aufgeteilt? Java Basics - Anfänger-Themen 3
S 3d-game java3d/eigene API Java Basics - Anfänger-Themen 4
C Pong Game Java Basics - Anfänger-Themen 2
K Android 2d engine mit fortlaufendem hintergrund Java Basics - Anfänger-Themen 1
J javascript engine string ausführen Java Basics - Anfänger-Themen 10
M JCaptcha: Mathe-Captcha-Engine Java Basics - Anfänger-Themen 3
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
E Mittelquadratmethode für Hexadezimalzahlen Java Basics - Anfänger-Themen 1
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
T Übungsbuch für Anfänger Java Basics - Anfänger-Themen 3
L Konzept für Quiz Java Basics - Anfänger-Themen 33
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben