Wie implementiere ich eine rundenbasierte Spiel-Engine?

17

Stellen wir uns ein Spiel wie Heroes of Might and Magic oder Master of Orion oder ein rundenbasiertes Spiel Ihrer Wahl vor. Welche Spiellogik steckt hinter der nächsten Runde? Gibt es Materialien oder Bücher zum Thema zu lesen? Um genau zu sein, stellen wir uns eine Spieleschleife vor:

void eventsHandler(); //something that responds to input
void gameLogic(); //something that decides whats going to be output on the screen
void render(); //this function outputs stuff on screen

Alle, die angerufen werden, sagen wir 60 Mal pro Sekunde. Aber wie tritt rundenbasiert hier ein? Ich könnte mir vorstellen, dass es in gameLogic () eine Funktion wie endTurn () gibt, die auftritt, wenn ein Spieler auf diese Schaltfläche klickt, aber wie gehe ich damit um? Brauchen Sie Einblicke.

Dvole
quelle

Antworten:

21

Ein rundenbasiertes Spiel wird von einer Zustandsmaschine gesteuert . Grundsätzlich würden Sie eine Reihe von Zuständen auslegen, die in einer logischen Reihenfolge auftreten können.

Auf einem hohen Level kann der Zug eines Spielers der Beginn eines neuen Zustands sein, gefolgt von allen möglichen Aktionen, die in diesem Zug zulässig sind.

Zum Beispiel

  • State - Spieler wechseln
    • Jetzt ist Spieler 1 an der Reihe
  • Aktionen erlaubt
    • Attacke
      • Wähle den Feind zum Angriff aus
    • verteidigen
      • Wähle die zu verteidigende Einheit
    • Einheit bewegen
      • Wählen Sie die zu bewegende Einheit
      • Überprüfen Sie, ob Bewegung erlaubt ist
    • etc

Offensichtlich wird dies ziemlich schnell in die Höhe schießen, da ich nur einen äußerst begrenzten Plan skizziert habe. Wenn Sie frühzeitig einen guten Überblick über mögliche Zustände haben, sollten Sie in der Lage sein, diese umzusetzen. Ich würde es sehr betonen, genau zu skizzieren, wie das Spiel ablaufen soll ... ein gutes rundenbasiertes Spiel erfordert viel Planung, IMO.

dich
quelle
Ein ziemlich altes Schulprojekt von mir, das ein dreimonatiger Entwicklungsversuch bei Final Fantasy Tactics war :) Verwendet eine Zustandsmaschine (einige von ihnen tatsächlich) wie oben beschrieben. sourceforge.net/projects/bpfat
James
Hey, was ist mit Game Engine für rundenbasierte Strategie? Könnten Sie etwas raten? Darf der unwirkliche Motor passen?
Rantiev
Jedem das Seine. Wenn Sie mit dem Unreal-Motor vertraut sind, ist daran nichts auszusetzen. Es kommt nur darauf an, welche Mechanik Sie nutzen möchten. Eine Schnellsuche zeigt an, dass für die Unreal-Engine ein aktuelles Toolkit vorhanden ist, mit dessen Hilfe rundenbasierte Strategiespiele erstellt werden können, das jedoch nicht kostenlos ist.
the_e
3

Ich habe kürzlich ein rundenbasiertes Strategiespiel ähnlich dem von Master of Orion entwickelt (es ist derzeit nur ein Einzelspieler, Multiplayer wäre etwas komplexer, aber eine ähnliche Idee) Hauptklasse Game Controller):

//for all computer players:
computerTakeTurn(player)

//for all players
moveShips(player)

//for all players
endTurn(player)//see this function below

//for all planets
planet.repairFleet()

//for all players
resolvePlanetaryConflicts(player)

//check to see if any players were destroyed or if the game is over
checkPlayerDestroyedAndGameOver()

Die End Turn-Funktion meines Spielers führt spezifische Funktionen für diesen Spieler aus, die von der Reihenfolge, in der sie zwischen den Spielern ausgeführt wird, nicht betroffen sind:

eatAndStarve()

generatePlayerResources()

buildPlayerPlanetImprovements()

growPlayerPlanetPopulation()

Gegebenenfalls geben diese Funktionen Statusmeldungen zurück und / oder lösen Ereignisse aus, damit die grafische Benutzeroberfläche anzeigen kann, was während des Spielzugs passiert ist, oder den Spieler darüber informieren kann, dass ein Computer zerstört wurde usw.

Matt Palmerlee
quelle
Könnten Sie bitte den Quellcode bereitstellen, um das Produkt zu überprüfen? Wäre eine große Hilfe. Nur für pädagogische Zwecke.
Dvole
@Dvole Ich arbeite derzeit an der Konvertierung des Codes von Silverlight / C # in JavaScript mithilfe des HTML5-Canvas-Tags. Sobald ich fertig bin, plane ich, den Code zu öffnen, und zu diesem Zeitpunkt sind Sie mehr als willkommen, um zu sehen, wie genau ich diese Funktion implementiert habe. Wenn es hilft, Kontext zu erhalten, können Sie mein Weltraumstrategiespiel hier spielen: Astriarch - Herrscher der Sterne
Matt Palmerlee
2
@Dvole Es hat einige Zeit gedauert, aber ich habe gerade die Silverlight-Version von Astriarch geöffnet. Wenn Sie immer noch interessiert sind, können Sie den Quellcode von github hier herunterladen: github.com/mpalmerlee/Astriarch/tree/Silverlight
Matt Palmerlee