OOP: Instanz mit bezug auf andere Instanz?

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.
Antworten
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten