Собираем Бот-Угадайку

Игра уже честная: бот загадывает, помнит число, считает попытки. Осталось довести до ума и сделать своей. Соберём финальную Бот-Угадайку, добавим защиту от глупых ошибок и рестарт. Это артефакт модуля, третий бот в твоей коллекции.

После урока сможешь: объяснить тему «Собираем Бот-Угадайку» и выполнить связанный с ней учебный шаг без подсказки.

Иллюстрация: игра угадай число — робот прячет карточку, стрелки больше и меньше

Защита от «не числа»

Одна проблема всё ещё есть. Обработчик догадок ловит только числа. Но что, если игрок напишет «не знаю»? Такое сообщение в обработчик чисел не попадёт, и бот промолчит. Игрок подумает, что бот завис. Добавим вежливый ответ на всё остальное, строго последним, ниже игровых обработчиков:

@bot.message_handler(func=lambda message: True)
def other(message):
    bot.send_message(message.chat.id, "Я понимаю только числа. Напиши число от 1 до 100, или /start для новой игры.")

Помнишь правило про порядок? Этот общий обработчик ловит всё подряд, поэтому он строго последний. Игровые обработчики стоят выше и забирают команды и числа себе.

Полный код Бот-Угадайки

import telebot
import random
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

zagadannoe = {}
popytki = {}

@bot.message_handler(commands=['start'])
def new_game(message):
    chat_id = message.chat.id
    zagadannoe[chat_id] = random.randint(1, 100)
    popytki[chat_id] = 0
    bot.send_message(chat_id, "Я загадал число от 1 до 100. Угадывай!")

@bot.message_handler(func=lambda message: message.text.isdigit())
def guess(message):
    chat_id = message.chat.id
    if chat_id not in zagadannoe:
        bot.send_message(chat_id, "Сначала нажми /start, я загадаю число.")
        return
    dogadka = int(message.text)
    popytki[chat_id] += 1
    if dogadka < zagadannoe[chat_id]:
        bot.send_message(chat_id, "Моё число больше.")
    elif dogadka > zagadannoe[chat_id]:
        bot.send_message(chat_id, "Моё число меньше.")
    else:
        bot.send_message(chat_id, f"Угадал! Попыток: {popytki[chat_id]}. Ещё разок? /start")

@bot.message_handler(func=lambda message: True)
def other(message):
    bot.send_message(message.chat.id, "Я понимаю только числа. Напиши число от 1 до 100, или /start для новой игры.")

bot.infinity_polling()

Запусти, нажми /start и сыграй. Теперь честно и без зависаний. Кстати, заметил хитрость? Если каждый раз называть середину оставшегося промежутка, любое число до 100 угадывается за семь попыток. Это не магия, а способ думать, который пригодится далеко за пределами игры.

Сделай игру своей

  • поменяй диапазон: 1-50 для малышей, 1-1000 для хардкора;
  • впиши свои фразы: пусть бот подкалывает или хвалит;
  • добавь кнопку «Играть заново» из Модуля 2 вместо команды /start;
  • считай не только попытки, но и лучший результат за сессию.

Контрольный вопрос. Чтобы обработчик ловил ЛЮБОЕ сообщение (даже не число), ставят фильтр func=lambda message: ____. Напиши значение (как в Python).

Подсказка: Срабатывает всегда.

Онлайн-проверка ответа появится позже

Задание. Собери свою Бот-Угадайку: бот загадывает, ты угадываешь с подсказками больше/меньше, бот считает попытки, не падает на тексте и умеет начать заново. Добавь свой штрих (диапазон, фразы или кнопку). Пришли короткое видео одной партии от старта до победы.

Подсказка: Возьми полный код из урока и поменяй диапазон или фразы под себя. Защита от текста — обработчик other последним.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ бот запускается без красных ошибок;
✅ бот загадал случайное число, подсказывает «больше/меньше», помнит загаданное между сообщениями и узнаёт победу;
✅ оформление своё, не копия примера;
✅ прислано видео одной партии от старта до победы.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева