Собираем Бот-Квиз

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

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

Иллюстрация: бот-викторина — робот-ведущий, пустые карточки-варианты и звезда-счёт

Шаг к следующему вопросу

После проверки ответа бот должен перейти к следующему вопросу. Номер вопроса хранится в nomer[chat_id], значит прибавим к нему единицу: nomer[chat_id] += 1. Дальше развилка: если вопросы ещё есть, шлём следующий, если кончились, показываем итог. Сколько всего вопросов, подскажет len(voprosy), это длина списка.

nomer[chat_id] += 1
if nomer[chat_id] < len(voprosy):
    poslat_vopros(chat_id)
else:
    bot.send_message(chat_id, f"Квиз окончен! Счёт: {ochki[chat_id]} из {len(voprosy)}. Ещё раз? /start")

nomer[chat_id] < len(voprosy) значит «номер ещё не дошёл до конца списка». Пока это так, шлём следующий вопрос знакомой функцией. Когда дошли до конца, поздравляем и показываем счёт «N из M». А /start начинает заново.

Полный код Бот-Квиза

import telebot
from telebot import types
from config import TOKEN

bot = telebot.TeleBot(TOKEN)

voprosy = [
    {"text": "Какой тег задаёт заголовок в HTML?", "varianty": ["<h1>", "<p>", "<a>"], "otvet": "<h1>"},
    {"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"},
    {"text": "На каком языке мы пишем ботов?", "varianty": ["Python", "Java", "C++"], "otvet": "Python"},
]

nomer = {}
ochki = {}

def poslat_vopros(chat_id):
    n = nomer[chat_id]
    vopros = voprosy[n]
    keyboard = types.InlineKeyboardMarkup()
    for variant in vopros["varianty"]:
        keyboard.add(types.InlineKeyboardButton(variant, callback_data=variant))
    bot.send_message(chat_id, f"Вопрос {n + 1}: {vopros['text']}", reply_markup=keyboard)

@bot.message_handler(commands=['start'])
def start(message):
    chat_id = message.chat.id
    nomer[chat_id] = 0
    ochki[chat_id] = 0
    poslat_vopros(chat_id)

@bot.callback_query_handler(func=lambda call: True)
def otvet(call):
    chat_id = call.message.chat.id
    bot.answer_callback_query(call.id)
    n = nomer[chat_id]
    if call.data == voprosy[n]["otvet"]:
        ochki[chat_id] += 1
        bot.send_message(chat_id, "Верно!")
    else:
        bot.send_message(chat_id, f"Неверно. Правильно: {voprosy[n]['otvet']}")
    nomer[chat_id] += 1
    if nomer[chat_id] < len(voprosy):
        poslat_vopros(chat_id)
    else:
        bot.send_message(chat_id, f"Квиз окончен! Счёт: {ochki[chat_id]} из {len(voprosy)}. Ещё раз? /start")

bot.infinity_polling()

Запусти, нажми /start и пройди квиз до конца. Бот ведёт тебя по вопросам и в финале честно подводит итог. Работает.

Сделай квиз своим

  • квиз по любимой игре, аниме или фильму;
  • проверка знаний по школьному предмету, чтобы готовиться было веселее;
  • квиз про твой класс или друзей, такое заходит на ура;
  • добавь больше вопросов, просто дописывая словари в список.

Контрольный вопрос. Чтобы перейти к следующему вопросу, номер увеличивают на единицу: nomer[chat_id] ____ 1. Напиши оператор.

Подсказка: Прибавить 1 к текущему значению.

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

Задание. Собери свой Бот-Квиз: минимум 5 вопросов на свою тему с вариантами-кнопками, подсчёт очков, итог «N из M» и рестарт. Пришли короткое видео прохождения от первого вопроса до итога.

Подсказка: Возьми полный код из урока и замени список voprosy на свои вопросы. Переход — nomer += 1 и сравнение с len(voprosy).

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

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

Зачёт, если:
✅ бот запускается без красных ошибок;
✅ минимум 5 вопросов, бот проверяет ответ, ведёт счёт и в конце показывает «N из M» с предложением пройти заново;
✅ вопросы на свою тему;
✅ прислано видео прохождения от первого вопроса до итога.

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

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