Гид по технологиям

Интерактивная викторина на Python — пошаговое руководство

• 5 min read • Python • Обновлено 24 Nov 2025
Интерактивная викторина на Python
Интерактивная викторина на Python

Лист с вопросами викторины на столе

Для кого это руководство

Это руководство подходит начинающим программистам и тем, кто изучает Python через небольшие проекты. Программа ориентирована на создание небольшого CLI-приложения, которое помогает практиковать:

  • ввод и вывод в консоли
  • работу с классами и коллекциями
  • сравнение строк и обработку вариантов ответов
  • организацию кода для масштабирования

Важно: знания Python на базовом уровне помогут усвоить материал быстрее, но в статье объяснены все ключевые концепции.

Ключевые понятия в одном предложении

  • CLI — командный интерфейс программы, которую вы запускаете в терминале.
  • Объект Question — структура данных, хранящая текст вопроса, правильный ответ, подсказку и варианты для multiple choice.

Как создать файл скрипта и добавить первый вопрос

Шаги, необходимые для начала разработки:

  1. Создайте текстовый файл с именем InteractiveQuiz.py в удобной папке.

  2. Откройте файл в любом текстовом редакторе и добавьте приветствие для пользователя.

print('Hello, welcome to the geography quiz. Answer the questions as they are presented.')
  1. Задайте первый вопрос и прочитайте ответ пользователя через input. Результат сохраните в переменную user_input.
print('Question 1. What city is the capital of Australia?')
user_input = input()
  1. Проверьте ответ и выведите результат пользователю.
if user_input.strip().lower() == 'canberra':
    print('That is correct!')
else:
    print('Sorry, the correct answer is Canberra.')
  1. Запустите викторину в терминале, перейдя в папку с файлом, например:
cd Desktop
python InteractiveQuiz.py

Первый вопрос викторины в терминале

Примечание: использование strip() и lower() помогает корректно сравнивать ответы, игнорируя лишние пробелы и регистр.

Как добавлять много вопросов без дублирования кода

Повторять один и тот же код для каждого вопроса неудобно. Лучше описать структуру вопроса в виде класса и хранить вопросы в списке.

class Question:
    def __init__(self, questionText, answer):
        self.questionText = questionText
        self.answer = answer

    def __repr__(self):
        return '{' + self.questionText + ', ' + self.answer + '}'

quizQuestions = [
    Question('Question 1. What city is the capital of Australia', 'Canberra'),
    Question('Question 2. What city is the capital of Japan', 'Tokyo'),
    Question('Question 3. How many islands does the Philippines have', '7100')
]

for question in quizQuestions:
    print(f'{question.questionText}?')
    user_input = input()

    if user_input.strip().lower() == question.answer.strip().lower():
        print('That is correct!')
    else:
        print(f'Sorry, the correct answer is {question.answer}.')

Преимущество: добавление нового вопроса означает лишь добавление нового элемента в quizQuestions.

Как добавить вопросы с вариантами ответа (multiple choice)

Расширим класс Question, чтобы он мог хранить список вариантов. Если варианты есть, программа покажет их перед вводом.

class Question:
    def __init__(self, questionText, answer, multipleChoiceOptions=None):
        self.questionText = questionText
        self.answer = answer
        self.multipleChoiceOptions = multipleChoiceOptions

    def __repr__(self):
        return '{' + self.questionText + ', ' + self.answer + ', ' + str(self.multipleChoiceOptions) + '}'

quizQuestions = [
    Question('Question 1. What city is the capital of Australia', 'Canberra'),
    Question('Question 2. What city is the capital of Japan', 'Tokyo'),
    Question('Question 3. How many islands does the Philippines have', '7100'),
    Question('Question 4. Which country takes the most land mass', 'b', ['(a) United States', '(b) Russia', '(c) Australia', '(d) Antarctica']),
]

for question in quizQuestions:
    print(f'{question.questionText}?')
    if question.multipleChoiceOptions is not None:
        for option in question.multipleChoiceOptions:
            print(option)
    user_input = input()

    if user_input.strip().lower() == question.answer.strip().lower():
        print('That is correct!')
    else:
        print(f'Sorry, the correct answer is {question.answer}.')

Совет: для multiple choice можно согласовать формат правильного ответа: одна буква в нижнем регистре, например ‘b’.

Как поддерживать альтернативные правильные ответы

Иногда допустимы разные формы одного и того же ответа. Добавим список alternate_answers в класс.

