Untitled

 avatar
unknown
python
a month ago
7.0 kB
3
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!")
Leave a Comment