Введение
Создайте локальную викторину, которая правильно оценивает ответы даже после перестановки вариантов. Нужны функции, списки, словари, условия и циклы Python. JSON, случайный выбор и проверка ввода объясняются здесь. Подготовленный терминальный движок отвечает за показ и обратную связь; вы реализуете три правила в logic.py.
Откройте меню Terminal в WebIDE, затем New Terminal (в узком окне — внутри More). Все команды выполняйте в этом терминале. Сохраните engine.py, quiz.py, demo.py и bank.json без изменений; редактируйте только logic.py. Оценка времени чтения и практики — 40 минут; это не измерение на начинающих.
Выбирать вопросы и перемещать варианты целиком
На этом шаге ответьте на два известных вопроса, затем добавьте случайный выбор, сохраняя идентичность объектов. В терминале WebIDE команда cd меняет рабочий каталог, а python3 запускает файл Python.
cd /home/labex/project
python3 demo.py
Введите 1 для Sun, затем 2 для Moon. Оба ответа показывают Correct!. Эта демонстрация с фиксированным порядком подготовлена заранее; ваша универсальная викторина будет также переставлять варианты.
cat показывает текстовый файл:
cat bank.json
В JSON списки обозначаются [], словари — {}, строки заключаются в двойные кавычки. У каждого вопроса есть question_id, prompt, options и correct_option_id. Каждый вариант связывает option_id с text. ID устойчивы, а экранные номера — лишь позиции. В sky и tide есть Sun/Moon, но Sun верен только для sky. ID варианта уникален внутри вопроса, поэтому идентичность задаётся парой вопроса и варианта. В предоставленных банках уникальны ID вопросов и тексты вариантов внутри одного вопроса.
rng — переданный объект генератора случайных чисел. Его sample(items, count) возвращает новый список без повторного выбора элемента, но не исправляет дубли ID вопросов. shuffle(items) меняет список на месте, поэтому сначала копируйте варианты. Перемещайте словари целиком, чтобы ID оставался связан с текстом. Запрошенное количество положительно; ограничивайте фактическую выборку размером банка через min(count, len(questions)). Случайность разнообразит игру, но не обеспечивает безопасность. Допустимы равнозначные способы выборки и перемешивания; фиксированное начальное значение или порядок не требуются.
Следующий here-document записывает текст Python: > заменяет logic.py, а заключённый в кавычки <<'PY' сохраняет содержимое буквально до завершающего PY. Выполните весь блок, включая последнюю строку. Он заменит начальный файл двумя функциями; функция ввода появится далее.
cat > logic.py <<'PY'
def choose_questions(questions, count, rng):
return rng.sample(questions, min(count, len(questions)))
def move_options(question, rng):
options = question["options"].copy()
rng.shuffle(options)
return options
PY
Теперь choose_questions возвращает ограниченную выборку, а move_options — переставленные объекты вариантов, не меняя банк. Если терминал ждёт продолжения, завершите ввод отдельной строкой PY.
Преобразовать допустимый номер в его ID
На этом шаге преобразуйте экранный выбор в устойчивый ID варианта. Подготовленный движок передаёт функции ask для ввода и tell для вывода. ask возвращает текст; strip() убирает пробелы по краям. enumerate(..., start=1) связывает объект с показанным номером. Сравнивайте текст с str(position), чтобы oops, -1, 0 и номера вне диапазона не отправляли ответ. Принимается только показанная запись: 1, но не 01. q завершает работу до отправки. Верните один допустимый ответ; иначе цикл while спрашивает снова.
В том же терминале >> добавляет функцию, не заменяя две уже записанные:
cat >> logic.py <<'PY'
def read_answer(options, ask, tell):
while True:
text = ask("Answer (number or q): ").strip()
if text.lower() == "q":
return None
for position, option in enumerate(options, start=1):
if text == str(position):
return option["option_id"]
tell("Enter one displayed number, or q to stop.")
PY
Сыграйте все доступные вопросы. --count задаёт положительный максимум; даже 100 выберет только три подготовленных вопроса. Без --ordered порядок вопросов и позиции вариантов меняются.
python3 quiz.py bank.json --count 100
При первом запросе попробуйте oops, -1, 0 и 99. Каждый раз появится Enter one displayed number, or q to stop., и тот же вопрос будет задан снова. Затем отвечайте по тексту: Sun для звезды, Moon для приливов, Root для поглощения воды из почвы. Каждый раз читайте показанный номер. Обратная связь должна соответствовать выбору; итог:
Score: 3/3 answered
Начните более короткий раунд и сразу введите q:
python3 quiz.py bank.json --count 2
Score: 0/0 answered
Вопросы без ответа отсутствуют в результате, а не считаются ошибками. Движок отправляет ответ один раз, даёт обратную связь по текущей связи вопроса и варианта и считает баллы. Экранные номера не сохраняются. Опечатка в имени файла вызывает Quiz error: ... и ненулевой код завершения: успешной игры не было. Посмотрите имена через ls и повторите точную команду выше. При синтаксической ошибке Python повторите соответствующий here-document целиком; не сбрасывайте окружение.
Резюме
Вы создали пригодную для повторного использования викторину с конечной случайной выборкой и устойчивым сопоставлением ответов. В этой части записи не сохраняются.



