Rundenbasiertes Spiel-Design: Event-Driven vs. Game Loop

Erstelle ich mein erstes Spiel in Java. Das Spiel Monopoly. Ich bin kämpfen mit, wie ich das design des Spiels zu Modell seinen turn-basierte Struktur (managing Spieler dreht). Ich möchte ermöglichen, die sowohl für eine einzelne Mensch-gesteuert und ein oder mehrere KI-gesteuerte Spieler um das Spiel zu spielen.

Mein spezielles Problem ist, dass ich nicht weiß, ob die Umsetzung einer game-loop oder nicht, also eine Schleife, die Sie verwalten können, die Spieler und die Variablen direkt mit dem Monopoly-Spiel, (denken Sie an Dinge wie die Aufforderung, die jeder Spieler für Ihren Zug, erhöht die wiederum an den nächsten Spieler, oder der erste Würfel rollt sich aus jeder Spieler—wiederum). Ich beziehe mich nicht auf die mehr low-level bedeutet der Begriff "game-loop", das bezieht sich mehr auf das zeichnen von frames auf dem Bildschirm, Aktualisierung Physik oder aktualisieren AI bei einer bestimmten Geschwindigkeit der Zeit.

Mein Verständnis ist, dass meine Optionen für den Versuch, das umzusetzen, was ich brauche, sind:

  1. Implementieren eine vollständig ereignisgesteuerte Programm, das hat keine solche Spiel-Schleife, oder
  2. Umsetzung einer game loop—etwas, das lange im hintergrund läuft und im Grunde nie endet, solange das Spiel läuft. Dies wäre die weitere Vorgehensweise.

Als ich zuerst anfing zu versuchen, dieses Problem zu lösen, lief ich in Probleme von meinem UI einfrieren, weil mein Spiel-Schleife nie endet und wurde vollständig verbraucht den thread, auf dem es ausgeführt wurde (ich habe gerade eine sehr einfache while-Schleife, um dies zu illustrieren). Also ging ich, um den Aufwand der Erstellung einer SwingWorker zu Kapseln, mein Spiel-Schleife. Das löste das Problem der UI gefriert, aber immer noch wundert mich, falls ich den falschen Weg eingeschlagen.

Als eine Allgemeine Regel, ich fand, dass die meisten Ratschläge auf der web im Allgemeinen scheint zu Gunsten jeder Ansatz, der die event-driven -, und somit meine aktuelle Implementierung unter Verwendung einer SwingWorker könnte ein Schritt in die falsche Richtung. Aber ich kann nicht begreifen, wie ich das umsetzen würden eine komplett event-driven-system für diese spezielle Aufgabe (also kein Spiel-Schleife vorhanden). Es scheint mir, dass eine Schleife muss irgendwo existieren für die Verwaltung der Spieler dreht.

Hier meine konkreten Fragen:

  1. Sind Spiel-loops (wie ich es bin, die diese beschreibt) geeignet für turn-basierte Spiele wie Monopoly—speziell für queuing-der Spieler dreht, und daß der entsprechende Spieler an der Reihe, einen Spieler zu einem Zeitpunkt (und queuing-das gesamte Verfahren der/die Abfolge der Schritte, aus denen ein Zug)?
  2. Wenn ein rein Ereignisgesteuertes system geschaffen würden, für die Verwaltung der Spieler dreht sich, wie Sie Durchlaufen wird jeder Spieler aufgefordert, Ihre drehen und halten Durchlaufen, bis das Spiel endet?
  3. Wenn ein Spiel loop verwendet werden, um zu lösen das problem oben beschrieben, muss es sein, die Ausführung in einem eigenen thread (evtl. mit SwingWorker), um zu vermeiden das einfrieren der UI? Meine situation ist Java-spezifisch, aber ich glaube, ich wäre daran interessiert, Antworten für nicht-Java-spezifischen Situationen.

Derzeit, ich habe meinen code organisiert der MVC-Muster. Mein controller ist, wo mein Spiel-Schleife (dem eigentlichen SwingWorker thread) befindet. Es ist bei weitem nicht vollständig, aber es hilft, veranschaulichen, wie ich bin Geschäftsführer player macht in dem, was ich rufe einen "game-loop".

SwingWorker code aus dem controller:

swingWorker = new SwingWorker<Void, Model>() {
@Override
protected Void doInBackground() throws InterruptedException {
gameLoopRunning = true;
while (gameLoopRunning) {

    //to do: use a timer instead of thread.sleep
    Thread.sleep(1000);

    //user turn prompt
    if (model.getActivePlayer().isUserControlled()) {

        boolean userRolled = false;
        while(!userRolled) {
            System.out.println("Roll the dice please...");
            Thread.sleep(3000);
        }

    }
    //bot turn prompt
    else {
        //insert code for bot rolling dice here
        model.rollDice();
    }

    publish(model);

    Thread.sleep(1000);
    model.incrementPlayerTurn();
    publish(model);

}
return null;
}

@Override
protected void process(List<Model> chunks) {
Model gameModel = chunks.get(chunks.size() - 1);
//hard-coded for 6 players
for (int i = 0; i < 6; i++) {
    view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn());
}
view.getGamePanel().getDice().setDie1(model.getDie1());
view.getGamePanel().getDice().setDie2(model.getDie2());
}

};
swingWorker.execute();
  • Monopol ist nicht viel anders als Schach, für mich macht es mehr Sinn, lass es sein eventdriven-wie wird es ermöglichen, die Umsetzung der Regeln sehr viel einfacher, wie im Schach, da jedes Ereignis versucht, Einfluss auf einige Zustand.
  • Egal wie Sie es umsetzen, werden Sie wahrscheinlich nicht wollen, dass Ihre gameplay-CPU-Zyklen werden im UI-thread ausgeführt.
  • was ist mit dem finite-state-Maschine zu represente Spiel-Status ändert ? Ich einst in einem "Rohzustand" zu entwickeln, die ein Dame-Spiel, mit Ereignis-basierten UI-code.
InformationsquelleAutor nairware | 2013-07-25
Schreibe einen Kommentar