Числовая угадайка в окне
Программа загадывает число от 1 до 100, игрок вводит свои догадки в поле. После каждой попытки надпись сообщает, больше загаданное или меньше, а вторая надпись считает попытки.
Из чего собирается: окно, надписи, поле и кнопки (занятие 12), проверка ввода и messagebox (занятие 13), функция is_valid() из консольной версии — без единой правки.
Техническое задание.
- Соберите окно: надпись-подсказка, поле ввода, кнопка «Проверить», надпись со счётом попыток и кнопка «Играть заново».
- Заведите переменные
secretиtriesвне функций. - Перенесите из консольной версии функцию
is_valid(text)— она проверяет, что введено целое число от 1 до 100. - Напишите
new_game(): загадать число, обнулить счёт, вернуть надписи в исходный вид, включить поле и кнопку, очистить поле. - Напишите обработчик кнопки: негодный ввод — сказать об этом и выйти, не тратя попытку; иначе увеличить счёт и сравнить с загаданным.
- При угадывании выключите поле и кнопку «Проверить» и покажите окошко с загаданным числом и числом попыток.
- Повесьте на поле клавишу Enter — играть мышью и клавиатурой одинаково удобно.
- Позовите
new_game()один раз доmainloop(), чтобы игра началась сразу.

Что можно улучшить: показывать, сколько попыток осталось до «рекорда» прошлой партии; спрашивать верхнюю границу диапазона в отдельном поле.
Подсказка 1
Начните с new_game(): если она умеет привести окно в начальное состояние, кнопка «Играть заново» получится сама собой — она просто зовёт эту же функцию.
Подсказка 2
«Не засчитывать попытку» в окне — это return до строки tries = tries + 1. Ровно то же место, где в консоли стоял continue.
Разбор
- Собираем окно и объявляем переменные состояния наверху.
- Переносим
is_valid()— она не про консоль и работает как была. - Пишем
new_game(): загадать, обнулить, очистить, включить. - В обработчике сначала проверка ввода и ранний выход, потом счёт попытки.
- Сравниваем: меньше, больше или угадал; на угадывании выключаем поле с кнопкой и показываем окошко.
- Вешаем Enter на поле и зовём
new_game()доmainloop().
Решение
import random
import tkinter
from tkinter import messagebox
secret = 0 # загаданное число
tries = 0 # сколько попыток сделано
def is_valid(text):
"""Годится ли введённое: целое число от 1 до 100."""
if not text.isdigit():
return False
return 1 <= int(text) <= 100
def new_game():
"""Начать заново: и переменные, и вид окна."""
global secret, tries
secret = random.randint(1, 100)
tries = 0
hint.config(text='Я загадал число от 1 до 100')
score.config(text='Попыток: 0')
field.config(state='normal')
field.delete(0, 'end')
check.config(state='normal')
def guess():
"""Разобрать очередную попытку игрока."""
global tries
answer = field.get().strip()
if not is_valid(answer):
hint.config(text='Введите целое число от 1 до 100')
return # попытку не засчитываем
number = int(answer)
tries = tries + 1
score.config(text=f'Попыток: {tries}')
if number < secret:
hint.config(text='Ваше число меньше загаданного')
elif number > secret:
hint.config(text='Ваше число больше загаданного')
else:
hint.config(text='Вы угадали!')
check.config(state='disabled')
field.config(state='disabled')
messagebox.showinfo('Победа',
f'Загаданное число: {secret}. Попыток: {tries}')
def on_enter(event):
guess()
window = tkinter.Tk()
window.title('Числовая угадайка')
hint = tkinter.Label(window, text='Я загадал число от 1 до 100', width=32)
hint.grid(row=0, column=0, columnspan=2, padx=12, pady=12)
field = tkinter.Entry(window, width=10)
field.grid(row=1, column=0, padx=10, pady=6)
field.bind('<Return>', on_enter)
check = tkinter.Button(window, text='Проверить', command=guess)
check.grid(row=1, column=1, padx=10, pady=6)
score = tkinter.Label(window, text='Попыток: 0')
score.grid(row=2, column=0, columnspan=2)
again = tkinter.Button(window, text='Играть заново', command=new_game)
again.grid(row=3, column=0, columnspan=2, pady=10)
new_game()
window.mainloop()Хвост «попробуйте ещё разок» из консольной версии здесь не нужен: поле и кнопка на месте, и человеку очевидно, что можно пробовать снова. Зато понадобилось то, чего в консоли не было, — выключение поля после победы: без цикла программа не заканчивается сама, и без запрета игрок продолжал бы «угадывать» уже угаданное число.



