Python 面向对象,属性/函数帮助。硬编码…不知道该怎么做。(第一次尝试)

Python 面向对象,属性/函数帮助。硬编码…不知道该怎么做。(第一次尝试),python,oop,attributes,Python,Oop,Attributes,第一次尝试OOP。 我正在写一个游戏,游戏中的英雄们有几个“能力”。我有很多重复,不知道如何简化。我现在正在写每一个新的能力,我知道这是非常糟糕的。。。 先谢谢你 def lightning_bolt(self): if self.is_stunned: print("Stunned...ability unsuccessful.") elif self.is_confused: confused_test = roll_d_x(2)

第一次尝试OOP。 我正在写一个游戏,游戏中的英雄们有几个“能力”。我有很多重复,不知道如何简化。我现在正在写每一个新的能力,我知道这是非常糟糕的。。。 先谢谢你

def lightning_bolt(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility / 2)
        success = self.success_check()
        defender.mobility = (defender.mobility * 2)
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health(((self.energy * 0.5) + 10))
                self.lose_energy(25)
                stun_test = roll_d_x(4)
                if stun_test == 1:
                    defender.is_stunned = True
        else:
            print("Ability failed.")

def fireball(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility * (3/2))
        success = self.success_check()
        defender.mobility = (defender.mobility * (2/3))
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health((self.energy * (7/10)) + 5)
                defender.is_terrified = True
                self.lose_energy(30)
        else:
            defender.lose_health(self.energy * (1/4))
            print("Ability failed. Damage reduced.")
我觉得有一种方法可以称之为。。。 自我能力(消耗、伤害、防御者修正、特殊效果) 此外,所有的“能力”在成功之前都需要经过几个“检查”。这里也很笨重,但我不知道怎么清理。 先谢谢你

def lightning_bolt(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility / 2)
        success = self.success_check()
        defender.mobility = (defender.mobility * 2)
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health(((self.energy * 0.5) + 10))
                self.lose_energy(25)
                stun_test = roll_d_x(4)
                if stun_test == 1:
                    defender.is_stunned = True
        else:
            print("Ability failed.")

def fireball(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility * (3/2))
        success = self.success_check()
        defender.mobility = (defender.mobility * (2/3))
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health((self.energy * (7/10)) + 5)
                defender.is_terrified = True
                self.lose_energy(30)
        else:
            defender.lose_health(self.energy * (1/4))
            print("Ability failed. Damage reduced.")
这是我想要的,但我知道有更好的方法。有3个英雄和15个技能都需要通过相同的“如果你自己被惊呆了…”来运行。这显然是非常重复的编码。
谢谢。

一种方法是将测试抽象为一种新方法:

def检查状态效果(自身):
状态=错误
如果self.u目瞪口呆:
打印(“晕眩…能力不成功”)
状态=真
elif self.u感到困惑:
混淆测试=滚动测试(2)
如果测试=1:
打印(“困惑…能力不成功”)
状态=真
返回状态
然后,由于我假设您不希望该能力在具有状态效果的情况下成功,请在您的能力方法中检查
check_status_effects
的返回:

def火球(自身):
如果是自我检查,请检查\u状态\u效果()
返回
#其余的能力代码在这里

除非您对发布的代码有特殊问题,否则您的问题可能属于“谢谢”-我会在允许的情况下发布…限制我每40分钟发布一次…好的,太好了,谢谢。有没有一种方法可以创建一个像“能力”这样的函数,它包含“成本、伤害、防御修饰符”等方面,这样我就不必硬编码所有的整数(伤害等)?