Загрузка данных
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()