import math
# Константы
N_MAX = 6
P = 0.46
INV_P = 1 / P # примерно 2.173913
# Начальные базовые коэффициенты (доли от цены самолёта)
BASE_COEFFS = {
'ИК УРВП': 0.80,
'ТВ УРВП': 0.66,
'Лазерные/ГНСС УРВП': 0.40,
'Лазерные/ГНСС КАБы': 0.36,
'ИК КАБы': 0.72,
'ТВ КАБы': 0.60,
}
def calculate_price(base_price, quantities, coeffs):
"""
quantities: dict {название: количество}
coeffs: dict {название: базовый коэффициент}
Возвращает цену подвеса.
"""
# Эффективные количества (не более N_MAX)
eff_quantities = {name: min(q, N_MAX) for name, q in quantities.items()}
# Сумма приведённых весов
s = 0.0
for name, q_eff in eff_quantities.items():
if q_eff > 0:
w = coeffs[name] ** INV_P # приведённый вес
s += q_eff * w
if s == 0:
return 0.0
# Нормировка и возведение в степень
price = base_price * (s / N_MAX) ** P
return price
def input_float(prompt, min_val=None, max_val=None):
while True:
try:
val = float(input(prompt))
if min_val is not None and val < min_val:
print(f"Значение должно быть не меньше {min_val}")
continue
if max_val is not None and val > max_val:
print(f"Значение должно быть не больше {max_val}")
continue
return val
except ValueError:
print("Ошибка: введите число")
def input_int(prompt, min_val=0, max_val=None):
while True:
try:
val = int(input(prompt))
if min_val is not None and val < min_val:
print(f"Значение должно быть не меньше {min_val}")
continue
if max_val is not None and val > max_val:
print(f"Значение должно быть не больше {max_val}")
continue
return val
except ValueError:
print("Ошибка: введите целое число")
def edit_coeffs(coeffs):
print("\nТекущие базовые коэффициенты (доля от цены самолёта):")
for name, val in coeffs.items():
print(f" {name}: {val:.2f} ({val*100:.0f}%)")
print("Введите новые значения (или оставьте пустым для сохранения текущего):")
new_coeffs = {}
for name, old_val in coeffs.items():
while True:
inp = input(f" {name} [{old_val}]: ").strip()
if inp == "":
new_coeffs[name] = old_val
break
try:
new_val = float(inp)
if 0 <= new_val <= 1:
new_coeffs[name] = new_val
break
else:
print("Значение должно быть от 0 до 1")
except ValueError:
print("Ошибка: введите число или оставьте пустым")
return new_coeffs
def input_quantities(coeffs):
quantities = {}
print("\nВведите количество каждого типа вооружения (целое неотрицательное число):")
for name in coeffs.keys():
q = input_int(f" {name}: ", min_val=0)
quantities[name] = q
return quantities
def main():
coeffs = BASE_COEFFS.copy()
print("=== Калькулятор цены управляемого вооружения для War Thunder ===")
print(f"Максимальное количество для учёта: {N_MAX}")
print(f"Коэффициент нелинейности p = {P}")
while True:
print("\nМеню:")
print("1. Изменить базовые коэффициенты")
print("2. Рассчитать цену подвеса")
print("3. Выход")
choice = input("Выберите действие (1-3): ").strip()
if choice == '1':
coeffs = edit_coeffs(coeffs)
elif choice == '2':
# Ввод базовой цены самолёта
base_price = input_float("Введите базовую цену самолёта (480-540): ", min_val=480, max_val=540)
# Ввод количеств
quantities = input_quantities(coeffs)
# Расчёт
price = calculate_price(base_price, quantities, coeffs)
total = base_price + price
percent = (price / base_price) * 100 if base_price != 0 else 0
print(f"\nЦена подвеса: {price:.1f} очков (округлённо {round(price)})")
print(f"Полная цена самолёта: {total:.1f} очков (округлённо {round(total)})")
print(f"Стоимость подвесов относительно базовой цены: {percent:.1f}%")
elif choice == '3':
print("Выход.")
break
else:
print("Неверный ввод, попробуйте снова.")
if __name__ == "__main__":
main()