Seite 1 von 1

OOP: Instanz mit bezug auf andere Instanz?

Verfasst: Freitag 25. Januar 2013, 12:02
von kevind
Hallo Zusammen,

ich bin gerade drann ein kleines Rundenbasiertes Textgame zu schreiben (um das Gelernte mal in nem richtigen Projekt zu verwenden).

Mein Problem:
Ich habe eine Klasse für die Charaktäre (siehe Code)
Aus der Klasse erstelle ich zb. "Player" oder "Enemy" (Der Player wird vom spieler gesteuert und Enemy soll dann ne KI bekommen)

Ich überlege nun wie ich die Fähigkeiten/Attacken am besten implementiere?
Derzeit habe ich die Angriffe direkt in der Charakterklasse als Variable.

Macht es Sinn die Attacken ebenfalls in eine Klasse zu packen ?

Dann bräuchte ich irgendwie bezug von der Instanz "Player" zu den Instanzen der Attacken damit die Charakter werte auch in den Instanzen berücksichtigt werden können.

Hoffe ihr versteht nicht nur Bahnhof .. ;)

Gruss, Kev

Code: Alles auswählen

#FinalF characters


class character(object):

    def __init__(self, name):
        self.name = name
        self.level = 1
        self.condition = 100  # endurance until player is exhausted
        self.reflexes = 100  # chance to dodge or avoid attacks
        self.str = 10  # value for strengh
        self.vita = 100  # value for helthpoints
        self.efficiency = 1  # value for attack efficiency
        self.combat_exp = 1  # increased each round in every fight / bonus attribute
        self.left_hand = False  # equiped item for left hand
        self.right_hand = False  # equiped item for right hand

#base dmg
        self.base_dmg = int((self.str + (self.level + (self.efficiency * self.combat_exp))) / 100 * self.condition)
#attacks
        self.punch = int(self.base_dmg + (self.base_dmg * 0.3))  #costs 5 condition / not implemented yet
        self.kick = int(self.base_dmg + (self.base_dmg * 0.9))  #costs 10 condition / not implemented yet

Re: OOP: Instanz mit bezug auf andere Instanz?

Verfasst: Freitag 25. Januar 2013, 13:01
von mutetella
@kevind
So aus dem Bauch heraus würde ich jetzt mal sagen, dass eine Attacke eine Handlung ist und somit nicht unbedingt in eine Klasse gehört, anderst als eben z. B. ein Charakter.
Zur Kommunikation zwischen Klassenexemplaren kannst Du ja mal in diesem Thread mitlesen...

Zu Deinem code:
  • Falls sich 'self.level' auf das Gamelevel bezieht, gehört das IMHO dort nicht hin.
  • Hinter 'self.str' würde ich einen String vermuten, verwende doch gleich 'strength', soviel Speicher hast Du bestimmt noch übrig... ;)
  • 'self.base_dmg', 'self.punch' und 'self.kick': Was machst Du mit den Werten, wenn sich die zugrunde liegenden Werte ändern?
mutetella

Re: OOP: Instanz mit bezug auf andere Instanz?

Verfasst: Freitag 25. Januar 2013, 13:27
von kevind
Hey Mutetella,

merci schonmal.

self.level bezieht sich auf den charakter.

Okay das mit dem self.str ist ein guter Einwand :)

Generell zu self.base_dmg, self.punch, self.kick, self.level:

Ich "erstelle" ja den spieler mit player = character("namexyz"). Durch weitere mechanismen (level up usw) würde ich einfach player.level, player.str erhöhen. Welches wieder rum die Berechnung von player.punch, player.kick beeinflussen würde.

Soweit bin ich zwar noch nicht sollte aber korrekt sein ?

Sonst ein Vorschlag wie ich Fähigkeiten am besten handhabe ?

Danke und Gruss, Kev

Re: OOP: Instanz mit bezug auf andere Instanz?

Verfasst: Freitag 25. Januar 2013, 13:32
von mutetella
Dann würde ich aber die Berechnung veränderlicher Attribute in eigene Methoden verlagern und die Werte von dort abrufen. Die '__init__'-Methode ist dafür nicht der geeignete Platz.

mutetella

Re: OOP: Instanz mit bezug auf andere Instanz?

Verfasst: Freitag 25. Januar 2013, 13:54
von /me
mutetella hat geschrieben:Dann würde ich aber die Berechnung veränderlicher Attribute in eigene Methoden verlagern und die Werte von dort abrufen. Die '__init__'-Methode ist dafür nicht der geeignete Platz.
Ich greife mal schnell ein Beispiel aus einem meiner Skripte heraus. Es handelt sich dabei um eine Methode einer Charakterklasse.

Code: Alles auswählen

    @property
    def lifepoints(self):
        """Get derived attribute 'Lifepoints'"""
        return self.attribute['vitality'] + self.attribute['willpower']
Die Verwendung des Dekorators @property erlaubt es mir, auf die Methode wie ein Attribut zuzugreifen.