Losowy wybór pytania i ograniczenie do prób

0

Dzień dobry,

jestem początkujący w pythonie. Obecnie tworzę prosty quiz historyczny. na razie na bazie trzech pytań. Program działa jak chciałem, z tym, że trzeba podać prawidłową odpowiedź, aby przejść do następnego pytania. Można tak bez końca, ale teraz zaczynają się dla mnie schodki. Chciałbym, aby maksymalnie przy każdym pytaniu były maksymalnie trzy próby, a na zakończenie testu pokazywał się wynik procentowy quizu tzn. żeby osoba, która miała 9 prób miała mniejszy procent odpowiedzi niż ta co trzy. Uczę się Python 3.0. Myślałem nad input() i randint(), ale nie wiem jak to ugryźć i gdzie ewentualnie to umieścić. Byłbym wdzięczny za ewentualne odpowiedzi. Tzn. czy na górze samej, czy po bloku. Jestem początkujący więc mój kod może trochę być amatorski. Program mój na podstawie jeszcze nikłej wiedzy. Oto kod:

# Quiz historyczny dla uczniów szkół średnich kontynuacja
import datetime

datetime.randint = [1410, 1914, 1939]

while datetime != 1410:
    datetime = int(input("W którym roku była bitwa pod Grunwaldem?"))

    if datetime < 1410:
        print("Kiedy indziej.")

    elif datetime > 1410:
        print("Powtóreczka czeka.")

    elif datetime == 1410:
        print("Super! Gratulacje!")

    else:
        print("Spróbuj jeszcze raz.")

while datetime != 1939:
    datetime = int(input("W którym roku była II Wojna Światowa?"))

    if datetime < 1939:
        print("Kiedy indziej.")

    elif datetime > 1939:
        print("Powtóreczka czeka.")

    elif datetime == 1939:
        print("Super! Gratulacje!")

    else:
        print("Spróbuj jeszcze raz.")

while datetime != 1914:
    datetime = int(input("W którym roku była I Wojna Światowa?"))

    if datetime < 1914:
        print("Kiedy indziej.")

    elif datetime > 1914:
        print("Powtóreczka czeka.")

    elif datetime == 1914:
        print("Super! Gratulacje!")

    else:
        print("Spróbuj jeszcze raz.")
1

Jak piszesz - jesteś początkujący, więc nie wiem, na ile moja podpowiedź będzie dla Ciebie zrozumiała, ale co tam, spróbuję ;)

Czy takie pojęcie jak funkcja coś Ci mówi?
Zobacz - masz właściwie 3 razy napisane to samo (obsługa każdego pytania), tylko różnią się te miejsca (linie 6-19, 21-34 oraz 36-49) samym pytaniem oraz możliwymi odpowiedziami. To się aż prosi, żeby napisać jakąś funkcję o nazwie pytanie i przekazać do niej wartości każdego pytania. Wywołałbyś ją na zasadzie pytanie ("Kiedy było coś-tam", 1933, 1845, 1990). Zresztą zobacz teraz - masz 3 pytania, a jakbyś chciał dodać kolejne to musisz skopiować treść jednego pytania i podmienić w nich wartości. A teraz się zastanów, jakbyś miał w grze 15 pytań i chciałbyś nagle zmienić coś - np. dodać czwartą odpowiedź, to musiałbyś poprawić ręcznie kod odpowiedzialny za każde z tych kilkunastu pytań - a to jest dużo pracy i duże ryzyko, że coś przy okazji popsujesz/namieszasz. Wydzielając to do osobnej funkcji masz tylko jedno miejsce, gdzie musisz wprowadzić zmiany.

A co do samego zliczania odpowiedzi - na razie masz jedynie warunek przy while że ma mielić póki odpowiedź jest różna od pożądanej. Musiałbyś dodać jakieś zmienne, które będą zliczać podjęte próby - bo bez tego nie ma opcji, żeby wprowadzić jakieś statystyki do gry.

