# Taken from mission The Warriors class Warrior: def __init__(self): self.health = 50 self.attack = 5 self.is_alive = True def hit(self, other_unit) -> bool: other_unit.health -= self.attack other_unit.is_alive = other_unit.health > 0 return other_unit.is_alive class Knight(Warrior): def __init__(self): super().__init__() self.attack = 7 def fight(unit_1, unit_2): while unit_1.is_alive and unit_2.is_alive: if not unit_1.hit(unit_2): return True if not unit_2.hit(unit_1): return False class Army: def __init__(self): self.units = [] def add_units(self, unit_type, quantity): for i in range(quantity): self.units.append(unit_type()) class Battle: def fight(self, army_1: Army, army_2: Army) -> bool: while len(army_1.units) > 0 and len(army_2.units) > 0: current_unit_1 = army_1.units[0] current_unit_2 = army_2.units[0] if fight(current_unit_1, current_unit_2): army_2.units.pop(0) else: army_1.units.pop(0) return len(army_1.units) > 0 if __name__ == '__main__': # These "asserts" using only for self-checking and not necessary for auto-testing # fight tests chuck = Warrior() bruce = Warrior() carl = Knight() dave = Warrior() mark = Warrior() 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 # battle tests my_army = Army() my_army.add_units(Knight, 3) enemy_army = Army() enemy_army.add_units(Warrior, 3) army_3 = Army() army_3.add_units(Warrior, 20) army_3.add_units(Knight, 5) army_4 = Army() army_4.add_units(Warrior, 30) battle = Battle() assert battle.fight(my_army, enemy_army) == True assert battle.fight(army_3, army_4) == False print("Coding complete? Let's try tests!") army_1 = Army() army_2 = Army() army_1.add_units(Warrior, 10) army_2.add_units(Warrior, 11) battle = Battle() battle.fight(army_1, army_2)