import tkinter as tk from tkinter import messagebox, ttk def display_scene(): """Очищает окно и отображает текущую сцену""" for widget in root.winfo_children(): widget.destroy() if current_scene in scenes: scenes[current_scene]() else: game_over() def game_over(): """Финал игры: показ результата""" frame = tk.Frame(root, bg="#f0f8ff") frame.pack(pady=50) tk.Label( frame, text="Игра завершена!", font=("Arial", 24, "bold"), bg="#f0f8ff", fg="#2c3e50" ).pack(pady=20) # Оценка результата по набранным баллам if score >= 45: result = "Отлично! Система полностью защищена." elif score >= 30: result = "Хорошо! Есть небольшие уязвимости." elif score >= 15: result = "Удовлетворительно. Требуется доработка защиты." else: result = "Критические уязвимости! Пересмотрите политику безопасности." tk.Label( frame, text=f"Ваш итоговый счёт: {score}/50\n\n{result}", font=("Arial", 14), bg="#f0f8ff", fg="#2c3e50", justify="center" ).pack(pady=20) tk.Button( frame, text="Начать заново", command=restart, bg="#3498db", fg="white", font=("Arial", 12), padx=20 ).pack(pady=10) def restart(): """Перезапуск игры""" score = 0 current_scene = 1 display_scene() # --- Сцены игры --- def scene_1(): """Сцена 1: Аутентификация пользователей""" tk.Label( root, text="Сцена 1: Настройка аутентификации", font=("Arial", 18, "bold"), bg="#f0f8ff", fg="#2c3e50" ).pack(pady=20) tk.Label( root, text="Выберите методы аутентификации для доступа к принтеру.", font=("Arial", 12), bg="#f0f8ff", fg="#34495e", wraplength=700, justify="center" ).pack(pady=10) # Переменные для чекбоксов auth_vars = { "smartcard": tk.BooleanVar(), "pin": tk.BooleanVar(), "biometry": tk.BooleanVar(), "mfa": tk.BooleanVar() } tk.Checkbutton( root, text="Смарт‑карта", variable=auth_vars["smartcard"], bg="#f0f8ff", font=("Arial", 11) ).pack(anchor="w", padx=100, pady=5) tk.Checkbutton( root, text="PIN‑код (6+ цифр)", variable=auth_vars["pin"], bg="#f0f8ff", font=("Arial", 11) ).pack(anchor="w", padx=100, pady=5) tk.Checkbutton( root, text="Биометрия (отпечаток)", variable=auth_vars["biometry"], bg="#f0f8ff", font=("Arial", 11) ).pack(anchor="w", padx=100, pady=5) tk.Checkbutton( root, text="Многофакторная аутентификация (MFA)", variable=auth_vars["mfa"], bg="#f0f8ff", font=("Arial", 11) ).pack(anchor="w", padx=100, pady=5) # Кнопка проверки tk.Button( root, text="Применить настройки", command=check_scene_1, bg="#27ae60", fg="white", font=("Arial", 12), padx=20 ).pack(pady=30) def check_scene_1(): auth_vars = {} """Проверка условий сцены 1""" selected = [ auth_vars["smartcard"].get(), auth_vars["pin"].get(), auth_vars["biometry"].get(), auth_vars["mfa"].get() ] if sum(selected) >= 2 and auth_vars["mfa"].get(): score += 10 messagebox.showinfo("Успех", "Правильно! MFA + ещё один метод обеспечивают надёжную защиту.") current_scene += 1 display_scene() else: messagebox.showwarning( "Ошибка", "Выберите минимум 2 метода, включая MFA." ) def scene_2(): """Сцена 2: Контроль вывода на печать""" tk.Label( root, text="Сцена 2: Настройка контроля печати", font=("Arial", 18, "bold"), bg="#f0f8ff", fg="#2c3e50" ).pack(pady=20) tk.Label( root, text="Настройте правила вывода документов на принтер.", font=("Arial", 12), bg="#f0f8ff", fg="#34495e", wraplength=700, justify="center" ).pack(pady=10) # Максимальное число копий tk.Label( root, text="Максимальное число копий:", font=("Arial", 11), bg="#f0f8ff" ).pack(anchor="w", padx=100, pady=5) copies_var = tk.IntVar(value=1) ttk.Spinbox( root, from_=1, to=10, textvariable=copies_var, width=5 ).pack(anchor="w", padx=100, pady=5) # Водяной знак tk.Label( root, text="Добавить водяной знак:", font=("Arial", 11), bg="#f0f8ff" ).pack(anchor="w", padx=100, pady=5) watermark_var = tk.StringVar(value="Конфиденциально") watermark_options = [ "Нет", "Конфиденциально", "ФИО пользователя", "Дата и время", "ID задания" ] ttk.Combobox( root, textvariable=watermark_var, values=watermark_options, state="readonly", width=20 ).pack(anchor="w", padx=100, pady=5) root = tk.Tk() root.title("Защитник печати") root.geometry("800x600") root.configure(bg="#f0f8ff") score = 0 current_scene = 1 # Словарь сцен: номер → метод scenes = { 1: scene_1, 2: scene_2, } display_scene() root.mainloop()