【问题标题】:OOP, attributes / functions help. Hardcoding...not sure what to do. (FIRST ATTEMPT)OOP,属性/功能帮助。硬编码...不知道该怎么做。 (第一次尝试)
【发布时间】:2019-10-04 20:09:09
【问题描述】:

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

我觉得有一种方法可以称为... “self.ability(成本,伤害,防御者修正,特殊效果)” 而且,所有的“能力”都需要经过多次“检查”才能成功。这在这里也很笨重,但我不知道如何清理它。 提前谢谢...

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...”来运行。这显然是非常重复的编码。 谢谢。

【问题讨论】:

  • 除非您发布的代码有特定问题,否则您的问题可能属于codereview.stackexchange.com
  • 谢谢 - 我会在允许时发帖...限制我每 40 分钟发帖...

标签: python oop attributes


【解决方案1】:

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

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

【讨论】:

  • 好的,非常感谢。有没有办法创建一个像“能力”这样的函数,它需要像“成本、伤害、防御修正”这样的方面......所以我不必对所有整数进行硬编码(对于伤害等等...... )?
猜你喜欢
  • 2016-05-30
  • 2015-12-26
  • 2015-02-16
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多