Untitled
unknown
python
10 months ago
7.0 kB
6
Indexable
import random
import matplotlib.pyplot as plt
forces = {
"Polskie wojska specjalne": {
"soldiers": 500,
"small_arms": "HK416",
"support_weapons": "FN Minimi Para",
"ammo_per_soldier": 240,
"logistics": "Limited (fuel, ammo, medical equipment in base)",
"detection_prob": 0.08,
"hit_prob": 0.27,
"kill_prob": 0.25
},
"Talibowie": {
"soldiers": 1300,
"small_arms": "AK-47",
"support_weapons": "RPG-7, CKM",
"ammo_per_soldier": 120,
"logistics": "Limited (ammo, fuel, basic medical supplies)",
"detection_prob": 0.10,
"hit_prob": 0.2,
"kill_prob": 0.19
}
}
# Funkcja do uwzględnienia efektów terenowych
def terrain_effect():
terrain_effects = [
("Mountain terrain", 1.2, 0.8),
("Flat terrain", 1.0, 1.0),
("Desert terrain", 0.9, 1.1)
]
terrain = random.choice(terrain_effects)
print(f"Terrain effect: {terrain[0]} (Defenders multiplier: {terrain[1]}, Attackers multiplier: {terrain[2]})")
return terrain[1], terrain[2]
# Funkcja do uwzględnienia efektów pogodowych
def weather_effect():
weather_effects = [
("Clear weather", 1.0, 1.0),
("Rain", 0.9, 0.8),
("Fog", 0.8, 0.9)
]
weather = random.choice(weather_effects)
print(f"Weather effect: {weather[0]} (Defenders multiplier: {weather[1]}, Attackers multiplier: {weather[2]})")
return weather[1], weather[2]
# Funkcja do obliczenia wyniku starcia
def calculate_battle_outcome(defenders, attackers, turn, terrain_multiplier, weather_multiplier):
# Obrona zyskuje na skuteczności w każdej turze
defender_boost = 1 + (turn * 0.13)
defender_detection_effect = defenders["detection_prob"] * terrain_multiplier * weather_multiplier
attacker_detection_effect = attackers["detection_prob"] * terrain_multiplier * weather_multiplier
defender_hit_effect = defenders["hit_prob"] * defender_detection_effect
attacker_hit_effect = attackers["hit_prob"] * attacker_detection_effect
defender_kill_effect = defenders["kill_prob"] * defender_hit_effect
attacker_kill_effect = attackers["kill_prob"] * attacker_hit_effect
# Efektywność obu stron uwzględniająca liczebność, amunicję i współczynniki
defender_effectiveness = (defenders["soldiers"] * defenders["ammo_per_soldier"] * defender_kill_effect * defender_boost)
attacker_effectiveness = (attackers["soldiers"] * attackers["ammo_per_soldier"] * attacker_kill_effect)
# Straty obu stron
defender_losses = int(attacker_effectiveness * random.uniform(0.1, 0.25))
attacker_losses = int(defender_effectiveness * random.uniform(0.2, 0.4))
defenders["soldiers"] -= defender_losses
attackers["soldiers"] -= attacker_losses
# Zużycie amunicji obu stron
defenders["ammo_per_soldier"] = max(0, defenders["ammo_per_soldier"] - int(defender_losses * 0.45))
attackers["ammo_per_soldier"] = max(0, attackers["ammo_per_soldier"] - int(attacker_losses * 0.1))
return defenders, attackers
# Funkcja do symulacji bitwy
def simulate_battle_step(defenders, attackers, terrain_multiplier_def, terrain_multiplier_att, weather_multiplier_def, weather_multiplier_att, turn):
defenders, attackers = calculate_battle_outcome(defenders, attackers, turn, terrain_multiplier_def, weather_multiplier_def)
total_soldiers = defenders["soldiers"] + attackers["soldiers"]
defender_chance = defenders["soldiers"] / total_soldiers if total_soldiers > 0 else 0
attacker_chance = attackers["soldiers"] / total_soldiers if total_soldiers > 0 else 0
print(f"Turn {turn}:")
print(f" Defenders: {defenders['soldiers']} soldiers, {defenders['ammo_per_soldier']} ammo remaining per soldier")
print(f" Attackers: {attackers['soldiers']} soldiers, {attackers['ammo_per_soldier']} ammo remaining per soldier")
return defenders, attackers, defender_chance, attacker_chance
# Funkcja do inicjalizacji symulacji
def initialize_battle():
terrain_multiplier_def, terrain_multiplier_att = terrain_effect()
weather_multiplier_def, weather_multiplier_att = weather_effect()
return terrain_multiplier_def, terrain_multiplier_att, weather_multiplier_def, weather_multiplier_att
# Dane początkowe
polish_special_forces = forces["Polskie wojska specjalne"].copy()
taliban_forces = forces["Talibowie"].copy()
terrain_multiplier_def, terrain_multiplier_att, weather_multiplier_def, weather_multiplier_att = initialize_battle()
defender_chances = []
attacker_chances = []
defender_soldiers = []
attacker_soldiers = []
defender_ammo = []
attacker_ammo = []
turn = 0
# Symulacja tury
while polish_special_forces["soldiers"] > 0 and taliban_forces["soldiers"] > 0:
turn += 1
input("Press Enter to proceed to the next turn...")
polish_special_forces, taliban_forces, defender_chance, attacker_chance = simulate_battle_step(
polish_special_forces, taliban_forces,
terrain_multiplier_def, terrain_multiplier_att,
weather_multiplier_def, weather_multiplier_att,
turn
)
# Aktualizuj dane
defender_chances.append(defender_chance)
attacker_chances.append(attacker_chance)
defender_soldiers.append(polish_special_forces["soldiers"])
attacker_soldiers.append(taliban_forces["soldiers"])
defender_ammo.append(polish_special_forces["ammo_per_soldier"])
attacker_ammo.append(taliban_forces["ammo_per_soldier"])
# Sprawdź warunki zakończenia
if polish_special_forces["ammo_per_soldier"] <= 0 or taliban_forces["ammo_per_soldier"] <= 0:
print("Ammunition depleted for one side!")
break
# Wykres szans na wygraną
plt.plot(range(1, len(defender_chances) + 1), defender_chances, label="Defenders Win Probability")
plt.plot(range(1, len(attacker_chances) + 1), attacker_chances, label="Attackers Win Probability")
plt.xlabel("Turn")
plt.ylabel("Probability")
plt.title("Win Probability Over Time")
plt.legend()
plt.show()
# Wykres strat logistycznych
plt.plot(range(1, len(defender_soldiers) + 1), defender_soldiers, label="Defenders Soldiers")
plt.plot(range(1, len(attacker_soldiers) + 1), attacker_soldiers, label="Attackers Soldiers")
plt.xlabel("Turn")
plt.ylabel("Soldiers")
plt.title("Soldiers Remaining Over Time")
plt.legend()
plt.show()
# Wykres zużycia amunicji
plt.plot(range(1, len(defender_ammo) + 1), defender_ammo, label="Defenders Ammo Per Soldier")
plt.plot(range(1, len(attacker_ammo) + 1), attacker_ammo, label="Attackers Ammo Per Soldier")
plt.xlabel("Turn")
plt.ylabel("Ammo Per Soldier")
plt.title("Ammo Usage Over Time")
plt.legend()
plt.show()
if polish_special_forces["soldiers"] > taliban_forces["soldiers"]:
print("Defenders win!")
else:
print("Attackers win!")
Editor is loading...
Leave a Comment