Mantener respuestas correctas al mover opciones

PythonBeginner
Practicar Ahora

Introducción

Crea un cuestionario local jugable que siga evaluando bien cuando cambien las opciones de posición. Debes conocer funciones, listas, diccionarios, condiciones y bucles de Python. Aquí se explican JSON, la selección aleatoria y la validación de entradas. El motor de terminal preparado presenta las preguntas y los comentarios; tú implementas tres reglas en logic.py.

Abre el menú Terminal de WebIDE y elige New Terminal (dentro de More en ventanas estrechas). Ejecuta allí todos los comandos. Conserva engine.py, quiz.py, demo.py y bank.json; edita solo logic.py. Tiempo estimado de lectura y práctica: 40 minutos; no es una medición con principiantes.

Seleccionar preguntas y mover opciones completas

En este paso jugarás dos preguntas conocidas y añadirás selección aleatoria sin perder las identidades. En la terminal de WebIDE, cd cambia el directorio de trabajo y python3 ejecuta un archivo Python.

cd /home/labex/project
python3 demo.py

Introduce 1 para Sun y después 2 para Moon. Ambas muestran Correct!. Esta demostración con orden fijo está preparada; tu cuestionario reutilizable también moverá las opciones.

cat muestra un archivo de texto:

cat bank.json

JSON representa listas con [], diccionarios con {} y cadenas entre comillas dobles. Cada pregunta tiene question_id, prompt, options y correct_option_id. Cada opción une option_id y text. Los ID son estables; los números de pantalla son posiciones. sky y tide ofrecen Sun/Moon, pero Sun solo es correcto para sky. Los ID de opción son únicos dentro de su pregunta: la identidad es el par pregunta y opción. En estos bancos, los ID de pregunta y los textos de opciones dentro de cada pregunta son únicos.

rng es un objeto generador aleatorio proporcionado. sample(items, count) devuelve una lista nueva sin repetir elementos; no corrige ID de pregunta duplicados. shuffle(items) cambia una lista en su sitio: copia antes las opciones. Mueve diccionarios completos para mantener cada ID unido a su texto. La cantidad solicitada es positiva; limítala al tamaño del banco mediante min(count, len(questions)). El azar cambia la partida, no ofrece seguridad. Se aceptan métodos equivalentes de muestreo o mezcla, sin semilla ni orden fijos.

Este here-document escribe texto Python: > sustituye logic.py; <<'PY', entrecomillado, conserva literalmente el contenido hasta el último PY. Ejecuta el bloque completo, incluida esa última línea. Sustituye el archivo inicial por estas dos funciones; la función de entrada se añade después.

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 devuelve ahora una selección limitada y move_options devuelve opciones reordenadas sin modificar el banco. Si aparece un indicador de continuación, termina con PY en una línea independiente.

Convertir un número válido en su ID

En este paso transformarás una selección visible en su ID estable. El motor preparado pasa las funciones ask (entrada) y tell (salida). ask devuelve texto; strip() elimina espacios de los extremos. enumerate(..., start=1) asocia cada objeto con su número visible. Compara el texto con str(position) para impedir que oops, -1, 0 o números fuera de rango envíen una respuesta. Se admite la escritura mostrada: 1, no 01. q termina antes del envío. Devuelve una sola respuesta válida; de lo contrario, el bucle while vuelve a preguntar.

En la misma terminal, >> añade esta función sin sustituir las dos anteriores:

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

Juega todas las preguntas disponibles. --count solicita un máximo positivo; 100 sigue seleccionando solo las tres preguntas suministradas. Sin --ordered, cambian las posiciones de preguntas y opciones.

python3 quiz.py bank.json --count 100

En el primer indicador prueba oops, -1, 0 y 99. Cada entrada muestra Enter one displayed number, or q to stop. y repite la misma pregunta. Después responde por el texto: Sun para la estrella, Moon para las mareas y Root para absorber agua del suelo. Lee el número visible cada vez. El comentario debe corresponder a tu selección; el resultado final es:

Score: 3/3 answered

Inicia una ronda más corta e introduce q inmediatamente:

python3 quiz.py bank.json --count 2
Score: 0/0 answered

Las preguntas sin responder están ausentes, no son errores. El motor envía una vez, muestra el comentario según la relación actual pregunta/opción y calcula la puntuación. No guarda números de pantalla. Si escribes mal un archivo, Quiz error: ... y una salida distinta de cero indican que la partida no terminó correctamente; usa ls para ver nombres y repite el comando exacto anterior. Si Python informa de un error de sintaxis, repite el here-document completo correspondiente; no reinicies el entorno.

Resumen

Has creado un cuestionario reutilizable y jugable con selección aleatoria finita y correspondencia estable de respuestas. Esta unidad no guarda registros.