首页 > 解决方案 > OOP,属性/功能帮助。硬编码...不知道该怎么做。(第一次尝试)

问题描述

OOP 的第一次尝试。我正在与具有多种“能力”的英雄一起编写游戏。我有很多重复,不知道如何简化。我目前正在写新的每个能力,我知道这很糟糕......提前谢谢......

我觉得有一种方法可以调用类似...“self.ability(cost,damage,defender modifier, special effect)”。而且,所有的“能力”都需要经过几次“检查”才能成功。这在这里也很笨重,但我不知道如何清理它。提前致谢...

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 个技能都需要通过相同的“if self.is_stunned...”来运行。这显然是非常重复的编码。谢谢。

标签: pythonoopattributes

解决方案


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

def check_status_effects(self):
    status = False
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
        status = True
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
        status = True
    return status

然后,由于我假设您不希望技能具有状态效果时成功,因此请检查check_status_effects您的技能方法中的返回:

def fireball(self):
    if self.check_status_effects():
        return
    # rest of ability code here

推荐阅读