Non-deterministic Behavior in Army Battle
In the following scenario my code sometimes returns True and sometimes False. Can somebody see, why?
battle = Battle() army_1, army_2 = Army(), Army() army_1.add_units(Warrior, 20) army_2.add_units(Warrior, 21) print(battle.fight(army_1, army_2))
Here is my code:
class Warrior: _n = count() def __init__(self): self.h = 50 self.a = 5 self.is_alive = True self._id = next(Warrior._n) def lh(self, o): self.h = self.h - o self.is_alive = self.h > 0 print(f"{self} took {o} damage, remaining health: {self.h}") def reset(self): self.h = 50 self.is_alive = True def __repr__(self): return f"{self.__class__.__name__}:{self._id}" class Knight(Warrior): def __init__(self): super().__init__() self.a = 7 class Army(): def __init__(self): self.warriors = [] def add_units(self, warrior, amound): for i in range(amound): self.warriors.append(warrior()) class Battle(): def fight(self, my_army, enemy): mi, ei = 0, 0 m, e = [copy.deepcopy(w) for w in my_army.warriors], [copy.deepcopy(w) for w in enemy.warriors] f = False while mi < len(m) and ei < len(e): print(f"{m[mi]} fight against {e[ei]}") f = fight(m[mi], e[ei]) mi, ei = (mi, ei + 1) if f else (mi + 1, ei) return mi < len(m) def fight(a, b): m = min(b.h // a.a, a.h // b.a) if m * b.a == a.h: m -= 1 a.lh((m) * b.a) b.lh((m+1) * a.a) if b.is_alive: a.lh(b.a) return a.is_alive