Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for The Warlords by tokiojapan55
def get_arg(index, keyword, default, *args, **kwargs):
result = default
if keyword in kwargs:
result = kwargs[keyword]
if args and index < len(args):
result = args[index]
return result
def set_kwargs(kwargs, param):
for p in param:
if p not in kwargs:
kwargs[p] = param[p]
class Warrior:
def __init__(self, *args, **kwargs):
#(hp=50, atk=5, dfs=0, vamp=0):
self.health = get_arg(0, "health", 50, *args, **kwargs)
self.max_hp = self.health
self.attack = get_arg(1, "attack", 5, *args, **kwargs)
self.defense = get_arg(2, "defense", 0, *args, **kwargs)
self.vampirism = get_arg(3, "vampirism", 0, *args, **kwargs)
self.lance = get_arg(4, "lance", 0, *args, **kwargs)
self.heal_power = get_arg(5, "heal_power", 0, *args, **kwargs)
self.army = get_arg(6, "army", None, *args, **kwargs)
@property
def is_alive(self):
return self.health > 0
def attackedBy(self, unit, behind=True):
if unit.attack > self.defense:
damage = unit.attack - self.defense
if damage > 0:
self.health -= damage
unit.health += int(damage * unit.vampirism / 100)
if behind and self.behind() != None:
damage = int(damage * unit.lance / 100) - self.behind().defense
if damage > 0:
self.behind().health -= damage
if behind and unit.behind() != None and unit.behind().heal_power > 0:
unit.behind().heal(unit)
return self.is_alive
def behind(self):
if self.army == None:
return None
return self.army.get_behind(self)
def equip_weapon(self, weapon):
if self.health > 0:
self.health = max(0, self.health+weapon.health)
self.max_hp = self.health
if self.attack > 0:
self.attack = max(0, self.attack+weapon.attack)
if self.defense > 0:
self.defense = max(0, self.defense+weapon.defense)
if self.vampirism > 0:
self.vampirism = max(0, self.vampirism+weapon.vampirism)
if self.heal_power > 0:
self.heal_power = max(0, self.heal_power+weapon.heal_power)
class Knight(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'attack': 7})
super().__init__(*args, **kwargs)
class Defender(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 60, 'attack': 3, 'defense': 2})
super().__init__(*args, **kwargs)
class Vampire(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 40, 'attack': 4, 'vampirism': 50})
super().__init__(*args, **kwargs)
class Lancer(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 50, 'attack': 6, 'lance': 50})
super().__init__(*args, **kwargs)
class Healer(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 60, 'attack': 0, 'heal_power': 2})
super().__init__(*args, **kwargs)
def heal(self, unit):
if self.is_alive and unit.is_alive:
unit.health = min(unit.max_hp, unit.health + self.heal_power)
class Warlord(Warrior):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 100, 'attack': 4, 'defense': 2})
super().__init__(*args, **kwargs)
class Weapon:
def __init__(self, *args, **kwargs):
self.health = get_arg(0, "health", 0, *args, **kwargs)
self.attack = get_arg(1, "attack", 0, *args, **kwargs)
self.defense = get_arg(2, "defense", 0, *args, **kwargs)
self.vampirism = get_arg(3, "vampirism", 0, *args, **kwargs)
# weapon not has lance parameter
# self.lance = get_arg(4, "lance", 0, *args, **kwargs)
self.heal_power = get_arg(4, "heal_power", 0, *args, **kwargs)
class Sword(Weapon):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 5, 'attack': 2})
super().__init__(*args, **kwargs)
class Shield(Weapon):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 20, 'attack': -1, 'defense': 2})
super().__init__(*args, **kwargs)
class GreatAxe(Weapon):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': -15, 'attack': 5, 'defense': -2, 'vampirism': 10})
super().__init__(*args, **kwargs)
class Katana(Weapon):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': -20, 'attack': 6, 'defense': -5, 'vampirism': 50})
super().__init__(*args, **kwargs)
class MagicWand(Weapon):
def __init__(self, *args, **kwargs):
set_kwargs(kwargs, {'health': 30, 'attack': 3, 'heal_power': 3})
super().__init__(*args, **kwargs)
class Army:
def __init__(self):
self.units = list()
self.is_move = False
def add_units(self, cls, count):
for i in range(count):
# probably because of Rookie class
# self.units.append(cls(army=self))
# _cls = cls(army=self)
_cls = cls()
_cls.army = self
self.units.append(_cls)
def move_units(self):
if not self.has_warlord:
return
self.is_move = True
def sort_units(self):
if not self.has_warlord or not self.is_move:
return
lancers,healers,warlords,others,deads = [],[],[],[],[]
for unit in self.units:
if not unit.is_alive:
deads.append(unit)
elif unit.__class__.__name__ == 'Lancer' and not lancers:
lancers.append(unit)
elif unit.__class__.__name__ == 'Healer':
healers.append(unit)
elif unit.__class__.__name__ == 'Warlord':
warlords.append(unit)
else:
others.append(unit)
self.units = []
if lancers:
self.units.append(lancers.pop(0))
elif others:
self.units.append(others.pop(0))
self.units.extend(healers)
self.units.extend(others)
self.units.extend(deads)
if warlords:
self.units.append(warlords.pop(0))
def next(self):
for unit in self.units:
if unit.is_alive:
return unit
return None
def teams(self):
return [unit for unit in self.units if unit.is_alive]
def get_behind(self, unit):
for i,u in enumerate(self.units):
if u == unit:
for uu in self.units[i+1:]:
if uu.is_alive:
return uu
break
return None
@property
def has_warlord(self):
return self.units and self.units[-1].__class__.__name__=='Warlord' and self.units[-1].is_alive
class Battle:
def __init__(self):
pass
def fight(self, army_1, army_2):
while True:
army_1.sort_units()
unit_1 = army_1.next()
if unit_1 == None:
return False
army_2.sort_units()
unit_2 = army_2.next()
if unit_2 == None:
return True
fight(unit_1, unit_2)
def straight_fight(self, army_1, army_2):
while True:
team_1 = army_1.teams()
if not team_1:
return False
team_2 = army_2.teams()
if not team_2:
return True
for unit_1,unit_2 in zip(team_1,team_2):
fight(unit_1, unit_2, behind=False)
def fight(unit_1, unit_2, behind=True):
while True:
if not unit_2.attackedBy(unit_1, behind):
return True
if not unit_1.attackedBy(unit_2, behind):
return False
return not unit_2.is_alive
June 17, 2020