class Question:
    def __init__(self, questionText, answer, multipleChoiceOptions=None, alternateAnswers=None):
        self.questionText = questionText
        self.answer = answer
        self.multipleChoiceOptions = multipleChoiceOptions
        self.alternateAnswers = alternateAnswers

    def __repr__(self):
        return '{' + self.questionText + ', ' + self.answer + ', ' + str(self.multipleChoiceOptions) + ', ' + str(self.alternateAnswers) + '}'

quizQuestions = [
    # ...
    Question('Question 5. What hemisphere is Japan located in', 'Northern Hemisphere', None, ['north', 'northern']),
]

for question in quizQuestions:
    print(f'{question.questionText}?')
    if question.multipleChoiceOptions is not None:
        for option in question.multipleChoiceOptions:
            print(option)
    user_input = input()

    normalized = user_input.strip().lower()
    if normalized == question.answer.strip().lower():
        print('That is correct!')
    elif question.alternateAnswers is not None and normalized in question.alternateAnswers:
        print('That is correct!')
    else:
        print(f'Sorry, the correct answer is {question.answer}.')

Важно: храните alternateAnswers в одном регистре, например в нижнем, и сравнивайте с normalized значением.

Как добавить подсказки и запретить переход к следующему вопросу до правильного ответа

Если вы хотите, чтобы пользователь не переходил дальше, пока не даст правильный ответ, используйте цикл while и счётчик ошибок. После трёх неправильных попыток выводите подсказку.

class Question:
    def __init__(self, questionText, answer, hint=None, multipleChoiceOptions=None, alternateAnswers=None):
        self.questionText = questionText
        self.answer = answer
        self.hint = hint
        self.multipleChoiceOptions = multipleChoiceOptions
        self.alternateAnswers = alternateAnswers

    def __repr__(self):
        return '{' + self.questionText + ', ' + self.answer + ', ' + str(self.hint) + ', ' + str(self.multipleChoiceOptions) + ', ' + str(self.alternateAnswers) + '}'

quizQuestions = [
    Question('Question 1. What city is the capital of Australia', 'Canberra', 'Starts with a C'),
    Question('Question 2. What city is the capital of Japan', 'Tokyo', 'Starts with a T'),
    Question('Question 3. How many islands does the Philippines have', '7100', 'A number between 7000 and 8000'),
    Question('Question 4. Which country takes the most land mass', 'b', 'The country spans two continents', ['(a) United States', '(b) Russia', '(c) Australia', '(d) Antarctica']),
    Question('Question 5. What hemisphere is Japan located in', 'Northern Hemisphere', 'The top half of Earth', None, ['north', 'northern']),
]

for question in quizQuestions:
    if question.multipleChoiceOptions is not None:
        print(f'{question.questionText}?')
        for option in question.multipleChoiceOptions:
            print(option)
    else:
        print(f'{question.questionText}?')

    user_input = input()
    count = 0
    while user_input.strip().lower() != question.answer.strip().lower():
        if question.alternateAnswers is not None and user_input.strip().lower() in question.alternateAnswers:
            break
        count += 1
        if count >= 3 and question.hint is not None:
            print(f'Hint: {question.hint}.')
            user_input = input()
        else:
            print('That is not correct, try again.')
            user_input = input()

    print('That is correct!')

Совет: если вы хотите ограничить общее количество попыток, добавьте глобальный лимит и логику для выхода или подсчёта очков.

Несколько вопросов викторины в командной строке

Полный пример рабочего скрипта

Ниже приведён объединённый пример с поддержкой вариантов, альтернатив и подсказок. Скопируйте и сохраните как InteractiveQuiz.py, затем запустите в терминале.

class Question:
    def __init__(self, questionText, answer, hint=None, multipleChoiceOptions=None, alternateAnswers=None):
        self.questionText = questionText
        self.answer = answer
        self.hint = hint
        self.multipleChoiceOptions = multipleChoiceOptions
        # Сохраняем alternative answers в нижнем регистре для простоты сравнения
        if alternateAnswers:
            self.alternateAnswers = [a.strip().lower() for a in alternateAnswers]
        else:
            self.alternateAnswers = None

    def __repr__(self):
        return '{' + self.questionText + ', ' + self.answer + ', ' + str(self.hint) + ', ' + str(self.multipleChoiceOptions) + ', ' + str(self.alternateAnswers) + '}'

