Untitled
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!")
Leave a Comment