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

Шаг к следующему вопросу
После проверки ответа бот должен перейти к следующему вопросу. Номер вопроса хранится в 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» с предложением пройти заново;
✅ вопросы на свою тему;
✅ прислано видео прохождения от первого вопроса до итога.
