Всем привет, я новичок в программировании. Хочу сделать телеграм бота который будет присылать картинку гистологического препарата и вместе с ним 4 варианта того что находится на фото. Короче говоря квиз, угадай что на картинке. Соответственно при правильном выборе ответа, задается следующий вопрос. Не могу разобраться как сделать так, чтоб он выдавал случайную картинку из списка, и так же к ней прикреплял три рандомных неправильных ответа и один правильный. Как я понимаю, нужно использовать датабазу, но как это сделать через встроенный в питон SQL не имею ни малейшего понятия.
afasfks, начни с проектирования БД.
У тебя две основных сущности: вопрос и ответ. Под каждую будет одна таблица.
Для вопроса тебе нужно знать идентификатор (первичный ключ), текст вопроса, изображение (например, имя файла).
Для ответа тебе нужно знать id вопроса (внешний ключ), номер ответа (в рамках вопроса), текст ответа, флаг правильности ответа. Ключом будет комбинация id вопроса и номера ответа.
Тогда ты можешь с помощью запроса SELECT ..... ORDER BY RANDOM() выбрать случайный вопрос, потом вторым запросом выбрать его ответы. Сведения, какой пользователь на какой вопрос отвечает, можно хранить не в БД, а в оперативной памяти.
Разумеется, эта схема не предполагает ничего кроме ответа "верно-неверно" - никакого подсчёта баллов, контроля повтора вопросов и т.п.
Vindicar, я написал код который более менее работает. прикрутил через библиотеки к проекту таблицу эксель которая выступает в роли базы данных. На одном листе файла эксель в качестве id выступает номер ячейки, а еще в двух путь к файлу(картинке), которая вставляется в переменную фотографии для бота и соответственно правильный ответ. Во втором листе список неправильных ответов которые написал от балды чисто ради тестирования. Сделал 4 переменных а,b,c,d. Переменная a всегда равняется правильному ответу, а остальные три берут значение неправильного ответа. Потом с помощью еще одного рандомайзера сделал так чтоб каждая из 4 кнопок брала рандомное значение от a до d и не повторялась. Возможно код получился очень топорным, но он работает. Сейчас пытаюсь каким-то образом прикрутить счетчик правильных ответов и чтоб бот сразу следующий вопрос отправлял. Код прикреплю если будет интересно
@dp.message_handler(Text(equals="тест 1"))
async def quiz_1(message: types.Message):
module_one = xlrd.open_workbook('theme1.xls')
sheet = module_one.sheet_by_index(0)
random_photo_id = randint(0, 2)
random_photo = sheet.row_values(random_photo_id)[0]
true_answer = sheet.row_values(random_photo_id)[1]
photo = random_photo
module_one_answers = xlrd.open_workbook('theme1.xls')
sheet2 = module_one_answers.sheet_by_index(1)
vals = list(range(0, 11))
random.shuffle(vals)
# переменная vals содержит в себе числа от 0 до 11, далее они перемешиваются друг между другом.
a = true_answer
b = sheet2.row_values(vals[1])[0]
c = sheet2.row_values(vals[2])[0]
d = sheet2.row_values(vals[3])[0]
### переменные b c d берут первое, второе и третье значение из перемешанного списка чисел в переменной vals
keyboard_list = [a, b, c, d]
random.shuffle(keyboard_list)
#### далее идет тот же механизм, только список состоит из четырех переменных a b c d, перемешивается и соответственоо каждая из четырех кнопок берет в себя первое,второе и так далее значение из листа
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
button1 = keyboard.add(types.KeyboardButton(text=keyboard_list[0]))
button2 = keyboard.add(types.KeyboardButton(text=keyboard_list[1]))
button3 = keyboard.add(types.KeyboardButton(text=keyboard_list[2]))
button4 = keyboard.add(types.KeyboardButton(text=keyboard_list[3]))
buttonexit = keyboard.add(types.KeyboardButton(text="тест 1"))
await message.answer("какой препарат изображен на фотографии?", reply_markup=keyboard)
await bot.send_photo(message.chat.id, types.InputFile(photo))
afasfks, в переменной vals числа от 0 до 11 потому что это номера ячеек, в которых хранятся неправильные варианты ответа. Далее в переменных a b c d рандомное значение подставляется в функцию, которая забирает ответ из ячейки файла эксель