jbs hat geschrieben:@sma: Wie hast du denn vor die Typen der Feinde zu verwalten?
Sehr gute Frage. Ich bin mir noch nicht sicher. Ich sehe drei Alternativen.
Zur Zeit habe ich einfach eine Klasse (`Being`), deren Exemplare Monster und Helden (wie ich Spielercharaktere z.Z. nenne) repräsentieren. Einzig eine Reihe von Attributen definiert ein Wesen:
Code: Alles auswählen
class Being:
def __init__(self, name, attack, defense, weapon, armor, ...):
...
Besondere Fähigkeiten müsste man jeweils pro Exemplar durch zusätzliche Objekte (oder Funktionen) realisieren. Vielleicht kann ein Mitglied der Stadtwache weitere Wachen heranrufen. Will man auch noch Dinge wie Waffen und Rüstung modellieren (damit man z.B. einer toten Stadtwache ihre Hellebarde abnehmen kann), wird die Initialisierung relativ aufwendig. Man könnte hier mit speziellen Konstruktorfunktionen arbeiten.
Code: Alles auswählen
class Maker:
def make_city_guard():
b = Being("Stadtwache", ...)
b.weapon = Weapons.make_halberd()
b.armor = Armors.make_half_plate()
b.append_feature(can_call_other_guards)
return b
Natürlich bietet sich an, pro Art eine eigene Unterklasse zu definieren. Das würde einiges einfacher machen. Besondere Fähigkeiten werden jetzt einfach zu Methoden und auch besondere Angriffs- oder Verteidigungstechniken kann man dann einfach als Methoden definieren.
Code: Alles auswählen
class CityGuard(Being):
def attack(self): ...
def hit(self, damage): ...
self.health -= damage
if self.health > 0:
self._call_for_help()
def _call_for_help(self):
if not self.flag("called_for_help"):
self.set_flag("called_for_help", True)
...
Nachteil ist nun, dass ich nicht ohne den Python-Code zu ändern, neue Arten hinzufügen kann. Wer sich also Schneelandbarbaren überlegen will, die kälteunempfindlich sind, aber vor Feuer Angst haben, kann das nicht einfach konfigurieren, sondern muss es programmieren.
Daher die dritte Idee, die Art noch Mal als Python-Klasse zu modellieren:
Code: Alles auswählen
class Kind(object):
...
snow_barbar = Kind("Schneelandbarbar")
snow_barbar.strength = "2d8"
snow_barbar.health = "d6+10"
conan = snow_barbar.make()
Wie mein Beispiel zeigen soll könnte ich nun auch bestimmte Eigenschaften variabel machen und die `make`-Methode wüsste dann, wie sie ein `Being`-Exemplar mit den entsprechenden Werten erzeugen kann. Ebenfalls könnte man die Bewaffnung zufällig gestalten, indem es passende Tabellen gibt:
Code: Alles auswählen
class Randomize:
def __init__(*pairs):
self.pairs = pairs
def make(self):
v = roll("d100")
for p, make in self.pairs:
if v < p:
return make()
v -= p
raise "Oops"
snow_barbar.weapon = Randomize(
(10, Weapons.make_broadsword),
(60, Weapons.make_battle_axe),
(30, Weapons.make_short_bow),
)
Zunächst muss ich aber erst noch Regeln finden, nach denen Kämpfe und andere Herausforderungen abgehandelt werden können. Dann weiß ich hoffentlich auch, was ich alles pro Wesen repräsentieren muss.
Stefan