89 lines
2.4 KiB
Elixir
89 lines
2.4 KiB
Elixir
# Installer Jason pour JSON si besoin
|
|
Mix.install([
|
|
{:jason, "~> 1.4"}
|
|
])
|
|
|
|
defmodule ZombieApocalypse do
|
|
@state_file "states.json"
|
|
@final_file "states_final.json"
|
|
|
|
# Démarrage de la simulation
|
|
def start(humans \\ 10, zombies \\ 3, max_hours \\ 200) do
|
|
# Vider le fichier temporaire
|
|
File.write!(@state_file, "")
|
|
|
|
IO.puts("🧟 Lancement de la simulation Zombie Apocalypse !")
|
|
|
|
# Ouvrir le fichier en continu pour append rapide
|
|
{:ok, file} = File.open(@state_file, [:write, :utf8])
|
|
|
|
# Boucle principale
|
|
loop(0, humans, zombies, max_hours, file)
|
|
|
|
# Fermer le fichier
|
|
File.close(file)
|
|
|
|
# Générer JSON final
|
|
finalize_json()
|
|
end
|
|
|
|
# Boucle principale
|
|
defp loop(hour, humans, zombies, max_hours, file) when hour < max_hours do
|
|
state = %{
|
|
hour: hour,
|
|
humans: humans,
|
|
zombies: zombies,
|
|
timestamp: DateTime.utc_now()
|
|
}
|
|
|
|
# Append rapide
|
|
IO.write(file, Jason.encode!(state) <> "\n")
|
|
|
|
# Afficher seulement toutes les 10 heures
|
|
if rem(hour, 10) == 0 do
|
|
IO.puts("Heure #{hour} | Humains: #{humans} | Zombies: #{zombies}")
|
|
end
|
|
|
|
cond do
|
|
humans <= 0 ->
|
|
IO.puts("💀 Tous les humains ont été infectés.")
|
|
|
|
zombies <= 0 ->
|
|
IO.puts("🎉 Tous les zombies ont été éliminés.")
|
|
|
|
true ->
|
|
{new_humans, new_zombies} = simulate_hour(humans, zombies)
|
|
loop(hour + 1, new_humans, new_zombies, max_hours, file)
|
|
end
|
|
end
|
|
|
|
defp loop(_hour, _humans, _zombies, _max_hours, _file), do: :ok
|
|
|
|
# Simulation d'une heure (calcul probabiliste)
|
|
defp simulate_hour(humans, zombies) do
|
|
attacks = zombies
|
|
# Humains infectés : chaque attaque a 40% de chance
|
|
humans_lost = Enum.count(1..attacks, fn _ -> :rand.uniform(100) <= 40 end)
|
|
# Zombies tués : chaque attaque a 15% de chance
|
|
zombies_lost = Enum.count(1..attacks, fn _ -> :rand.uniform(100) <= 15 end)
|
|
|
|
humans = max(humans - humans_lost, 0)
|
|
zombies = max(zombies - zombies_lost + humans_lost, 0) # infections
|
|
{humans, zombies}
|
|
end
|
|
|
|
# Générer le JSON final complet
|
|
defp finalize_json do
|
|
states =
|
|
File.stream!(@state_file)
|
|
|> Stream.map(&Jason.decode!/1)
|
|
|> Enum.to_list()
|
|
|
|
File.write!(@final_file, Jason.encode!(states, pretty: true))
|
|
IO.puts("✅ JSON final créé : #{@final_file}")
|
|
end
|
|
end
|
|
|
|
# Lancer la simulation
|
|
ZombieApocalypse.start(7000000000, 3, 200)
|