Ich bin dabei, ein einfaches Browser-Text-RPG zu starten, mit Charakteren, die (passiv) gegen andere Leute kämpfen können. Dies beinhaltet eine Liste von ungefähr 10 Fertigkeiten wie Stärke, Geschicklichkeit usw. mit zusätzlichen Fähigkeiten für verschiedene Waffen.
Gibt es eine bessere Möglichkeit, diese Charakterklasse zu entwerfen, als nur diese Fähigkeiten als Klassenattribut zu haben? Es scheint einfach, aber ich zögere, weil es Ungeschicklichkeit ist.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
quelle
quelle
Charactor
Klasse?Antworten:
Solange Sie Ihr System relativ einfach halten, sollte dies funktionieren. Wenn Sie jedoch Dinge wie temporäre Fähigkeitsmodifikatoren hinzufügen, werden Sie bald viel doppelten Code sehen. Sie werden auch auf Probleme mit verschiedenen Waffen mit unterschiedlichen Fähigkeiten stoßen. Da jeder Skill eine andere Variable ist, müssen Sie für jeden Skill-Typ einen anderen Code schreiben, der im Grunde dasselbe tut (oder einige hässliche Reflection-Hacks verwenden - unter der Voraussetzung, dass Ihre Programmiersprache sie unterstützt).
Aus diesem Grund würde ich Ihnen empfehlen, sowohl Fähigkeiten als auch Fertigkeiten in einer assoziativen Datenstruktur zu speichern, die Fähigkeitskonstanten auf Werte abbildet. Wie das elegant gemacht wird, ist von Programmiersprache zu Programmiersprache unterschiedlich. Wenn Ihre Sprache dies unterstützt, sollten sich die Konstanten in einem befinden
enum
.Um Ihnen ein Beispiel zu geben, wie dies in der Praxis funktionieren würde, würde Ihr Code zur Berechnung des Angriffsschadens ungefähr so aussehen:
quelle
getSkill()
dem Grundprinzip der objektorientierten Programmierung .Warum nicht verknüpfte Arrays verwenden? Dies bietet den Vorteil einer einfachen Erweiterung (beispielsweise mit PHP).
Für Dinge wie Waffen möchten Sie wahrscheinlich einige Basisklassen erstellen
Waffe -> Nahkampfwaffe, Fernkampfwaffe
und dann erstellen Sie Ihre Waffen von dort.
Das Endergebnis, das ich anstreben würde, ist eine Klasse, die so aussieht
Sie könnten alles in einem Array speichern, wenn Sie es auch wirklich wollten.
quelle
Ich werde versuchen, diese Frage so schnell wie möglich zu beantworten (oder zumindest so, wie ich es mir vorstelle). Es kann völlig übertrieben sein, abhängig von den Entwicklungen, die Sie über die Statistiken sehen.
Sie können sich eine SkillSet (oder Stats ) -Klasse vorstellen ( für diese Antwort verwende ich eine C-ähnliche Syntax):
Dann hätte der Held ein intrinsicStats-Feld vom Typ SkillSet. Eine Waffe könnte auch einen Modifikator skillSet haben.
Dies ist natürlich ein Beispiel, um Ihnen eine Idee zu geben. Sie können auch das Decorator-Entwurfsmuster verwenden, damit die Modifikatoren in den Statistiken als "Filter" fungieren, die nacheinander angewendet werden.
quelle
Die beste Art, Dinge zu tun, wäre wahrscheinlich, etwas mit Vererbung zu tun. Ihre Basisklasse (oder Superklasse, abhängig von der Sprache) wäre eine Person, dann erben vielleicht Schurken und Helden von der Basisklasse. Dann würden sich deine kraftbasierten Helden und flugbasierten Helden verzweigen, da sich beispielsweise ihr Transportmittel unterscheidet. Dies hat den zusätzlichen Bonus, dass Ihre Computerspieler die gleiche Basisklasse wie die menschlichen Spieler haben können und dies wird hoffentlich Ihr Leben vereinfachen.
Die andere Sache in Bezug auf Attribute, und dies ist weniger OOP-spezifisch, besteht darin, Ihre Zeichenattribute als Liste darzustellen, damit Sie sie nicht alle explizit in Ihrem Code definieren müssen. Vielleicht hätten Sie eine Liste für Waffen und eine Liste für physische Attribute. Erstellen Sie eine Art Basisklasse für diese Attribute, damit sie interagieren können. Jedes Attribut wird in Bezug auf Schaden, Energiekosten usw. definiert. Wenn also zwei Personen zusammenkommen, ist relativ klar, wie die Interaktion stattfinden wird. Sie würden die Liste der Attribute jedes Charakters durchlaufen und den Schaden, den ein Charakter dem anderen zufügt, mit einer gewissen Wahrscheinlichkeit in jeder Interaktion berechnen.
Mithilfe einer Liste können Sie vermeiden, dass viel Code neu geschrieben wird, da Sie zum Hinzufügen eines Zeichens mit einem Attribut, an das Sie noch nicht gedacht haben, nur sicherstellen müssen, dass es eine Interaktion mit Ihrem vorhandenen System aufweist.
quelle
Ich würde einen Stat-Typ-Manager empfehlen, der aus einer Datendatei (z. B. ich verwende XML) und Stat-Objekten mit einem Typ und einem Wert, die in der Character Insatnce als Hash-Tabelle gespeichert sind, und der eindeutigen ID des Stat-Typs als Schlüssel besteht.
Bearbeiten: Psudo-Code
quelle
StatType
Unterricht für unnötig, benutze einfach dasname
vonStatType
als Schlüssel. Wie #Grimston. Das selbe mitStats
.Ich werde versuchen, Ihnen ein Beispiel zu geben, wie Sie Ihr Arsenal und Ihre Waffenkammer entwerfen können.
Unser Ziel ist es, Entitäten zu entkoppeln, daher sollte die Waffe eine Schnittstelle sein.
Angenommen, jeder Spieler kann nur eine Waffe besitzen, dann können wir die verwenden
Strategy pattern
um Waffen einfach zu wechseln.Ein weiteres nützliches Muster wäre das Null-Objektmuster falls der Spieler ist.
Was die Waffenkammer betrifft, können wir mehrere Verteidigungsausrüstungen tragen.
Zum Entkoppeln habe ich ein Interface für den Verteidiger erstellt.
Und die
Player
Klasse.Fügen wir etwas Gameplay hinzu.
Voila!
quelle