【问题标题】:How to have multiple versions of the same object, each with different properties如何拥有同一个对象的多个版本,每个版本都有不同的属性
【发布时间】:2019-10-12 09:49:39
【问题描述】:

我正在制作基于文本的 Skyrim 版本,但我无法找到让附魔/锻造奖励发挥作用的方法。我有一个武器类和一个盔甲类。我的游戏中包含的每种武器和盔甲都有一个对象。我的武器属性是名称、基础伤害、锻造奖励、附魔和价值。对于盔甲,属性是名称、槽位、基础防御、锻造奖励、附魔和价值。

您可以在库存中拥有多个相同的物品,这会产生无法拥有相同物品的不同版本的问题。例如,假设你有 2 把铁剑,你想附魔一把。如果你使用 ironsword.enchantment = [firedamage, 20] 来做这件事,那么现在你找到的每把铁剑和每把铁剑都会有 20 点火焰伤害的附魔。锻造也会出现同样的问题,如果你强化一把铁剑,所有的铁剑都会被强化。

有人知道这个问题的解决方案吗?我能想到的一种方法是每个对象都有 1000 个版本,每次你得到一个新版本时,你都会得到下一个对象。例如:你得到的第一把铁剑将是对象 ironsword1。下一次你得到一把铁剑时,它会是 Ironsword2,这会一直持续到你得到 1000 把铁剑。这显然会非常耗时,我觉得肯定有更好的方法。

【问题讨论】:

  • 请显示一些代码来说明你是如何做到这一点的?我假设库存中只有一个项目列表,它们都是这些类的实例,然后附魔不会影响其他类,依此类推。
  • 听起来您的类层次结构设置不正确,但是您的问题中没有示例代码,因此不可能知道。建议您edit您的问题并修复此遗漏。

标签: python python-2.7 class object properties


【解决方案1】:

我认为您可能误解了类的工作原理,或者更具体地说是类和实例之间的区别。

Weapon 创建一个类是有意义的,但您不希望IronSword 成为该类的一个实例,您希望它成为一个子类。然后,在您的库存中,您将拥有两个具有特定附魔的 IronSword 类实例。或者,您可能不会为铁剑创建一个明确的子类,而只是使用将它们标识为铁剑的参数来实例化多个武器。但无论哪种方式,一个object 应该对应一个对象,即每个库存选项应该是一个单独的对象。

这是一个非常好的 YouTube 视频系列,介绍了 Python 中的 OOP: https://www.youtube.com/watch?v=ZDa-Z5JzLYM

【讨论】:

  • 如果我为游戏中的每种武器和盔甲都使用一个子类,我是否还需要为每个子类拥有大约 1000 个对象?我想到的另一个解决方案是为每个附魔设置 3-4 个不同的“级别”,为每个锻造 buff 设置 3-4 个级别,这样我就可以拥有 ironswordfiredamage1smithing0、ironswordfiredamage2smithing0 等,尽管这也需要永远实现,因为有 8 个武器附魔和 19 种盔甲附魔。
  • 我不完全确定你的意思。您不想预先创建您将需要的所有对象,您可以根据需要创建它们。您可能希望作为类的属性来实现的魔法。假设您找到了两把铁剑,然后您创建了该类别的两个对象并将它们放入您的库存中。当您决定将附魔应用于其中之一时,您将此附魔应用于库存中的两个实例之一。注意:我认为你的类结构会变得相当复杂,所以仔细考虑你想如何实现它并画一个草图。
  • 但是请看一下教程,我认为它会有所帮助。
  • 我唯一的问题是我在创建对象时不知道如何命名它们。您不会按固定顺序获得铁剑,如果您愿意,您可以获得无限数量的铁剑。第一次获得对象时如何命名 Ironsword0,第二次获得 Ironsword1,依此类推?
  • 您根本不需要命名它们。您的库存可以是一个列表,当您获得一个新列表时,您只需执行 inventory.append(IronSword()) 之类的操作
【解决方案2】:

当你创建两个实例或一个对象时,它们不是同一个东西。让我们坐下来,我有一个具有属性 a、b、c 的泛型类 Triangle。我可以同时拥有两个不同边长的三角形。您一次只能修改 1 个盔甲/武器实例的属性。您能否发布一个您的类武器/对象实现的示例,以便我们更好地了解您正在尝试做什么?

编辑:

让我们试着用你的环境来解释类和子类。我们想要定义一个名为武器的通用对象,它具有一些伤害和范围属性。

class Weapon:
    def __init__(self, dmg):
        self.dmg = dmg
        self.range = 1
        self.ench = None
        self.upg = None
    def enchant(self, value):
        self.ench = value
    def upgrade(self, value):
        self.upg = value
    def __str__(self):
        return "Generic weapon, {} dmg and {} range".format(self.dmg, self.range)

现在我们要创建一个名为 Sword 的子类,它继承了泛型类的所有内容,但可以实现更具体的属性和功能。

class Sword(Weapon):
    def __init__(self, dmg):
        Weapon(self, dmg)
        self.range = 5
    def __str__(self):
        "Sword, {} dmg, {} range, {} enchant, {} upgrade"
           .format(self.dmg, self.range, self.ench, self.upg)

您现在可以以相同的风格使用两种类型的武器,将通用父类作为子类。

a = Weapon(2)
b = Sword(5)
c = Sword(5)
c.enchant(2)
d = Sword(5)
d.upgrade(1)
print("{}\n{}\n{}\n{}".format(a,b,c,d))

=> Generic weapon, 2 dmg and 1 range
   Sword, 5 dmg, 5 range, None enchant, None upgrade
   Sword, 5 dmg, 5 range, 2 enchant, None upgrade
   Sword, 5 dmg, 5 range, None enchant, 1 upgrade

我希望你对这个概念有所了解,我建议你从网上的一些教程中更多地了解这个,你可以搜索 OOP。

【讨论】:

  • 问题是每个物品只有一个物品,但这个物品在整个游戏中多次出现,所以如果我想为我的铁剑附魔,我发现、购买的每一把铁剑或敌人使用的铁剑也会有这个结界。
猜你喜欢
  • 2023-04-04
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2012-09-27
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多