Загрузка данных
# main.py
import random
from store import Store
from supplier import Supplier
from courier import Courier
from utils import select_store, calculate_payment, format_hours
def main() -> None:
# Создаём поставщиков для магазинов
supplier1 = Supplier("ООО Поставщик 1", success_prob=0.9)
supplier2 = Supplier("ООО Поставщик 2", success_prob=0.8)
supplier3 = Supplier("ООО Поставщик 3", success_prob=0.85)
# Три магазина с разной скоростью и графиками
central = Store("Центральный", processing_time=0,
open_hour=9.0, close_hour=21.0,
supplier=supplier1)
east = Store("Восточный", processing_time=5,
open_hour=8.0, close_hour=22.0,
supplier=supplier2)
north = Store("Северный", processing_time=10,
open_hour=8.0, close_hour=20.0,
supplier=supplier3)
stores = [central, east, north]
couriers = [
Courier("Иван", "пеший"),
Courier("Петр", "вело"),
Courier("Мария", "авто"),
Courier("Анна", "вело"),
]
print("=== Система доставки из магазина ===\n")
try:
time_str = input("Введите текущее время в формате ЧЧ:ММ (например 8:30): ")
h, m = map(int, time_str.split(':'))
current_hour = h + m / 60.0
except (ValueError, TypeError):
print("Неверный формат, используется 8:30 по умолчанию.")
current_hour = 8.5
print(f"Текущее время: {int(current_hour)}:{int((current_hour%1)*60):02d}")
# Шаг 1: выбор магазина
chosen_store = select_store(stores, current_hour)
if chosen_store is None:
print("Все магазины закрыты. Приходите позже.")
return
print(f"\nВыбран магазин: {chosen_store}.")
remaining = chosen_store.time_until_close(current_hour)
if remaining > 0:
print(f"Магазин закроется через {format_hours(remaining)}.")
# Шаг 2: проверка товара в магазине
item = "item1"
if not chosen_store.has_item(item):
print(f"\nТовара '{item}' нет в наличии в магазине.")
ans = input("Попытаться заказать у поставщика? (да/нет): ").strip().lower()
if ans not in ('да', 'yes', 'y'):
print("Заказ отменён. До свидания!")
return
print(f"Запрашиваем поставщика {chosen_store.supplier.name}...")
success, delay = chosen_store.request_supplier(item)
if not success:
print("К сожалению, поставщик не смог выполнить заказ. Попробуйте позже.")
return
print(f"Поставщик доставит товар через {delay:.1f} ч.")
# Ждать ли пользователю? Можно запросить или просто имитировать ожидание.
wait_ans = input(f"Ожидать {delay:.1f} ч. до поступления товара? (да/нет): ").strip().lower()
if wait_ans not in ('да', 'yes', 'y'):
print("Заказ отменён.")
return
# Имитация ожидания (время продвигается)
print(f"Ожидаем {format_hours(delay)}...")
# Для симуляции изменим текущее время
current_hour += delay
print(f"Новое время: {int(current_hour)}:{int((current_hour%1)*60):02d}")
# Проверяем, не закрылся ли магазин после ожидания
if not chosen_store.is_open(current_hour):
print("Магазин закрылся во время ожидания поставки. Заказ отменён.")
return
remaining = chosen_store.time_until_close(current_hour)
print(f"Магазин закроется через {format_hours(remaining)}.")
else:
print("Товар в наличии.")
# Шаг 3: тип доставки
choice = input("\nВыберите тип доставки (обычная/экспресс): ").strip().lower()
is_express = choice == "экспресс"
print("Экспресс-доставка активирована." if is_express else "Обычная доставка.")
# Шаг 4: курьер
courier = random.choice(couriers)
base_time = courier.estimate_delivery_time()
total_estimation = base_time + chosen_store.processing_time
print(f"\n{courier} взял ваш заказ.")
print(f"Расчётное время доставки: {total_estimation} мин.")
# Шаг 5: явка курьера
if not courier.shows_up():
print(f"\nКурьер не вышел на работу и оштрафован на {Courier.NO_SHOW_FINE:.0f} руб.")
print("Простите за неудобства.")
courier.receive_payment(-Courier.NO_SHOW_FINE)
return
# Шаг 6: оценка
try:
rating = int(input("\nПожалуйста, оцените доставку от 1 до 5: "))
if not 1 <= rating <= 5:
raise ValueError
except (ValueError, TypeError):
print("Некорректная оценка. Присвоена 3 по умолчанию.")
rating = 3
payment = calculate_payment(rating, is_express)
courier.receive_payment(payment)
coeff_map = {1: 1.0, 2: 1.2, 3: 1.4, 4: 1.6, 5: 1.8}
coeff = coeff_map[rating]
desc = f"200 * {coeff:.1f}"
if is_express:
desc += " * 1.5 (экспресс)"
print(f"\n{courier.name} выполнил заказ на {rating} и получил {payment:.2f} рублей ({desc})")
print(f"Общий заработок курьера: {courier.total_earned:.2f} руб.")
if __name__ == "__main__":
main()