
The Lancers

Suddenly, new soldiers joined the Umbert’s ranks - has he really got an ace up his sleeve? Lancers presented the fresh forces, which made Sir Ronald’s position increasingly difficult, lancers could attack two soldiers at once with their long spears. Something needed to be done with that…
It seems that the Warrior, Knight, Defender and Vampire are not enough to win the battle. Let's add one more powerful unit type - the Lancer.
Lancer should be the subclass of the Warrior class and should attack in a specific way - when he hits the other unit, he also deals a 50% of the dealt damage to the enemy unit, standing behind the firstly assaulted one (enemy defense makes the dealt damage value lower - consider this).
The basic parameters of the Lancer:
health = 50
attack = 6
Example:
chuck = Warrior() bruce = Warrior() carl = Knight() dave = Warrior() mark = Warrior() bob = Defender() mike = Knight() rog = Warrior() lancelot = Defender() eric = Vampire() adam = Vampire() richard = Defender() ogre = Warrior() freelancer = Lancer() vampire = Vampire() assert fight(chuck, bruce) == True assert fight(dave, carl) == False assert chuck.is_alive == True assert bruce.is_alive == False assert carl.is_alive == True assert dave.is_alive == False assert fight(carl, mark) == False assert carl.is_alive == False assert fight(bob, mike) == False assert fight(lancelot, rog) == True assert fight(eric, richard) == False assert fight(ogre, adam) == True assert fight(freelancer, vampire) == True assert freelancer.is_alive == True my_army = Army() my_army.add_units(Defender, 2) my_army.add_units(Vampire, 2) my_army.add_units(Lancer, 4) my_army.add_units(Warrior, 1) enemy_army = Army() enemy_army.add_units(Warrior, 2) enemy_army.add_units(Lancer, 2) enemy_army.add_units(Defender, 2) enemy_army.add_units(Vampire, 3) army_3 = Army() army_3.add_units(Warrior, 1) army_3.add_units(Lancer, 1) army_3.add_units(Defender, 2) army_4 = Army() army_4.add_units(Vampire, 3) army_4.add_units(Warrior, 1) army_4.add_units(Lancer, 2) battle = Battle() assert battle.fight(my_army, enemy_army) == True assert battle.fight(army_3, army_4) == False
Input: The warriors and armies.
Output: The result of the battle (True or False).
How it is used: For computer games development.
Precondition: 5 types of units