quizQuestions = [
    Question('Question 1. What city is the capital of Australia', 'Canberra', 'Starts with a C'),
    Question('Question 2. What city is the capital of Japan', 'Tokyo', 'Starts with a T'),
    Question('Question 3. How many islands does the Philippines have', '7100', 'A number between 7000 and 8000'),
    Question('Question 4. Which country takes the most land mass', 'b', 'The country spans two continents', ['(a) United States', '(b) Russia', '(c) Australia', '(d) Antarctica']),
    Question('Question 5. What hemisphere is Japan located in', 'Northern Hemisphere', 'The top half of Earth', None, ['north', 'northern']),
]

print('Welcome to the geography quiz!')

for question in quizQuestions:
    print('\n' + question.questionText + '?')
    if question.multipleChoiceOptions is not None:
        for option in question.multipleChoiceOptions:
            print(option)

    user_input = input()
    attempts = 0
    normalized = user_input.strip().lower()

    while normalized != question.answer.strip().lower():
        if question.alternateAnswers is not None and normalized in question.alternateAnswers:
            break
        attempts += 1
        if attempts >= 3 and question.hint is not None:
            print(f'Hint: {question.hint}.')
            user_input = input()
            normalized = user_input.strip().lower()
        else:
            print('That is not correct, try again.')
            user_input = input()
            normalized = user_input.strip().lower()

    print('That is correct!')

print('\nThanks for playing!')

Копируйте пример, пробуйте менять вопросы и логику, чтобы изучать новые концепции.

Проверка качества и тестовые случаи

Критерии приёмки

  • Скрипт запускается командой python InteractiveQuiz.py без ошибок
  • Для каждого вопроса возможен ввод ответа и программа корректно определяет правильность
  • Поддерживаются варианты multiple choice и альтернативные ответы
  • Подсказка появляется после трёх неверных попыток

Тестовые случаи

  • Ввести ответ с лишними пробелами и разным регистром — считается правильным
  • Ввести одно из alternateAnswers — считается правильным
  • Для multiple choice ввести букву в любом регистре — сравнение по lower() должно сработать
  • Ввести неправильный ответ три раза и убедиться, что выводится hint

Чек-листы по ролям

Для обучающегося:

  • Запустить пример и ответить на все вопросы
  • Добавить новый вопрос с альтернативными ответами
  • Изменить формат подсказки

Для наставника:

  • Проверить корректность сравнения строк
  • Убедиться, что подсказки не раскрывают ответ полностью
  • Провести код-ревью на предмет читабельности

Для разработчика:

  • Вынести логику парсинга ответов в отдельную функцию
  • Добавить логирование попыток
  • Добавить опцию подсчёта очков и сохранения результатов

Варианты улучшений и когда это не подходит

Когда использовать этот подход:

  • для обучения основам Python и структуры простых CLI-приложений
  • для создания викторины без GUI

Ограничения и альтернативы:

  • Если нужна веб-версия, используйте Flask или Django
  • Для масштабных квизов с пользователями и хранением результатов рассмотрите базу данных
  • Если требуется конкурентная многопользовательская викторина, переходите на веб или мобильные приложения

Мини-методология разработки

  1. Начать с простого вопроса и корректного цикла ввода/вывода
  2. Выделить структуру вопроса в класс
  3. Добавить поддержку вариантов и альтернативных ответов
  4. Добавить подсказки и ограничение перехода по этапам
  5. Написать тесты и критерии приёмки
  6. Рефакторинг: вынести повторы в функции

Советы по локализации и удобству использования

  • Для поддержки нескольких языков храните текст вопросов в отдельных файлах или словарях
  • Для длинных подсказок избегайте передачи очевидных частей ответа
  • Используйте понятный формат multiple choice: (a), (b), (c) и т.д.

Краткое объявление для публикации

Создана инструкция по разработке интерактивной викторины на Python. Включён полный пример кода, подсказки, поддержка вариантов и альтернативных ответов. Отличный проект для практики основных навыков программирования.

Итоги

  • Использование класса Question упрощает управление вопросами
  • alternateAnswers и hint повышают гибкость викторины
  • Цикл while позволяет требовать правильный ответ перед переходом далее
  • Простой пример легко расширять под нужды обучения и тестирования

Важное: начните с малого, затем постепенно добавляйте функции — подсчёт очков, сохранение результатов, таймеры и веб-интерфейс.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро