Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
still going strong..! :D solution in Clear category for The Weapons by dan_rue
class Weapon:
def __init__(self, health=0, attack=0, defense=0, vampirism=0, heal_power=0):
self.health = health
self.attack = attack
self.defense = defense
self.vampirism = vampirism
self.heal_power = heal_power
class Sword(Weapon):
def __init__(self):
super().__init__(health=5, attack=2)
class Shield(Weapon):
def __init__(self):
super().__init__(health=20, attack=-1, defense=2)
class GreatAxe(Weapon):
def __init__(self):
super().__init__(health=-15, attack=5, defense=-2, vampirism=10)
class Katana(Weapon):
def __init__(self):
super().__init__(health=-20, attack=6, defense=-5, vampirism=50)
class MagicWand(Weapon):
def __init__(self):
super().__init__(health=30, attack=3, heal_power=3)
class Warrior:
def __init__(self, health=50, attack=5, defense=0, vampirism=0, heal_power=0):
self.health = health
self.max_health = health
self.attack = attack
self.defense = defense
self.vampirism = vampirism
self.heal_power = heal_power
def __repr__(self):
return f'{self.__class__}, Health: {self.health}, Attack: {self.attack}'
def equip_weapon(self, weapon: Weapon):
self.health = self.max_health = self.health + weapon.health
self.attack += weapon.attack
@property
def is_alive(self) -> bool:
return self.health > 0
def hit(self, enemy) -> int:
return enemy.take_dmg(self.attack)
def take_dmg(self, dmg: int) -> int:
self.health -= dmg
return dmg
class Knight(Warrior):
def __init__(self):
super().__init__(attack=7)
class Defender(Warrior):
def __init__(self):
super().__init__(health=60, attack=3, defense=2)
def equip_weapon(self, weapon: Weapon):
super().equip_weapon(weapon)
self.defense += weapon.defense
def take_dmg(self, dmg: int) -> int:
self.health -= max(dmg - self.defense, 0)
return max(dmg - self.defense, 0)
class Vampire(Warrior):
def __init__(self):
super().__init__(health=40, attack=4, vampirism=50)
def equip_weapon(self, weapon: Weapon):
super().equip_weapon(weapon)
self.vampirism += weapon.vampirism
def hit(self, enemy) -> int:
damage = super().hit(enemy)
self.health += int(damage * self.vampirism / 100)
return damage
class Lancer(Warrior):
def __init__(self):
super().__init__(health=50, attack=6)
class Healer(Warrior):
def __init__(self):
super().__init__(health=60, attack=0, heal_power=2)
def equip_weapon(self, weapon: Weapon):
super().equip_weapon(weapon)
self.heal_power += weapon.heal_power
def heal(self, unit: Warrior):
unit.health = min(unit.health + self.heal_power, unit.max_health)
class Army:
def __init__(self):
self.units = []
def __repr__(self):
return str(self.units)
def add_units(self, unit, amount: int) -> None:
self.units += [unit() for _ in range(amount)]
def hit(self, enemy) -> None:
half_dmg = self.units[0].hit(enemy.units[0])
# Lancer also damages the next fighter
if isinstance(self.units[0], Lancer) and len(enemy.units) > 1:
enemy.units[1].take_dmg(half_dmg)
if not enemy.units[1].is_alive:
del enemy.units[1]
# Healer heals the fighting unit
if len(self.units) > 1 and isinstance(self.units[1], Healer):
self.units[1].heal(self.units[0])
@property
def is_alive(self) -> bool:
return self.units[0].is_alive
class Battle:
@staticmethod
def fight(army_1: Army, army_2: Army) -> bool:
while army_1.units and army_2.units:
# Healers don't fight, remove them from stack
if isinstance(army_1.units[0], Healer):
del army_1.units[0]
continue
elif isinstance(army_2.units[0], Healer):
del army_2.units[0]
continue
if fight(army_1, army_2):
del army_2.units[0]
else:
del army_1.units[0]
return bool(army_1.units)
@staticmethod
def straight_fight(army_1: Army, army_2: Army):
while army_1.units and army_2.units:
for i in reversed(range(min(len(army_1.units), len(army_2.units)))):
if fight(army_1.units[i], army_2.units[i]):
del army_2.units[i]
else:
del army_1.units[i]
return bool(army_1.units)
def fight(unit_1: Warrior | Army, unit_2: Warrior | Army):
while True:
unit_1.hit(unit_2)
if not unit_2.is_alive: return True
unit_2.hit(unit_1)
if not unit_1.is_alive: return False
Dec. 24, 2022
Comments: