Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for The Warlords by pokosasa
class Warrior:
def __init__(self):
self.max_health=50
self.health=50
self.attack=5
self.defense=0
self.has_defense=False
self.vampirism=0
self.has_vampirism=False
self.lance=0
self.has_lance=False
self.heal_power=0
self.has_heal=False
@property
def is_alive(self):
return self.health>0
def equip_weapon(self,weapon):
self.max_health=max(0,self.max_health+weapon.health)
self.health=max(0,self.health+weapon.health)
self.attack=max(0,self.attack+weapon.attack)
self.defense=max(0,(self.defense+weapon.defense)*self.has_defense)
self.vampirism=max(0,(self.vampirism+weapon.vampirism)*self.has_vampirism)
self.heal_power=max(0,(self.heal_power+weapon.heal_power)*self.has_heal)
class Knight(Warrior):
def __init__(self):
super().__init__()
self.attack = 7
class Defender(Warrior):
def __init__(self):
super().__init__()
self.max_health=60
self.health = 60
self.attack = 3
self.defense = 2
self.has_defense=True
class Vampire(Warrior):
def __init__(self):
super().__init__()
self.max_health=40
self.health = 40
self.attack = 4
self.vampirism = 50
self.has_vampirism=True
class Lancer(Warrior):
def __init__(self):
super().__init__()
self.attack=6
self.lance=50
self.has_lance=True
class Healer(Warrior):
def __init__(self):
super().__init__()
self.max_health=60
self.health=60
self.attack=0
self.heal_power=2
self.has_heal=True
def heal(self,allie):
allie.health=min(allie.health+self.heal_power,allie.max_health)
class Rookie(Warrior):
def __init__(self):
super().__init__()
self.attack = 1
class Warlord(Warrior):
def __init__(self):
super().__init__()
self.max_health=100
self.health=100
self.attack=4
self.defense=2
self.has_defense=True
def fight(units_1, units_2):
offence=units_1=[units_1] if type(units_1)!=list else units_1
defence=units_2=[units_2] if type(units_2)!=list else units_2
while offence[0].is_alive and defence[0].is_alive:
damage=offence[0].attack-defence[0].defense
if damage>0:
defence[0].health -= damage
offence[0].health += int(damage * offence[0].vampirism / 100)
if len(defence)>1 and offence[0].has_lance:
damage=damage*offence[0].lance/100-defence[1].defense
if damage>0:
defence[1].health -= damage
if len(offence)>1 and offence[1].has_heal:
offence[1].heal(offence[0])
offence,defence=defence,offence
return units_1[0].is_alive
class Army:
def __init__(self):
self.units=[]
self.has_warlord=False
def add_units(self,Warrior,n):
if Warrior==Warlord:
if self.has_warlord:
return
self.has_warlord=True
n=1
self.units.extend([Warrior() for _ in range(n)])
def move_units(self):
if not self.has_warlord:
return
for unit in self.units.copy():
if unit.has_lance:
self.units.remove(unit)
self.units.insert(0,unit)
break
else:
for unit in self.units[0:]:
if unit.attack>self.units[0].attack:
self.units.remove(unit)
self.units.insert(0,unit)
for unit in self.units[::]:
if unit.has_heal:
self.units.remove(unit)
self.units.insert(1,unit)
for unit in self.units:
if isinstance(unit,Warlord):
self.units.remove(unit)
self.units.append(unit)
break
class Battle:
def fight(self,army_1,army_2):
while len(army_1.units)*len(army_2.units):
if fight(army_1.units,army_2.units):
army_2.units.pop(0)
army_2.move_units()
else:
army_1.units.pop(0)
army_1.move_units()
return army_1.units!=[]
def straight_fight(self,army_1,army_2):
while len(army_1.units)*len(army_2.units):
pairs=list(zip(army_1.units,army_2.units))
for unit_1,unit_2 in pairs:
if fight(unit_1,unit_2):
army_2.units.remove(unit_2)
else:
army_1.units.remove(unit_1)
return army_1.units!=[]
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)
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
ronald = Warlord()
heimdall = Knight()
fight(heimdall, ronald) == False
my_army = Army()
my_army.add_units(Warlord, 1)
my_army.add_units(Warrior, 2)
my_army.add_units(Lancer, 2)
my_army.add_units(Healer, 2)
enemy_army = Army()
enemy_army.add_units(Warlord, 3)
enemy_army.add_units(Vampire, 1)
enemy_army.add_units(Healer, 2)
enemy_army.add_units(Knight, 2)
my_army.move_units()
enemy_army.move_units()
type(my_army.units[0]) == Lancer
type(my_army.units[1]) == Healer
type(my_army.units[-1]) == Warlord
type(enemy_army.units[0]) == Vampire
type(enemy_army.units[-1]) == Warlord
type(enemy_army.units[-2]) == Knight
#6, not 8, because only 1 Warlord per army could be
len(enemy_army.units) == 6
battle = Battle()
battle.fight(my_army, enemy_army) == True
print("Coding complete? Let's try tests!")
Nov. 15, 2019