import random
class Plant:
def __init__(self, name, direct_damage, penetration_damage, attack_frequency):
self.name = name
self.direct_damage = direct_damage
self.penetration_damage = penetration_damage
self.attack_frequency = attack_frequency
self.last_attack_time = 0
self.cumulative_damage = 0
def can_attack(self, time):
return (time - self.last_attack_time) >= self.attack_frequency
def attack(self, zombies, time):
attacked_zombies = []
if zombies and zombies[0].is_alive():
front_zombie = zombies[0]
front_zombie.health -= self.direct_damage
self.cumulative_damage += self.direct_damage
print(f"At time {time} second, {self.name} attacks and reduces the front zombie health to {front_zombie.health}. Cumulative damage: {self.cumulative_damage}")
if self.penetration_damage > 0:
total_penetration_damage = 0
for zombie in zombies:
if zombie.is_alive():
zombie.health -= self.penetration_damage
total_penetration_damage += self.penetration_damage
self.cumulative_damage += total_penetration_damage
print(
f" - Additional penetration damage of {total_penetration_damage} to all zombies. New cumulative damage: {self.cumulative_damage}")
print(f"{self.name} attacks at time {time}:")
for zombie in attacked_zombies:
print(f" - {zombie.__class__.__name__} health: {zombie.health}")
self.last_attack_time = time
class Zombie:
def __init__(self, health):
self.health = health
def is_alive(self):
return self.health > 0
def die(self, zombies):
if not self.is_alive():
zombies.remove(self)
def simulate_battle(plants, zombies):
time = 0
while zombies:
time += 1
for plant in plants:
if plant.can_attack(time):
plant.attack(zombies, time)
for zombie in list(zombies):
if not zombie.is_alive():
zombie.die(zombies)
break
print(f"Time step: {time}")
print("Zombie healths:", [zombie.health for zombie in zombies if zombie.is_alive()])
print(f"\nAll zombies have been defeated after {time} time steps.")
hamburger = Plant(name="hamburger", direct_damage=random.randint(160, 640), penetration_damage=0, attack_frequency=2.5)
watermelon = Plant(name="watermelon", direct_damage=80, penetration_damage=20, attack_frequency=1.5)
pea = Plant(name="pea", direct_damage=240, penetration_damage=0, attack_frequency=2)
cactus = Plant(name="cactus", direct_damage=0, penetration_damage=120, attack_frequency=2.5)
zombies = [Zombie(health=10000) for _ in range(2)]
simulate_battle([hamburger, watermelon, pea, cactus], zombies)