Finde meinen Fehler einfach nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Matty265
User
Beiträge: 7
Registriert: Sonntag 3. Januar 2010, 22:30

Hi,
erstmal vielen Dank für die Mühen und Hilfen
Ich verstehe nur nicht den Punkt in der Angriffsfunktion mit dem "if not".
Zum intend: Das macht bei mir Vim automatisch, kann ich das irgendwie auf 4 "verringern" ?
Das Programm war auch nur eben schnell gemacht, um zu sehen, wie man sowas macht. Ihr habt natürlich recht mit den Funktionen und VariablenNamen
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Matty265 hat geschrieben:Ich verstehe nur nicht den Punkt in der Angriffsfunktion mit dem "if not".
Meinst du jbs' Code? Wenn ja, dann entspricht "not randint(..)" "randint(..) == 0" da `0` zu `False` evaluiert.
Matty265 hat geschrieben:Zum indent: Das macht bei mir Vim automatisch, kann ich das irgendwie auf 4 "verringern" ?
Sollte alle PEP8 Aspekte beachten:

Code: Alles auswählen

augroup python
  au!
  au FileType python setlocal textwidth=79
  au FileType python setlocal expandtab, tabstop=4, softtabstop=4
  au FileType python setlocal shiftwidth=4
augroup END
Matty265
User
Beiträge: 7
Registriert: Sonntag 3. Januar 2010, 22:30

cofi hat geschrieben:

Code: Alles auswählen

augroup python
  au!
  au FileType python setlocal textwidth=79
  au FileType python setlocal expandtab, tabstop=4, softtabstop=4
  au FileType python setlocal shiftwidth=4
augroup END
Danke :D
cofi hat geschrieben:
Matty265 hat geschrieben:Zum indent: Das macht bei mir Vim automatisch, kann ich das irgendwie auf 4 "verringern" ?
Sorry :D
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten