import tkinter as tk
import random
class HangmanGame:
def __init__(self, master):
self.master = master
self.master.title("Виселица")
self.master.geometry("400x400")
self.master.resizable(False, False)
self.words = {
"python": ["p", "y", "t", "h", "o", "n"],
"hello": ["h", "e", "l", "l", "o"],
"test": ["t", "e", "s", "t"],
"developer": ["d", "e", "v", "e", "l", "o", "p", "e", "r"]
}
self.chasti = 0
self.random_word = random.choice(list(self.words.keys()))
self.word_letters = self.words[self.random_word]
self.guessed_letters = []
# Размещаем элементы интерфейса с помощью grid для компактного и аккуратного размещения
self.label = tk.Label(master, text="Угадайте букву:")
self.label.grid(row=0, column=0, columnspan=2, pady=10)
self.entry = tk.Entry(master)
self.entry.grid(row=1, column=0)
self.submit_btn = tk.Button(
master, text="Отправить", command=self.check_letter)
self.submit_btn.grid(row=1, column=1)
self.label_word = tk.Label(master, text="_ " * len(self.random_word))
self.label_word.grid(row=2, column=0, columnspan=2, pady=10)
self.canvas = tk.Canvas(master, bg="white", width=300, height=300)
self.canvas.grid(row=3, column=0, columnspan=2, pady=20)
# Функции отрисовки частей тела
self.draw_funcs = [
lambda: self.canvas.create_oval(120, 20, 180, 80),
lambda: self.canvas.create_line(150, 80, 150, 160),
lambda: self.canvas.create_line(150, 160, 130, 200),
lambda: self.canvas.create_line(150, 160, 170, 200),
lambda: self.canvas.create_line(150, 100, 120, 130),
lambda: self.canvas.create_line(150, 100, 180, 130)
]
self.update_label("Игра начинается... Я загадал слово.")
self.master.after(2000, self.update_label, "Начнем игру!")
def update_label(self, text):
self.label.config(text=text)
def game_over(self):
self.update_label("Ой! Вы проиграли.")
# Блокируем ввод после проигрыша
self.submit_btn.config(state=tk.DISABLED)
def check_letter(self):
user_input = self.entry.get().strip().lower()
self.entry.delete(0, tk.END)
if len(user_input) != 1 or not user_input.isalpha():
self.update_label("Введите одну букву.")
return
if user_input in self.guessed_letters:
self.update_label(f"Буква '{user_input}' уже была.")
return
self.guessed_letters.append(user_input)
if user_input in self.word_letters:
self.update_label(f"Буква '{user_input}' угадана!")
self.update_word_display(user_input)
else:
self.chasti += 1
if self.chasti <= len(self.draw_funcs):
self.draw_funcs[self.chasti - 1]() # Отрисовываем часть тела
if self.chasti == 6:
self.game_over()
def update_word_display(self, letter):
display_word = [
letter if letter in self.guessed_letters else "_" for letter in self.random_word
]
self.label_word.config(text=" ".join(display_word))
if "_" not in display_word:
self.update_label("Поздравляем! Вы угадали слово.")
# Блокируем ввод после победы
self.submit_btn.config(state=tk.DISABLED)
if __name__ == "__main__":
root = tk.Tk()
game = HangmanGame(root)
root.mainloop()