Laden von Daten für ein Rollenspiel

8

Ich erstelle ein kleines Text-Rollenspiel, um Python zu üben, und habe eine Frage zum Laden von Daten. Das Spiel ist ein Wild-West-Spiel, obwohl das nicht allzu relevant ist, und ich muss Listen mit Waffen und ihren Eigenschaften sowie Listen mit Charakteren, Szenarien usw. speichern. Ich habe eine gute Vorstellung davon, wie man sie darstellt Diese Daten als Klassen, aber ich bin nicht so klar, wie die Daten gespeichert und geladen werden sollen.

Meine Hauptfrage dreht sich um die Beziehung zwischen Daten und Klassen. Ich habe einige Beiträge hier auf SE gelesen und viele beziehen sich auf die Speicherung, daher habe ich dort einige gute Informationen.

Wann sollte ich diese Daten laden? Zum Beispiel wählt der Spieler zu Beginn des Spiels aus mehreren Waffen. Sollte ich an diesem Punkt alle Waffen laden und alle Waffenobjekte instanziieren? Sollte die Waffenklasse die Möglichkeit haben, Waffen aus der Datenbank anzuzeigen, ohne sie zu instanziieren?

Vielen Dank für jede Hilfe.

timfreilly
quelle

Antworten:

7

Da Sie ein "kleines" Text-Rollenspiel sagen, würde ich raten, einfach alles vorzuladen. Wenn wir nicht über eine enorme Menge an Inhalten sprechen, sollte dies keinen großen Unterschied für die Startzeit bedeuten und die Dinge, wie Björn empfiehlt, einfach halten.

Eine Sache, die mir beim Lesen Ihrer Frage einfällt, ist, dass Sie möglicherweise den Unterschied zwischen einer Waffe und einem Waffentyp berücksichtigen möchten . Ich bevorzuge immer eine klare Unterscheidung zwischen den beiden und beide im Code modelliert zu haben, damit ich Fragen zum Waffentyp stellen kann, ohne unbedingt eine Instanz zur Hand haben zu müssen. (Eine Möglichkeit, dies zu tun, besteht darin, dass der Waffentyp die Klasse ist, mit Klassenmethoden, mit denen Sie interagieren können, und die Waffe eine Instanz dieser Klasse ist. Ich bevorzuge diesen Ansatz eigentlich nicht, weil er dann entweder unmöglich ist oder Es ist unglaublich chaotisch, wenn eine Waffe den Typ ändert. Das ist natürlich nicht für alle Spiele relevant.)

Chaos
quelle
Wie würden Sie diese im Code unterscheiden? Ich bin in der Tat auf dieses Problem gestoßen.
Timfreilly
1
Ich habe es so gesehen, dass die Waffentypen Objekte sind, die über das Muster "Brokered Definition Set" verwaltet werden, über das ich in dieser SO-Frage spreche : stackoverflow.com/questions/401720/… , und jedes Waffenobjekt weiß, über welchen Typ es ist einen ID-Code. Sie können also tun obj->setWeaponType(WEAPON_TYPE_SHOTGUN)oder was auch immer, und die Waffe konfiguriert sich entsprechend. Waffenleistungsmetriken verwenden möglicherweise die Werte des Typs als Basislinie, ermöglichen jedoch, dass das Endergebnis von der Instanz geändert wird. Diese Art von Ding.
Chaos
Das ist etwas zum Nachdenken, danke für den Link. Was würden Sie in einer Situation tun, in der Sie eine Liste der verfügbaren Waffentypen anzeigen möchten? Geht diese Art von Anfrage über die Broker- / Typversion?
Timfreilly
1
@ Timfreilly: Es kommt auf den Kontext an. Wenn es so etwas wie ein Geschäft ist, würde ich normalerweise den Ort mit tatsächlichen Waffeninstanzen füllen und dem Spieler ihre Beschreibungen anzeigen lassen. Wenn es sich um eine Entwicklerübersicht oder eine Hilfeschnittstelle handelt, würde ich den Broker-Daemon nach dem vollständigen Satz von Waffentypdefinitionen fragen und Informationen dazu anzeigen.
Chaos
4

Laden Sie alles am Anfang. Komplizieren Sie Ihr Programm nicht, indem Sie Daten zwischen Speicher und Festplatte aufteilen, es sei denn, Sie müssen (z. B. wenn zu viel Speicher gleichzeitig vorhanden ist).

Wichtig ist, die Unterscheidung zwischen Daten, die Instanzen eines Elements darstellen, und Daten, die den Typ eines Elements darstellen, zu verstehen. Im Allgemeinen teilen mehrere Instanzen des ersteren eine gemeinsame Instanz des letzteren.

Kylotan
quelle
Ich könnte dort einige zusätzliche Informationen verwenden. Wie codieren Sie diesen Unterschied?
Timfreilly
1
@timfreilly: Ich habe eine Beispielklassenhierarchie für ein Element System wie bei Kylotan beschreibt gamedev.stackexchange.com/questions/4516/... ; Dies wird oft als Fliegengewichtsmuster bezeichnet.
Wie Joe sagt, ist das Flyweight-Muster eine Möglichkeit, dies darzustellen, indem diese 'Typ'-Daten implizit zwischen den Instanzen geteilt werden. Ich persönlich bevorzuge es, sie explizit zu vertreten, z. mit einer MonsterInstance-Klasse und einer MonsterType-Klasse. Jede Instanz von MonsterInstance hat einen Verweis auf die entsprechende MonsterType-Instanz.
Kylotan
(Ich würde auch tun, was Kylotan sagt, ich würde das immer noch ein Fliegengewichtsobjekt nennen.)
0

Ich bin mit Python nicht so vertraut. Der allgemeine Rat, den ich geben würde, ist, es einfach zu halten. Sie sagten, Sie hätten bereits eine Vorstellung davon, wie die Daten dargestellt werden sollen. Wenn Sie einige Klassen für die Daten haben, die Sie speichern möchten, können Sie diese in einer Liste speichern. Diese Liste kann dann auf Festplatte onSave serialisiert und onLoad deserialisiert werden. Für eine erste Implementierung und wenn die Daten nicht so groß sind, würde ich alles zu Beginn des Spiels laden und es zu bestimmten Zeitpunkten speichern.

Björn
quelle
0

Sie könnten SQLite verwenden . Mit SQLite können Sie Datenbanken im Speicher und auf der Festplatte erstellen, und Sie müssen kein riesiges DBMS wie MySQL installieren.

Grizwako
quelle