import random
import requests
import time
class Questions:
def _raw_response(self) -> dict:
return requests.get("https://opentdb.com/api.php?amount=10").json()
def _shuffle_questions(self, question_set: list[dict]):
for question in question_set:
random.shuffle(question["answers"])
def create_question_set(self) -> list[dict]:
question_set: list[dict] = [
{
"question":result["question"],
"answers":[*result["incorrect_answers"], result["correct_answer"]],
"correct_answer":result["correct_answer"]
}
for result in self._raw_response().get("results")]
self._shuffle_questions(question_set)
return question_set
class Quiz:
def __init__(self):
self.questions = Questions()
self.good_tries: int = 0
self.bad_tries: int = 0
self.average_time: float = 0
def get_questions(self) -> list[dir]:
return self.questions.create_question_set()
def display_question_and_answers(self, question: str, answers: list[str]) -> None:
print(question,
"\n".join([f"{num}. {asnwer}" for num,asnwer in enumerate(answers, start=1)]), sep="\n")
def user_answer(self, answers_number: int) -> int:
start = time.time()
answer = input("answer: ")
while answer.isdecimal() is False or int(answer) not in range(1, answers_number+1):
print(f"Accepts only numbers in range 1-{answers_number}")
answer = input("answer: ")
end = time.time()
self.average_time += (end-start)
return int(answer)
def validate_user_answer(self, correct_answer: str, answer: str(int)) -> None:
if answer == correct_answer:
self.good_tries += 1
else:
self.bad_tries += 1
def summary(self) -> None:
all_tries: int = self.bad_tries + self.good_tries
print(f"tries: {all_tries}",
f"good tries: {self.good_tries}",
f"bad tries: {self.bad_tries}",
f"average time: {self.average_time / all_tries}",
sep="\n",)
def main():
quiz_instance = Quiz()
for obj in quiz_instance.get_questions():
question: str = obj.get("question")
answers: list[str] = obj.get("answers")
answers_number: int = len(answers)
correct_answer: str = obj.get("correct_answer")
quiz_instance.display_question_and_answers(question=question, answers=answers)
user_answer_index: int = quiz_instance.user_answer(answers_number=answers_number) - 1
quiz_instance.validate_user_answer(correct_answer=correct_answer, answer=answers[user_answer_index])
quiz_instance.summary()
if __name__ == "__main__":
main()
Klasa Questions
strzela sobie getem w api, żeby wygenerować jsona z przykładowym setem pytań. Następnie filtruje potrzebne pola i tworzy listę dzienników z potrzebnymi informacjami jak pytanie, możliwe odpowiedzi, dobra odpowiedź. Struktura jsona wymaga manualnego stworzenia listy możliwych pytań, ponieważ mamy takie pola jak incorrect_answers i correct_answer. Najprościej więc jest je do siebie dodać a następnie przy pomocy shuffle, przemieszać (żeby za każdym razem kolejność była losowa. Inaczej ostatnia odpowiedź zawsze będzie tą prawidłową :D).
Klasa Quiz
to już cała logika czyli wyświetlenie pytania i możliwych odpowiedzi, wczytanie odpowiedzi użytkownika (sprawdzenie, czy mieści się w odpowiednim zakresie ilości możliwych odpowiedzi), porównanie odpowiedzi użytkownika z poprawną odpowiedzią, wszystkie obliczenia o których wspomniałeś.
Za pewne można zrobić to lepiej niemniej sama logika powyższego powinna Ci trochę rozjaśnić jak można się za to zabrać.