Introdução
Crie um quiz local jogável que continue avaliando corretamente quando as alternativas mudarem de posição. Você precisa conhecer funções, listas, dicionários, condições e laços do Python. JSON, seleção aleatória e validação de entrada são explicados aqui. O mecanismo de terminal preparado cuida da apresentação e do retorno; você implementa três regras em logic.py.
Abra o menu Terminal do WebIDE e escolha New Terminal (dentro de More em janelas estreitas). Execute todos os comandos nesse terminal. Mantenha engine.py, quiz.py, demo.py e bank.json intactos; edite apenas logic.py. Tempo estimado de leitura e prática: 40 minutos, sem medição com iniciantes.
Selecionar perguntas e mover alternativas inteiras
Nesta etapa, jogue duas perguntas conhecidas e depois acrescente seleção aleatória sem perder identidades. No terminal WebIDE, cd muda o diretório de trabalho e python3 executa um arquivo Python.
cd /home/labex/project
python3 demo.py
Digite 1 para Sun e depois 2 para Moon. Ambas mostram Correct!. Essa demonstração de ordem fixa está preparada; seu quiz reutilizável também moverá alternativas.
cat exibe um arquivo de texto:
cat bank.json
JSON representa listas com [], dicionários com {} e strings entre aspas duplas. Cada pergunta tem question_id, prompt, options e correct_option_id. Cada alternativa une option_id a text. IDs são estáveis; números na tela são posições. sky e tide oferecem Sun/Moon, mas Sun está correto apenas em sky. IDs de alternativas são únicos dentro da pergunta: a identidade é o par pergunta e alternativa. Nos bancos fornecidos, os IDs de pergunta e os textos de alternativas dentro de cada pergunta são únicos.
rng é um objeto gerador aleatório fornecido. sample(items, count) retorna uma nova lista sem selecionar um elemento novamente; não corrige IDs de pergunta duplicados. shuffle(items) altera uma lista no próprio lugar, por isso copie primeiro as alternativas. Mova dicionários inteiros para manter cada ID ligado ao seu texto. A quantidade solicitada é positiva; limite o sorteio ao tamanho do banco com min(count, len(questions)). O acaso varia a partida, não oferece segurança. Métodos equivalentes de seleção e embaralhamento são aceitos; nenhuma semente ou ordem fixa é exigida.
O here-document a seguir escreve texto Python: > substitui logic.py; <<'PY', entre aspas, mantém o conteúdo literal até o último PY. Execute todo o bloco, incluindo a última linha. Ele substitui o arquivo inicial por essas duas funções; a função de entrada vem depois.
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
Agora choose_questions retorna uma seleção limitada e move_options retorna objetos de alternativas reordenados sem modificar o banco. Se o terminal mostrar um prompt de continuação, finalize com PY sozinho em uma linha.
Mapear um número válido de volta ao ID
Nesta etapa, converta uma escolha exibida em seu ID estável. O mecanismo preparado passa as funções ask (entrada) e tell (saída). ask retorna texto; strip() remove espaços nas extremidades. enumerate(..., start=1) associa cada objeto ao número exibido. Compare o texto com str(position) para impedir que oops, -1, 0 e números fora da faixa enviem respostas. Só a grafia exibida é aceita: 1, não 01. q encerra antes do envio. Retorne uma única resposta válida; caso contrário, o laço while pergunta novamente.
No mesmo terminal, >> acrescenta esta função sem substituir as duas 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
Jogue todas as perguntas disponíveis. --count solicita um máximo positivo; 100 ainda seleciona somente as três perguntas fornecidas. Sem --ordered, as posições das perguntas e alternativas variam.
python3 quiz.py bank.json --count 100
No primeiro prompt, tente oops, -1, 0 e 99. Cada entrada mostra Enter one displayed number, or q to stop. e repete a mesma pergunta. Depois responda pelo texto: Sun para estrela, Moon para marés e Root para absorver água do solo. Leia o número exibido a cada vez. O retorno deve corresponder à escolha; o resultado final é:
Score: 3/3 answered
Inicie uma rodada mais curta e digite q imediatamente:
python3 quiz.py bank.json --count 2
Score: 0/0 answered
Perguntas sem resposta ficam ausentes, não incorretas. O mecanismo preparado envia uma vez, apresenta o retorno conforme a relação atual pergunta/alternativa e calcula a pontuação. Não salva números da tela. Um nome de arquivo incorreto causa Quiz error: ... e saída diferente de zero: não houve uma partida bem-sucedida. Use ls para ver os nomes e repita o comando exato acima. Se Python apontar erro de sintaxe, repita todo o here-document correspondente; não reinicie o ambiente.
Resumo
Você criou um quiz jogável e reutilizável com seleção aleatória finita e associação estável das respostas. Esta unidade não salva registros.



