Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for The Weapons by Magu
class Warrior:
health_behind1 = None
health_behind2 = None
healer_afterme1 = None
healer_afterme2 = None
not_straight_fight = True
default_health = 50
def __init__(self, health=50, attack=5, defense=0, vampirism=0, heal_power=0, is_alive=True):
self.health = health
self.attack = attack
self.defense = defense
self.vampirism = vampirism
self.heal_power = heal_power
self.is_alive = is_alive
def equip_weapon(self, weapon):
self.weapon = weapon
self.health = max(0, self.health + self.weapon.health)
self.attack = max(0, self.attack + self.weapon.attack)
self.defense = max(0, self.defense + self.weapon.defense)
self.vampirism = max(0, self.vampirism + self.weapon.vampirism)
self.heal_power = max(0, self.heal_power + self.weapon.heal_power)
class Knight(Warrior):
default_health = 50
def __init__(self):
super().__init__(50, 7, 0, 0, 0, True)
class Defender(Warrior):
default_health = 60
def __init__(self):
super().__init__(60, 3, 2, 0, 0, True)
class Vampire(Warrior):
default_health = 40
def __init__(self):
super().__init__(40, 4, 0, 50, 0, True)
class Lancer(Warrior):
default_health = 50
def __init__(self):
super().__init__(50, 6, 0, 0, 0, True)
class Healer(Warrior):
default_health = 60
def __init__(self):
super().__init__(60, 0, 0, 0, 2, True)
def heal(self, unit):
self.unit = unit
unit.health += self.heal_power if unit.health + self.heal_power <= unit.__class__.default_health else 0
class Weapon:
def __init__(self, health, attack, defense, vampirism, heal_power):
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__(5, 2, 0, 0, 0)
class Shield(Weapon):
def __init__(self):
super().__init__(20, -1, 2, 0, 0)
class GreatAxe(Weapon):
def __init__(self):
super().__init__(-15, 5, -2, 10, 0)
class Katana(Weapon):
def __init__(self):
super().__init__(-20, 6, -5, 50, 0)
class MagicWand(Weapon):
def __init__(self):
super().__init__(30, 3, 0, 0, 3)
class Army:
def __init__(self):
self.units = []
def add_units(self, unit, num):
for i in range(num):
self.units.append(unit())
class Battle:
def fight(self, army1, army2):
while army1.units and army2.units:
if len(army1.units) - 1:
Warrior.health_behind1 = army1.units[1].health
Warrior.healer_afterme1 = army1.units[1] if isinstance(army1.units[1], Healer) else None
else:
Warrior.health_behind1 = None
if len(army2.units) - 1:
Warrior.health_behind2 = army2.units[1].health
Warrior.healer_afterme2 = army2.units[1] if isinstance(army2.units[1], Healer) else None
else:
Warrior.health_behind2 = None
if bl := fight(army1.units[0], army2.units[0]):
army2.units.pop(0)
if Warrior.health_behind2 is not None:
army2.units[0].health = Warrior.health_behind2; Warrior.Health_behind2 = None
else:
army1.units.pop(0)
if Warrior.health_behind1 is not None:
army1.units[0].health = Warrior.health_behind1; Warrior.health_behind1 = None
return bl
def straight_fight(self, army1, army2):
Warrior.not_straight_fight = False
while army1.units and army2.units:
for unit_1, unit_2 in zip(army1.units, army2.units):
bl = fight(unit_1, unit_2)
army1.units = [u for u in army1.units if u.is_alive]
army2.units = [u for u in army2.units if u.is_alive]
return bl
def fight(unit_1, unit_2):
while True:
dmg = max(0, unit_1.attack - unit_2.defense) if isinstance(unit_2, Defender) else unit_1.attack
if Warrior.not_straight_fight and isinstance(unit_1, Lancer) and (Warrior.health_behind2 is not None):
Warrior.health_behind2 -= int(dmg / 2)
unit_2.health -= dmg
if isinstance(unit_1, Vampire):
unit_1.health = min(Vampire.default_health, unit_1.health + int(dmg * unit_1.vampirism / 100))
if Warrior.not_straight_fight and (Warrior.healer_afterme1 is not None):
Warrior.healer_afterme1.heal(unit_1)
if unit_2.health <= 0:
unit_2.is_alive = False; break
dmg = max(0, unit_2.attack - unit_1.defense) if isinstance(unit_1, Defender) else unit_2.attack
if Warrior.not_straight_fight and isinstance(unit_2, Lancer) and (Warrior.health_behind1 is not None):
Warrior.health_behind1 -= int(dmg / 2)
unit_1.health -= dmg
if isinstance(unit_2, Vampire):
unit_2.health = min(Vampire.default_health, unit_2.health + int(dmg * unit_2.vampirism / 100))
if Warrior.not_straight_fight and (Warrior.healer_afterme2 is not None):
Warrior.healer_afterme2.heal(unit_2)
if unit_1.health <= 0:
unit_1.is_alive = False; break
return unit_1.is_alive
April 7, 2025
Comments: