Wie soll ich ein wirtschaftsbasiertes Spiel im Code modellieren?

10

Ich möchte ein Wirtschaftsspiel erstellen, das auf einer alten Zivilisation basiert. Ich bin mir nicht sicher, wie ich es gestalten soll. Wenn ich an einem kleineren Spiel wie einer Kopie von "Space Invaders" arbeiten würde, hätte ich kein Problem damit, es so zu strukturieren:

  • Hauptkontrollklasse
  • Grafikklasse
  • Spielerklasse
  • Feindliche Klasse

Ich verstehe nicht, wie ich das für größere Projekte wie mein Wirtschaftsspiel machen würde. Erstelle ich eine Länderklasse, die eine Reihe von Städten enthält? Enthalten die Städte viele Bauklassen, die meisten Klassen von Menschen? Mache ich eine Pfadfindungsklasse, auf die der Spieler zugreifen kann, um sich fortzubewegen?

Matthew G.
quelle
3
Möglicherweise möchten Sie eine Form eines Entity-Component-Systems verwenden (hier ist die kanonische Referenz ) - die Entities müssen sich überhaupt nicht selbst zeichnen (insbesondere, wenn Sie viele davon haben).
ThorinII
9
Sie wären furchtbar überrascht, wie schrecklich, unorganisiert und zusammengehackt die meisten "großen" Spiele sind. Sie basieren auf Fristen und Meilensteinen. Schreiben Sie einfach ein Spiel, und jede Struktur, die aus dem herausfällt, was Sie schreiben müssen, wird ungefähr so ​​gut, wenn nicht sogar besser sein als die meisten AAA-Spiele da draußen.
Sean Middleditch
Selbst wenn Sie kein vollwertiges ECS verwenden, ist es immer noch schön, Code nicht zu duplizieren. Lassen Sie den Controller die Entitäten iterieren und den Renderer aufrufen oder lassen Sie den Renderer scannen. Ein kleines Code-Update an 100 Stellen durchzuführen ist ein Schmerz.
MickLH
1
Von Space Invaders zu einem komplexen Spiel zu springen, wie Sie es beschrieben haben, ist meiner Meinung nach etwas drastisch. Es gibt weitere Lernschritte zwischen diesen beiden Spielen, bevor Sie in ein großes Spielprojekt einsteigen. Erwägen Sie, eine 2D-Sidescroller-Plattform zu erstellen und die Komplexität Ihrer Spiele schrittweise zu erhöhen. Wenn Sie vom ersten in den fünften Gang wechseln, können Sie bis zu 120 km / h erreichen, jedoch nicht mit der gleichen Effizienz (Zeit / Mühe), die Sie benötigen, wenn Sie sich von Stufe zu Stufe bewegen.
Emir Lima
2
Sie scheinen hier zwei Fragen zu haben, und ich kann nicht sagen, welche für Sie wichtiger ist. In der ersten geht es darum, wie Sie vermeiden können, viele Verweise auf Objekte weiterzugeben, und in der zweiten geht es darum, wie Sie die Zuordnung der logischen Entitäten in Ihrem Spiel zu Klassen im Code angehen sollten. Diese Fragen haben unterschiedliche Antworten, und ich denke, Sie sollten unterschiedliche Fragen für sie stellen. Ich werde Ihren Teil "Vermeiden, Referenzen zu übergeben" herausarbeiten. Sie können es gerne erneut veröffentlichen (und diese Website auch nach Themen zum Thema "Vermeiden von Singletons und Globals" durchsuchen, da die Antworten sehr ähnlich sind).

Antworten:

5

Erstelle ich eine Länderklasse, die eine Reihe von Städten enthält?

Sicher.

Enthalten die Städte viele Bauklassen, die meisten Klassen von Menschen?

Sicher.

Mache ich eine Pfadfindungsklasse, auf die der Spieler zugreifen kann, um sich fortzubewegen?

Sicher.

Alles, was Sie oben vorgeschlagen haben, scheint vernünftig. Auf lange Sicht ist es vielleicht nicht der beste Weg für Sie, aber das ist in Ordnung. Es ist für Sie offensichtlich sinnvoll zu wissen, da es das Organisationsmodell ist, das Ihnen zuerst einfiel. Es ist wichtig, dass Sie das nehmen und eine Implementierung daraus beginnen. Es wird Ihnen beide den Einstieg erleichtern und Sie über diese anfängliche "Design-Lähmung" hinwegbringen, die Entwickler zu Beginn einer Aufgabe häufig plagt, und Ihnen (wenn es sich in irgendeiner Weise als fehlerhaft herausstellt) ein oder zwei Dinge über die Vor- und Nachteile beibringen dieser besonderen Herangehensweise an Design.

Sie haben die Konzepte natürlich in Ihren Kopf genommen und sie nach einfachen Regeln in Code gruppiert:

  • Unterscheidet sich dieses Konzept erheblich im Verhalten oder in den Daten von anderen Objekten, die ich bereits habe? (Länder und Menschen teilen, wenn überhaupt, nur sehr wenig aussagekräftige Daten oder Verhaltensweisen, daher sollten sie im Spiel durch unterschiedliche Typen dargestellt werden.)
  • Muss ich dieses Konzept im Code überhaupt in nennenswerter Weise manipulieren (wenn Ihr Spiel mit einzelnen Personen zu tun hat, benötigen Sie möglicherweise diese PersonKlasse, aber wenn sich das Spiel nur um sie insgesamt kümmert, wie in früheren Versionen von SimCity, Sie Möglicherweise werden dieser Typ oder Instanzen dieses Typs nicht benötigt, um eine 1: 1-Zuordnung der Bevölkerung einer Stadt zu erstellen int populationCount.
  • Benötigt dieses Konzept Zustand ? Wenn ja, sollte es irgendwie gekapselt sein, damit ich diesen Status (eine Klasse) anstatt einer Reihe freier Funktionen speichern kann. (Eine Pfadfindungsimplementierung verfügt nicht über ein analoges reales Objekt, erfordert jedoch die Verfolgung von Daten, z. B. welche Knoten in der Karte bereits berücksichtigt wurden. Dies geschieht besser über eine Klasse als durch Speichern in einem Bündel von versteckten Globalen und freistehenden Funktionen).

Die Beantwortung dieser Fragen ist zwar einfach, kann Ihnen jedoch bei der Entscheidung, ob und wie ein mentales Konzept in Quellcode umgewandelt werden soll, sehr zugute kommen. Vielleicht möchten Sie sich auch über die SOLID-Prinzipien des objektorientierten Designs informieren .

Beachten Sie, dass der in den Kommentaren gemachte Vorschlag eines Entitäts- / Komponentensystems ebenfalls ein gültiger Ansatz ist, obwohl ich ihn hier vermeiden würde, es sei denn, Sie planen Ihr Projekt kleiner ein (einfach, weil Sie möglicherweise zwei neue, große Herausforderungen in einem Projekt annehmen zu entmutigend sein und den Bildungsnutzen verwässern, den Sie sonst erhalten würden, wenn Sie sich nur auf einen konzentrieren). In einem komponentenorientierten Modell wird der "Typ" in den obigen Fragen impliziter: nicht der konkrete Typ im Code, sondern der implizite Typ, der durch die Sammlung von Komponenten definiert wird, die eine Entität bilden. Es können die gleichen Leitprinzipien gelten.


quelle
1

Was Sie beschrieben haben (eine Klasse für jeden Haupttyp eines logischen Spielobjekts), ist für ein so einfaches Spiel durchaus sinnvoll. Wenn Sie zum ersten Mal ein Spiel dieser Art schreiben, würde ich vorschlagen, es auf diese Weise zu tun.

Nur ein paar Tipps:

  • Unterscheidet sich ein Spieler wirklich von einem Feind ? Viele der Funktionen sind wahrscheinlich gleich, daher sollten diese normalerweise dieselbe Klasse sein oder von derselben Basisklasse erweitert werden. Stellen Sie sich eine AbstractPlayer- Basisklasse mit zwei Unterklassen HumanPlayer und AIPlayer vor - alle allgemeinen Funktionen können in AbstractPlayer enthalten sein .
  • Konfigurieren Sie Objekte lieber mit Komposition als mit Vererbung. Machen Sie Ihre Vererbungshierarchien nicht zu tief. Wenn Sie eine Klasse ForgeWithSteelAnvil aufrufen , sollten Sie sich Sorgen machen: Eine Forge kann eine Unterklasse von Building sein , aber der verwendete Amboss-Typ sollte ein im Gebäude enthaltenes Objekt sein.
  • Bevorzugen Sie ebenfalls Eigenschaften , mit denen Sie Objekte konfigurieren können, anstatt Hunderte leicht unterschiedlicher Objektklassen hinzuzufügen.

In komplexeren Spielen gibt es fortgeschrittenere Techniken, die Sie verwenden können. Ich empfehle jedoch , diese erst zu verwenden, wenn Sie mit dem grundlegenden OOP-Ansatz sehr vertraut sind (dh einige abgeschlossene Spiele erfolgreich abgeschlossen haben). Fortgeschrittenere Ansätze könnten Folgendes umfassen:

  • Prototypbasierte Objektmodelle - Verwenden Sie eine einzige Klasse für alle Spielobjekte und modellieren Sie alle Ihre Objekte anhand von Eigenschaften / Attributen und Kompositionen. Viel flexibler / dynamischer als Standard-OOP, aber schwieriger zu verwalten (insbesondere hilft Ihnen der Compiler nicht viel, wenn Sie etwas Dummes tun). Ich habe dies in meinem kleinen Roguelike-Spiel Tyrant ( https://github.com/mikera/tyrant ) gut genutzt.
  • Entitätskomponentensysteme - gut, wenn Sie viele komplexe Verhaltensweisen haben, die Sie in vielen verschiedenen Arten von Spielobjekten mischen und anpassen möchten. Sehr mächtig, aber schwer richtig zu machen.
mikera
quelle
0

Es gibt nur wenige Methoden, mit denen Sie Ihre Entitäten und Datensätze organisieren können. Ich schreibe lieber ein Tabellenkalkulationsdokument und teste Daten, die sich hin und her bewegen, um sicherzustellen, dass ich effizient bin. Wenn Sie das Spiel selbst machen, denken Sie daran, dass es für Sie Sinn machen muss. Manchmal ist es am effizientesten, den Code etwas weniger effizient zu gestalten, um das Projekt zu vereinfachen.

Wenn Sie weitere Hilfe bei der Strukturierung Ihrer Inhalte benötigen, suchen Sie einen alten Spielquellcode, der eine ähnliche Struktur oder einen ähnlichen Stil verwendet, und finden Sie dessen Lösung. Dann verfeinern Sie es und reparieren Sie es nach Ihren Wünschen.

Beelzebub
quelle
-1, da dies nicht die Organisation des Codes zu betreffen scheint und der Vorschlag, blind zu kopieren, was ein anderes Spiel tut, ohne Möglichkeiten zu diskutieren, die Kompromisse zwischen den Designentscheidungen zu verstehen, die das Spiel getroffen hat.