Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Straight Fight by Magu
class Warrior:
health_behind1 = None
health_behind2 = None
heal_afterme1 = None
heal_afterme2 = None
not_straight_fight = True
default_health = 50
def __init__(self, health=50, attack=5, is_alive=True):
self.health = health
self.attack = attack
self.is_alive = is_alive
class Knight(Warrior):
default_health = 50
def __init__(self):
super().__init__(50, 7, True)
class Defender(Warrior):
default_health = 60
def __init__(self):
super().__init__(60, 3, True)
self.defence = 2
class Vampire(Warrior):
default_health = 40
def __init__(self):
super().__init__(40, 4, True)
self.vampirism = 50
class Lancer(Warrior):
default_health = 50
def __init__(self):
super().__init__(50, 6, True)
class Healer(Warrior):
default_health = 60
def __init__(self):
super().__init__(60, 0, True)
def heal(self, unit):
self.unit = unit
unit.health += 2 if unit.health + 2 <= unit.__class__.default_health else 0
class Army:
def __init__(self):
self.list = []
def add_units(self, unit, num):
for i in range(num):
self.list.append(unit())
class Battle:
def fight(self, army1, army2):
while army1.list and army2.list:
if len(army1.list) - 1:
Warrior.health_behind1 = army1.list[1].health
Warrior.heal_afterme1 = army1.list[1] if isinstance(army1.list[1], Healer) else None
else:
Warrior.health_behind1 = None
if len(army2.list) - 1:
Warrior.health_behind2 = army2.list[1].health
Warrior.heal_afterme2 = army2.list[1] if isinstance(army2.list[1], Healer) else None
else:
Warrior.health_behind2 = None
if bl := fight(army1.list[0], army2.list[0]):
army2.list.pop(0)
if Warrior.health_behind2 is not None:
army2.list[0].health = Warrior.health_behind2; Warrior.Health_behind2 = None
else:
army1.list.pop(0)
if Warrior.health_behind1 is not None:
army1.list[0].health = Warrior.health_behind1; Warrior.health_behind1 = None
return bl
def straight_fight(self, army1, army2):
Warrior.not_straight_fight = False
while army1.list and army2.list:
for unit_1, unit_2 in zip(army1.list, army2.list):
bl = fight(unit_1, unit_2)
army1.list = [u for u in army1.list if u.is_alive]
army2.list = [u for u in army2.list if u.is_alive]
return bl
def fight(unit_1, unit_2):
while True:
if isinstance(unit_2, Defender):
dmg = max(0, unit_1.attack - unit_2.defence)
else:
dmg = 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 += dmg * unit_1.vampirism / 100
if Warrior.not_straight_fight and (Warrior.heal_afterme1 is not None):
Warrior.heal_afterme1.heal(unit_1)
if unit_2.health <= 0:
unit_2.is_alive = False; break
if isinstance(unit_1, Defender):
dmg = max(0, unit_2.attack - unit_1.defence)
else:
dmg = 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 += dmg * unit_2.vampirism / 100
if Warrior.not_straight_fight and (Warrior.heal_afterme2 is not None):
Warrior.heal_afterme2.heal(unit_2)
if unit_1.health <= 0:
unit_1.is_alive = False; break
return unit_1.is_alive
April 6, 2025