Твой бот умеет болтать и показывать меню. Пора научить его играть. Начнём с классики: «угадай число от 1 до 100». Бот загадывает, ты угадываешь, бот подсказывает «больше» или «меньше».
После урока сможешь: объяснить тему «Случайное число и первая логика» и выполнить связанный с ней учебный шаг без подсказки.
Сегодня сделаем сердце игры и поймаем хитрый баг, из-за которого выиграть невозможно. С него начнётся следующий урок.
Бот бросает кубик
Чтобы загадать случайное число, в Python есть готовый модуль random. Подключаем его сверху: import random. Одна строчка загадывает число от 1 до 100:
zagadannoe = random.randint(1, 100)
random.randint(1, 100) это как бросок кубика, только граней не шесть, а сто. Каждый раз выпадает новое число от 1 до 100 включительно.
Сравниваем догадку
Игра держится на трёх случаях: догадка меньше загаданного, больше или ровно равна. Это просится в if / elif / else:
dogadka = int(message.text)
if dogadka < zagadannoe:
bot.send_message(message.chat.id, "Моё число больше.")
elif dogadka > zagadannoe:
bot.send_message(message.chat.id, "Моё число меньше.")
else:
bot.send_message(message.chat.id, "Угадал!")
Сообщение от игрока приходит как текст, а сравнивать надо числа. Поэтому
int(message.text)превращает текст «50» в число 50. Без этого Python будет сравнивать буквы с цифрами и запутается.
Собираем наивного бота
import telebot
import random
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(func=lambda message: message.text.isdigit())
def guess(message):
zagadannoe = random.randint(1, 100)
dogadka = int(message.text)
if dogadka < zagadannoe:
bot.send_message(message.chat.id, "Моё число больше.")
elif dogadka > zagadannoe:
bot.send_message(message.chat.id, "Моё число меньше.")
else:
bot.send_message(message.chat.id, "Угадал!")
bot.infinity_polling()
Фильтр message.text.isdigit() значит «срабатывай, только если в сообщении число». На «привет» этот обработчик не полезет.
Лови баг
Запусти и поиграй. Сначала кажется, что работает. Но попробуй честно угадать по подсказкам, не получается. Бот будто врёт. И правда «врёт», только не нарочно. Строчка zagadannoe = random.randint(1, 100) стоит внутри обработчика, а значит срабатывает на каждое сообщение. Бот загадывает число заново перед каждой догадкой, поэтому подсказки относятся к разным числам.
Чтобы игра заработала, бот должен загадать число один раз и держать его в голове, пока ты угадываешь. Это память на время игры, ей посвящён следующий урок.
Контрольный вопрос. Какой функцией модуля random загадывают целое число от 1 до 100? Напиши имя функции: random.____(1, 100).
Подсказка: Как бросок кубика на сто граней.
Онлайн-проверка ответа появится позже
Задание. Подключи random и собери наивного бота из урока. Поиграй и убедись, что выиграть нельзя. Ответь одним предложением: из-за какой строчки бот загадывает число заново каждый раз?
Подсказка: Смотри, что стоит ВНУТРИ обработчика guess и срабатывает на каждое сообщение.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Зачёт, если:
✅ наивный бот из урока собран, ты поиграл и убедился, что выиграть нельзя;
✅ назвал строчку, из-за которой число загадывается заново каждый раз (random.randint внутри обработчика).