Tak samo odnośnie losowania pytania - na razie masz je podane po kolei, ale jakbyś umieścił je np. w tablicy, a potem losował pozycję z tablicy z pytaniem, to masz pięknie ogarnięte losowanie pytania.

2

Osobiście zrobił bym to na słowniku, funkcja tez by się przydała, o tak

import random
pytania = {"W którym roku była bitwa pod Grunwaldem?":1410, "W którym roku była I Wojna Światowa?":1914, "W którym roku była II Wojna Światowa?":1939}

def pytaj (pytanie):
    print(pytanie)
    
    for i in range(3):
        odpowiedz = int(input())
        if odpowiedz < pytania[pytanie]:
            print("Kiedy indziej.")
        elif odpowiedz > pytania[pytanie]:
            print("Powtóreczka czeka.")

        elif odpowiedz == pytania[pytanie]:
            print("Super! Gratulacje!")
            return True
    return False


zadaj = list(pytania.keys())
random.shuffle(zadaj)
for pytanie in zadaj:
    if pytaj(pytanie) is True:
        print("gratulacje, przechodzisz dalej")
    else:
        print("doucz sie")
        break
print("to już wszystko na dziś")
47

Mam nieodparte wrażenie graniczące z pewnością, że jesteś autorem tego tematu Aplikacja konsolowa zadająca pytania i liczącą odpowiedzi.

Po lekkiej modyfikacji:

from dataclasses import dataclass
from typing import List, Dict
import random

@dataclass
class Question:
    content: str
    correct_answer: str

class Quiz:
    def __init__(self):
        self.wrong_answers = 0
        self.correct_answers = 0


    def play(self, question: Question, attempts: int = 3):
        for _ in range(1, attempts+1):
            user_answer = input(f"attempt({_}) {question.content}: ")
            if user_answer == question.correct_answer:
                self.correct_answers += 1
                return
        self.wrong_answers += 1

    @property
    def statistics(self) -> Dict[str, int]:
        return {
            "questions number": self.wrong_answers + self.correct_answers,
            "correct": self.correct_answers,
            "wrong": self.wrong_answers
        }

def main(questions: List[Question]):
    questions = questions.copy()
    quiz = Quiz()
    while questions:
        random.shuffle(questions)
        question = questions.pop()
        quiz.play(question)
    print(quiz.statistics)


if __name__ == "__main__":
    questions_raw = [
        ("W którym roku wybuchła II wojna światowa?", "1939"),
        ("W którym roku był Chrzest Polski?", "966"),
        ("W którym roku była bitwa pod Grunwaldem?", "1410"),
        ("Pierwszy król Polski, Bolesław Chrobry, został koronowany?", "1025"),
        ("Pierwszy rozbiór Polski miał miejsce?", "1772"),
        ("Czy pamiętasz, w którym roku wybuchło powstanie listopadowe?", "1830"),
        ("Rewolucja październikowa, nazywana też rewolucją bolszewicką, rozpoczęła się?", "1917"),
        ("Zrzucenie bomby na japońskie miasta - Hiroshimę i Nagasaki, miało miejsce?", "1945"),
        ("Kiedy runął mur berliński?", "1989"),
        ("Rozpoczęcie obrad Okrągłego Stołu?", "1989")
    ]
    questions: List[Question] = [Question(*x) for x in questions_raw]
    main(questions=questions)
    ```
0

Absolutnie. Dopiero się zarejestrowałem, bo uczę się sam i z książek. Do tego forum dołączyłem dzisiaj. Quiz robię dla przyjemności i staram się ćwiczyć, ponieważ już jestem wiekowy :). I to mój pierwszy post. Ja naprawdę jestem początkujący. Zatem się bardzo mylisz. Nie jestem zwolennikiem rozwiązywania gotowców.

0
sig napisał(a):

Osobiście zrobił bym to na słowniku, funkcja tez by się przydała, o tak

Dziękuje za odpowiedź. Musze poczytać o słowniku. To jestem jeszcze daleko na początku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1