Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

В чем ошибка, бот каждый раз на любой ответ повторяет второй из списка вопрос и не переходит дальше

Андрей Климов Профи (584), открыт 1 неделю назад
 import telebot 

# Создаем экземпляр бота
bot = telebot.TeleBot('токен')

# Создаем список вопросов и ответов
questions = [
{
'question': 'Кто написал роман "Война и мир"?',
'answers': ['Лев Толстой', 'Федор Достоевский', 'Антон Чехов', 'Александр Пушкин'],
'correct_answer': 'Лев Толстой'
},
{
'question': 'Какой из этих языков является самым распространенным в мире?',
'answers': ['Английский', 'Испанский', 'Китайский', 'Хинди'],
'correct_answer': 'Английский'
},
{
'question': 'Какое животное называют "кораблем пустыни"?',
'answers': ['Верблюд', 'Слон', 'Лошадь', 'Осел'],
'correct_answer': 'Верблюд'
},
]

# Счетчик правильных ответов
correct_answers = 0
# Текущий индекс вопроса
question_index = 0
# Список отвеченных вопросов
answered_questions = set()

# Обработчик сообщений
@bot.message_handler(content_types=['text'])
def handle_message(message):
global correct_answers, question_index, answered_questions

if message.text == '/start':
send_question(message, 0)
else:
try:
if question_index not in answered_questions:
# Получаем индекс вопроса и ответ пользователя
question_index = int(message.text.split()[0]) - 1
user_answer = ' '.join(message.text.split()[1:])

# Проверяем правильность ответа
if user_answer == questions[question_index]['correct_answer']:
correct_answers += 1

# Добавляем вопрос в список отвеченных вопросов
answered_questions.add(question_index)

# Отправляем следующий вопрос или подводим итоги
if question_index < len(questions) - 1:
send_question(message, question_index + 1)
else:
# Рассчитываем процент правильных ответов
percentage = correct_answers / len(questions) * 100
bot.send_message(message.chat.id, f"Вы ответили правильно на {percentage:.2f}% вопросов.")
except (ValueError, IndexError):
# Обрабатываем ошибку преобразования строки в число или выход за пределы списка вопросов
bot.send_message(message.chat.id, "Неверный формат ответа или номер вопроса вне диапазона. Пожалуйста, ответьте в формате: номер_вопроса ответ")

# Функция отправки вопроса
def send_question(message, question_index):
# Получаем текущий вопрос
question = questions[question_index]

# Формируем сообщение с вариантами ответов
answer_options = '\n'.join([f'{i + 1}. {answer}' for i, answer in enumerate(question['answers'])])
message_text = f"{question_index + 1}. {question['question']}\n{answer_options}"

# Отправляем сообщение
bot.send_message(message.chat.id, message_text)

# Запускаем бота
bot.polling()
1 ответ
Chudo_Chudnoe Мастер (1585) 1 неделю назад
Если коротко, то была у тебя логическая ошибка. Попробуй запуститься в этой версией:


 import telebot  

# Создаем экземпляр бота
bot = telebot.TeleBot('токен')

# Создаем список вопросов и ответов
questions = [
{
'question': 'Кто написал роман "Война и мир"?',
'answers': ['Лев Толстой', 'Федор Достоевский', 'Антон Чехов', 'Александр Пушкин'],
'correct_answer': 'Лев Толстой'
},
{
'question': 'Какой из этих языков является самым распространенным в мире?',
'answers': ['Английский', 'Испанский', 'Китайский', 'Хинди'],
'correct_answer': 'Английский'
},
{
'question': 'Какое животное называют "кораблем пустыни"?',
'answers': ['Верблюд', 'Слон', 'Лошадь', 'Осел'],
'correct_answer': 'Верблюд'
},
]

correct_answers = 0
question_index = 0
answered_questions = set()

@bot.message_handler(content_types=['text'])
def handle_message(message):
global correct_answers, question_index, answered_questions

if message.text == '/start':
question_index = 0
answered_questions = set()
send_question(message, question_index)
else:
try:
user_answer = message.text
if question_index not in answered_questions:
if user_answer == questions[question_index]['correct_answer']:
correct_answers += 1
answered_questions.add(question_index)

if question_index < len(questions) - 1:
question_index += 1
send_question(message, question_index)
else:
percentage = correct_answers / len(questions) * 100
bot.send_message(message.chat.id, f"Вы ответили правильно на {percentage:.2f}% вопросов.")
question_index = 0
except IndexError:
bot.send_message(message.chat.id, "Произошла ошибка при выборе вопроса.")

def send_question(message, index):
question = questions[index]
answer_options = '\n'.join([f'{i + 1}. {answer}' for i, answer in enumerate(question['answers'])])
message_text = f"{index + 1}. {question['question']}\n{answer_options}"
bot.send_message(message.chat.id, message_text)

bot.polling()
Андрей КлимовПрофи (584) 1 неделю назад
спасибо. А из-за чего не подсчитывает количество правильно отвеченных вопросов в %? выдает 0
Андрей КлимовПрофи (584) 1 неделю назад
if user_answer == questions[question_index]['correct_answer']:
correct_answers += 1
Chudo_Chudnoe Мастер (1585) Андрей Климов, тут места не хватает. я загрузив в телеграф https://telegra.ph
Chudo_ChudnoeМастер (1585) 1 неделю назад
Да, correct_answers некорректно сбрасывается, сейчас поправим)
Андрей КлимовПрофи (584) 1 неделю назад
далее сравнение
Chudo_Chudnoe Мастер (1585) Андрей Климов, Аааа, цифрами вводит) Тогда нужно преобразовывать эти цифры в соответствующий текст ответа, прежде чем сравнивать с правильным ответом) Заходи по той же ссылке телеграфа, я обновил там код, попробуй его
Андрей КлимовПрофи (584) 1 неделю назад
if user_answer == questions[question_index]['correct_answer']
т.е. пользователь выбрал вариант ответа под номеров 2. Получается if 2 == questions[question_index]['correct_answer']

а questions[question_index]['correct_answer'] выводит сам текст, содержимое правильного ответа, 'correct_answer': 'Английский'
т.е. Английский
Андрей КлимовПрофи (584) 1 неделю назад
и получается if 2 == Английский
Chudo_ChudnoeМастер (1585) 1 неделю назад
Да, помогать нужно) От души Андрюх)) Если что нужно будет ещё, то можешь написать в телеграм, я там быстрее отвечу. Ссылку на свой профайл оставлю в том же файле телеграфа =)
Похожие вопросы