@afasfks

Квиз бот телеграм aiogram. Как реализовать проверку ответа на правильность?

Всем добрый день. Сделал квиз бота в телеграме, он из таблицы эксель выбирает номер вопроса рандомно, присылает в сообщения вопрос и создает 4 кнопки с ответами на него. После нажатия на одну из кнопок бот проверяет, правильный ответ или нет и отправляет на следующий вопрос. Проблема в том что для того чтоб сделать эту самую проверку, мне пришлось разделить весь механизм работы на две переменные. В одной переменной у меня выбирается вопрос, создаются кнопки и отправляется вопрос, а во второй идет проверка на правильность. Чтоб это сделать мне пришлось придать одной переменной значение global. В этом случае при использовании бота двумя и более людьми одновременно все вопросы и ответы перемешиваются. Что делать, выручайте!
код:
class quest_1:
    @dp.message_handler(Text(equals="Начать тест 1"))
    async def quiz_1(message: types.Message):
        module_one = xlrd.open_workbook('biochemistry_1.xls')
        sheet = module_one.sheet_by_index(0)
        global vals
        vals = random.randint(1, 972)

        question = sheet.row_values(vals)[0]
        true_answer = sheet.row_values(vals)[5]


        a = sheet.row_values(vals)[1]
        b = sheet.row_values(vals)[2]
        c = sheet.row_values(vals)[3]
        d = sheet.row_values(vals)[4]



        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = keyboard.add(types.KeyboardButton(text=a))
        button2 = keyboard.add(types.KeyboardButton(text=b))
        button3 = keyboard.add(types.KeyboardButton(text=c))
        button4 = keyboard.add(types.KeyboardButton(text=d))
        buttonexit = keyboard.add(types.KeyboardButton(text="Закончить"))


        await message.answer(question, reply_markup=keyboard)

    @dp.message_handler(Text(equals="Закончить"))
    async def return_back(message: types.Message):
        await message.answer("Вы закончили тест!")
        await cmd_start(message)

    @dp.message_handler()
    async def quiz_1_check(message: types.Message, vals):

        module_one = xlrd.open_workbook('biochemistry_1.xls')
        sheet = module_one.sheet_by_index(0)
        true_answer = sheet.row_values(vals)[5]

        if message.text == true_answer:
            await message.reply("верно!")
            await quest_1.quiz_1(message)

        elif message.text != true_answer:
            await message.answer("Неверно! Правильный ответ:")
            await message.reply(true_answer)
            await quest_1.quiz_1(message)
  • Вопрос задан
  • 714 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Для реализации квиза советую изучить еще механизм FSM, в интернете полно примеров.
Но даже без него в callback_data кнопок можно засунуть строки:
в первой кнопке - "answer|q1|a1|0"
во второй - "answer|q1|a2|1"
в третьей - "answer|q1|a3|0"
в четвертой - "answer|q1|a4|0"

Вот таким образом в каждой кнопке указано:
answer - указатель, что это кнопка ответа
q1 - номер вопроса
a1-a4 - номер ответа
1/0 - флаг правильного/неправильного ответа.

Для себя можете выбрать любую структуру этих данных. Эти данные пользователь не увидит, это увидите и обработаете только вы.

обработчик нажатия на кнопку можно будет сделать следующим образом:
@dp.callback_query_handler(lambda call: call.data.startswith("answer")

Таким образом в этот обработчик попадут только нажатия на кнопки вопросов.
Дальше разбираем данные в callback_data с помощью call.data.split("|")

Дальше уже в ход идет ваша фантазия
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы