Здесь надо применить объектно-ориентированное программирование (ООП).
Нужно разработать основу для pyRPG (Python role-playing game).
Представьте себе мир, в котором у игрока (Player) есть три основных характеристики: сила (strength), ловкость (agility) и интеллект (intelligence). По умолчанию у каждого героя игры все характеристики равны нулю.
Для увеличения (или уменьшения) характеристики в игре используются зелья (Potion), которые накладывают определённый эффект на игрока и действуют определённое количество ходов.
Перед вами стоит задача создать два класса Player и Potion, описывающие данную механику.
Класс Potion описывает эффект от зелья.
Конструктор класса Potion должен иметь вид: Potion(duration, strength, agility, intelligence). Параметр duration описывает длительность эффекта в «шагах» и является позиционным. Параметры strength, agility, intelligence описывают силу, ловкость и интеллект, получаемые от зелья, и являются необязательными.
Класс Potion должен иметь методы:
• duration() — возвращает длительность эффекта зелья;
• strength() — возвращает силу, получаемую от зелья;
• agility() — возвращает ловкость, получаемую от зелья;
• intelligence() — возвращает интеллект, получаемую от зелья;
• copy() — возвращает копию объекта.
Над объектами класса Potion должна быть возможность производить следующие операции:
• potion1 == potion2 — возвращает True, если все параметры зелий равны, иначе False;
• next(potion) — снижает продолжительность эффекта на 1 и возвращает None, если продолжительность снизилась до 0, иначе возвращает принимаемый объект;
• potion1 + potion2 — странным образом смешивает два зелья: параметры зелий складываются, а продолжительность эффекта нового зелья равна минимальной из переданных;
• potion1 - potion2 — странным образом смешивает два зелья: параметры зелий вычитаются, а продолжительность эффекта нового зелья равна максимальной из переданных;
• potion * number — странным образом модифицирует зелье: параметры зелья умножаются на number, а продолжительность эффекта нового зелья остаётся такой же;
• str(potion) — возвращает строку, описывающую зелье в формате Potion(duration= D, strength=S, agility=A, intelligence=Intel).
Класс Player описывает состояние пользователя.
У конструктора класса Player не должно быть позиционных параметров.
Класс Player должен иметь методы:
• strength() — возвращает суммарную силу героя;
• agility() — возвращает суммарную ловкость героя;
• intelligence() — возвращает суммарный интеллект героя;
• append(potion) — накладывает эффект (копию зелья potion) на героя.
Над объектом класса Player должна быть возможность производить следующие операции:
• player += potion — накладывает эффект (копию зелья potion) на героя;
• next(player) — имитирует ход, снижает длительность всех наложенных на героя зелий на 1;
• str(player) — возвращает строковое представление героя в виде:
Player {
strength: S
agility: A
intelligence: Intel
}
ПРИМЕР 1:
Ввод:
from solution import Potion
potion1 = Potion(3, strength=5, intelligence=2)
print(potion1)
potion2 = Potion(2, strength=2, agility=3)
print(potion2)
potion3 = potion1 + potion2
print(potion3)
potion4 = potion1 - potion2
print(potion4)
potion5 = potion4 * 2
print(potion5)
Вывод:
Potion(duration=3, strength=5, agility=0, intelligence=2)
Potion(duration=2, strength=2, agility=3, intelligence=0)
Potion(duration=2, strength=7, agility=3, intelligence=2)
Potion(duration=3, strength=3, agility=-3, intelligence=2)
Potion(duration=3, strength=6, agility=-6, intelligence=4)
ПРИМЕР 2:
Ввод:
from solution import Potion, Player
potion1 = Potion(3, strength=2, agility=-1, intelligence=1)
potion2 = Potion(4, strength=-1, agility=4, intelligence=3)
player = Player()
print(player, end='\n—\n')
player.append(potion1)
print(player, end='\n—\n')
next(player)
print(player, end='\n—\n')
player += potion2
for i in range(4):
print(player, end='\n—\n')
next(player)
print(player)
Вывод:
Player {
strength: 0
agility: 0
intelligence: 0
}
—
Player {
strength: 2
agility: -1
intelligence: 1
}
—
Player {
strength: 2
agility: -1
intelligence: 1
}
—
Player {
strength: 1
agility: 3
intelligence: 4
}
—
Player {
strength: 1
agility: 3
intelligence: 4
}
—
Player {
strength: -1
agility: 4
intelligence: 3
}
—
Player {
strength: -1
agility: 4
intelligence: 3
}
—
Player {
strength: 0
agility: 0
intelligence: 0
}
ПРИМЕР 3:
Ввод:
from solution import Potion, Player
class StrengthPotion(Potion):
def __init__(self, duration):
Potion.__init__(self, duration, strength=5)
sp = StrengthPotion(2)
player = Player()
player += sp
for _ in range(3):
print(player)
next(player)
Вывод:
Player {
strength: 5
agility: 0
intelligence: 0
}
Player {
strength: 5
agility: 0
intelligence: 0
}
Player {
strength: 0
agility: 0
intelligence: 0
}
ПРИМЕЧАНИЕ
Поля и методы класса должны иметь разные имена.