Как иметь несколько версий одного и того же объекта, каждый с разными свойствами - PullRequest
0 голосов
/ 26 мая 2019

Я делаю текстовую версию Skyrim и не могу найти способ заставить бонусы зачарования / кузнеца работать. У меня есть класс для оружия и класс для брони. У меня есть предмет для каждого оружия и доспехов, включенных в мою игру. Моими свойствами для оружия являются имя, урон, урон, кузнечный уголь, чары и ценность. Для доспехов доступны следующие свойства: имя, слот, базовая защита, кузнечный уголь, чары и стоимость.

Вы можете иметь несколько одинаковых предметов в инвентаре, что создает проблему невозможности иметь разные версии одного и того же предмета. Например, предположим, у вас есть 2 железных меча, и вы хотите зачаровать один. Если вы сделаете это, используя ironsword.enchantment = [firedamage, 20], то теперь и железные мечи, и каждый железный меч, который вы найдете теперь, будут иметь чары на 20 ед. Урона от огня. Та же проблема возникает с кузнечным делом, когда, если вы улучшите один железный меч, все железные мечи станут более мощными.

Кто-нибудь знает решение этой проблемы? Один из них, о котором я могу подумать, это иметь около 1000 версий каждого объекта, и каждый раз, когда вы получаете новый, вы получаете следующий объект. Например: первым вашим железным мечом будет объект ironsword1. В следующий раз, когда вы получите железный меч, это будет ironsword2, и это будет продолжаться до тех пор, пока вы не получите 1000 железных мечей. Это, очевидно, потребовало бы очень много времени для реализации, и я чувствую, что, безусловно, есть лучший способ.

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Когда вы создаете два экземпляра или объект, это не одно и то же. Давайте сядем, у меня есть универсальный класс Triangle с атрибутами a, b, c. У меня может быть два разных треугольника с разной длиной стороны одновременно. Вы должны изменить атрибут только 1 экземпляра брони / оружия за один раз. Можете ли вы опубликовать пример реализации вашего класса оружия / объекта, чтобы мы могли лучше понять, что вы пытаетесь сделать?

Edit:

Давайте попробуем объяснить класс и подкласс в вашей среде. Мы хотим определить общий объект под названием оружие, у которого есть некоторый атрибут для урона и дальности.

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)

Теперь вы можете использовать оба типа оружия в одном стиле, подкласс ING - общий родительский класс.

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

Я надеюсь, что вы поняли эту концепцию, я предлагаю вам подробнее изучить это из некоторого онлайн-учебника, вы можете просто найти ООП.

0 голосов
/ 26 мая 2019

Я думаю, вы, возможно, неправильно понимаете, как работают классы, или, точнее, различие между классами и экземплярами.

Имеет смысл иметь класс для Weapon, но вы не хотите IronSwordчтобы быть экземпляром этого класса, вы хотите, чтобы он был подклассом.В вашем инвентаре у вас будет два экземпляра класса IronSword с определенными чарами.В качестве альтернативы, вы можете не делать явный подкласс для железных мечей, а просто создать несколько видов оружия с параметрами, которые идентифицируют их как железные мечи.Но в любом случае один object должен соответствовать одному объекту, т. Е. Каждый вариант инвентаризации должен быть отдельным объектом.

Вот очень хорошая серия видеороликов YouTube, которые дают представление об ООП в Python: https://www.youtube.com/watch?v=ZDa-Z5JzLYM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...