Turn-basiertes Spieldesign: Event-Driven vs Game Loop

8

Ich erstelle mein erstes Spiel in Java. Das Spiel ist Monopoly. Ich habe Probleme damit, das Spiel so zu gestalten, dass es seine rundenbasierte Struktur modelliert (Spielerwechsel). Ich möchte sowohl einem einzelnen vom Menschen kontrollierten als auch einem oder mehreren KI-kontrollierten Spielern erlauben, das Spiel zu spielen.

Mein spezielles Problem ist, dass ich nicht weiß, ob ich eine Spielschleife implementieren soll oder nicht, dh eine Schleife, die die Spieler und die mit dem Spiel von Monopoly in Verbindung stehenden Variablen verwaltet (denke an Dinge wie die Aufforderung an jeden Spieler) Sie sind an der Reihe, erhöhen den Zug zum nächsten Spieler oder würfeln von jedem Spieler - nacheinander. Ich beziehe mich nicht auf die low-level Bedeutung des Begriffes "game loop", die sich mehr auf das Zeichnen von Frames auf dem Bildschirm, das Aktualisieren von Physik oder das Aktualisieren von AI zu einer bestimmten Zeit bezieht.

Mein Verständnis ist, dass meine Optionen, um zu implementieren, was ich brauche, sind entweder:

  1. Implementieren Sie ein vollständig ereignisgesteuertes Programm, das keine solche Spielschleife hat, oder
  2. Implementieren Sie eine Spielschleife - etwas, das lange im Hintergrund läuft und im Grunde niemals endet, solange das Spiel läuft. Dies wäre der prozedurale Ansatz.

Als ich anfing zu versuchen, dieses Problem zu lösen, geriet ich in Probleme mit dem Einfrieren meiner Benutzeroberfläche, weil meine Spielschleife niemals endete und den Thread, auf dem sie lief, vollständig verzehrte (ich habe gerade eine sehr einfache while-Schleife gemacht) illustriere das). Also habe ich versucht, eine SwingWorker zu erstellen, um meine Spielschleife einzukapseln. Das löste das Problem von UI-Einfrieren, aber ließ mich immer noch fragen, ob ich den falschen Weg gehen würde.

Als allgemeine Regel habe ich festgestellt, dass die meisten Ratschläge im Web im Allgemeinen jeden Ansatz zu bevorzugen scheinen, der ereignisgesteuert ist, und daher könnte meine derzeitige Implementierung, die SwingWorker verwendet, ein Schritt in die falsche Richtung sein. Aber ich kann nicht vollständig begreifen, wie ich ein vollständig ereignisgesteuertes System für diese spezielle Aufgabe implementieren würde (dh keine Spielschleife vorhanden ist). Es scheint mir, dass irgendwo eine Schleife existieren muss, um die Spielerumdrehungen zu verwalten.

Hier sind meine spezifischen Fragen:

  1. Sind Game-Loops (wie ich sie beschreibe) für Turn-basierte Spiele wie Monopoly - speziell für die Schlange - geeignet, dreht sich der Spieler und fordert den passenden Spieler für seinen Zug auf, einen Spieler nach dem anderen (und stellt den gesamten Ablauf von / Reihenfolge der Schritte, die eine Wende umfassen)?
  2. Wenn ein rein ereignisgesteuertes System zum Verwalten von Spielerwechseln erstellt werden soll, wie durchläuft man jeden Spieler, um ihn zum Zug zu bringen und bis zum Ende des Spiels zu wiederholen?
  3. Wenn eine Spieleschleife verwendet werden sollte, um das oben beschriebene Problem zu lösen, muss es innerhalb eines eigenen Threads ausgeführt werden (möglicherweise unter Verwendung von SwingWorker ), um ein Einfrieren der Benutzeroberfläche zu vermeiden? Meine Situation ist Java-spezifisch, aber ich denke, ich wäre auch an Antworten für nicht-Java-spezifische Situationen interessiert.

Momentan habe ich meinen Code mit dem MVC-Muster organisiert. Auf meinem Controller befindet sich meine Spielschleife (der eigentliche SwingWorker -Thread). Es ist bei weitem nicht vollständig, aber es hilft zu veranschaulichen, wie ich Spielerwechsel in einer "Spielschleife" führe.

SwingWorker Code vom Controller:

%Vor%     
nairware 25.07.2013, 21:46
quelle

1 Antwort

9

Der Kommentar von SirDarius ist genau richtig.

Für etwas, das so einfach ist wie das Vorantreiben von Spielerumdrehungen, müssen Sie sich nicht wirklich darum kümmern, einen vollwertigen endlichen Automaten zu implementieren.

In Bezug auf MVC sollten Sie Folgendes für menschliche Spieler tun:

  • Das Modell: Stellt Methoden zur Verfügung, um den aktiven Spieler zum nächsten Spieler vorzurücken und den "Turn-Prozess" zu durchlaufen (z. B. Rollen des Würfels, Bewegen des aktiven Spielers usw.) ). Da ein Großteil des Turn-Prozesses ereignisgesteuert ist, werden diese Methodenaufrufe von Ereignis-Listenern im Controller ausgeführt.

  • Die Ansicht: Richtet ein Ereignis aus, wenn der aktive Spieler seinen Zug beendet hat, und hebt Ereignisse auf verschiedenen anderen Eingängen an.

  • Der Controller: Wenn ein Spieler seinen Zug beendet hat, sage dem Modell, dass es zum nächsten Spieler weitergehen soll, und starte den "Turn-Prozess" erneut. Immer wenn ein Spieler Eingaben macht, wird ein Ereignis ausgelöst, das dem Modell sagt, dass es in die nächste Runde des Zuges vorrücken soll.

Für AI -Player kann der Großteil des gleichen Codes verwendet werden, aber es macht keinen Sinn, dass der Turn-Progress von der View gesteuert wird. Stattdessen müsste das Modell eine andere "Turn-Prozess" -Methode haben, die speziell für KI-Spieler gedacht ist. Der einzige Unterschied besteht darin, dass der Code nacheinander ausgeführt wird, ohne auf Eingaben von der Ansicht zu warten, anstatt eine Serie von Ereignis-Listenern zu sein.

    
Luke M Willis 25.07.2013, 22:58
quelle