Загрузка данных


import tkinter as tk
import random
from tkinter import messagebox

def make_sound():
    if not app.sound_on:
        return
    try:
        import winsound
        winsound.Beep(800, 150)
    except:
        root.bell()


choices = ["Камень", "Ножницы", "Бумага"]

def get_winner(player, comp):
    if player == comp:
        return "draw"
    if (player == "Камень" and comp == "Ножницы") or \
       (player == "Ножницы" and comp == "Бумага") or \
       (player == "Бумага" and comp == "Камень"):
        return "win"
    return "lose"


class RPSApp:
    def __init__(self, root):
        self.root = root
        self.root.title("КНБ")
        self.root.geometry("600x500")

        self.win_streak = 0
        self.dark_theme = False
        self.sound_on = True

        self.main_menu()

    def apply_theme(self, widget):
        bg = "#222" if self.dark_theme else "#f0f0f0"
        fg = "#fff" if self.dark_theme else "#000"

        widget.configure(bg=bg)
        for child in widget.winfo_children():
            try:
                child.configure(bg=bg, fg=fg)
            except:
                pass

    def toggle_theme(self):
        self.dark_theme = not self.dark_theme
        self.main_menu()

    def toggle_sound(self):
        self.sound_on = not self.sound_on
        self.main_menu()

    
    def main_menu(self):
        for w in self.root.winfo_children():
            w.destroy()

        frame = tk.Frame(self.root)
        frame.grid(sticky="nsew")

        self.root.grid_rowconfigure(0, weight=1)
        self.root.grid_columnconfigure(0, weight=1)

        frame.grid_rowconfigure((0,1,2,3,4), weight=1)
        frame.grid_columnconfigure(0, weight=1)

        tk.Label(frame, text="Камень Ножницы Бумага",
                 font=("Arial", 24)).grid(row=0)

        tk.Button(frame, text="Играть",
                  font=("Arial", 14),
                  height=2,
                  command=self.start_game).grid(row=1, pady=5)

        tk.Button(frame, text="Сменить тему",
                  command=self.toggle_theme).grid(row=2, pady=5)

        sound_text = "Звук: ВКЛ" if self.sound_on else "Звук: ВЫКЛ"
        tk.Button(frame, text=sound_text,
                  command=self.toggle_sound).grid(row=3, pady=5)

        self.apply_theme(frame)

    
    def start_game(self):
        for w in self.root.winfo_children():
            w.destroy()

        frame = tk.Frame(self.root)
        frame.grid(sticky="nsew")

        self.root.grid_rowconfigure(0, weight=1)
        self.root.grid_columnconfigure(0, weight=1)

        for i in range(5):
            frame.grid_rowconfigure(i, weight=1)
        frame.grid_columnconfigure((0,1,2), weight=1)

        self.result_label = tk.Label(frame, text="", font=("Arial", 16))
        self.result_label.grid(row=0, column=0, columnspan=3)

        # выбор
        for i, choice in enumerate(choices):
            tk.Button(
                frame,
                text=choice,
                font=("Arial", 14),
                height=2,
                command=lambda c=choice: self.play(c)
            ).grid(row=2, column=i, padx=10, sticky="nsew")

        # правила
        tk.Button(frame, text="?",
                  command=self.show_rules).grid(row=0, column=2, sticky="ne")

        # назад
        tk.Button(frame, text="Назад",
                  command=self.main_menu).grid(row=4, column=1)

        self.apply_theme(frame)

    def play(self, player_choice):
        comp_choice = random.choice(choices)
        result = get_winner(player_choice, comp_choice)

        make_sound()

        text = f"Ты: {player_choice} | Комп: {comp_choice}\n"

        if result == "win":
            self.win_streak += 1
            text += "Победа"
        elif result == "lose":
            self.win_streak = 0
            text += "Поражение"
        else:
            text += "Ничья"

        self.result_label.config(text=text)

        if self.win_streak in [5, 10, 15]:
            messagebox.showinfo("Серия",
                                f"{self.win_streak} побед подряд!")

    def show_rules(self):
        make_sound()
        messagebox.showinfo(
            "Правила",
            "Камень бьёт ножницы\nНожницы бьют бумагу\nБумага бьёт камень"
        )


root = tk.Tk()
app = RPSApp(root)
root.mainloop()