Вот кое-что, что должно вас немного продвинуть.
Элемент - это собственный класс, который может иметь несколько модификаторов в словаре. Если ключ модификатора совпадает с существующим атрибутом героя, он добавляется к герою.
По мере продвижения go вы можете захотеть, чтобы значения модификатора были сами по себе классом. Ворпалец может иметь абсолютный шанс 70% крита, независимо от того, кто его использует. Или кольцо воровства может умножить ваш базовый chance_to_steal на 1,3 (то есть .30 * 1.3
= .39 сейчас).
Отдельный статистический указ может позволить вам отделить текущие значения от основные атрибуты героя, чтобы вы могли забрать предметы.
Не берите в голову то, что я сделал с вашими бедными Hero
и Backpack
классами, они не имеют значения для этой проблемы, поэтому я в основном закомментировал их.
# class Thief(Hero):
class Thief:
def __repr__(self):
return f"{self.__class__.__name__}.chance_to_steal={self.chance_to_steal}, chance_to_crit={self.chance_to_crit}"
def __init__(self, chance_to_steal=0.3, chance_to_crit=0.3):
# super().__init__(hero_name="Thief", stamina=100)
self.chance_to_steal = chance_to_steal
self.chance_to_crit = chance_to_crit
self.armor = 0
self.backpack = {}
def add_item(self, item):
self.backpack[item.name] = item
for attrname,mod in item.modifiers.items():
#do we have something to modify, on this Hero?
val = getattr(self,attrname, None)
if val is None:
continue
else:
#sum the previous value and the modifier
setattr(self, attrname, val + mod)
class Item:
def __init__(self, name, modifiers=None):
self.name = name
if modifiers:
self.modifiers = modifiers.copy()
thief = Thief(chance_to_crit=0.4)
print(thief)
item = Item("vorpal", dict(chance_to_crit=0.2))
thief.add_item(item)
print(thief)
item = Item("cursed ring", dict(chance_to_crit=-0.1, chance_to_steal=-0.2, cast_spell=-0.2))
thief.add_item(item)
print(thief)
output
Thief.chance_to_steal=0.3, chance_to_crit=0.4
Thief.chance_to_steal=0.3, chance_to_crit=0.6000000000000001
Thief.chance_to_steal=0.09999999999999998, chance_to_crit=0.5000000000000001