데이터 분석가

파이썬(Python) 퀴즈 프로그램(quizprogram) 프로젝트 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 퀴즈 프로그램(quizprogram) 프로젝트

PlintAn 2023. 3. 27. 16:00

안녕하세요 !

퀴즈게임

 

 

이번 시간에는 Class를 활용한 퀴즈 프로그램을 만들어 보겠습니다

 

data = {} 에 해당하는 딕셔너리는 아래 DB 사이트에서 간편하게 받을 수 있습니다 !

 

https://opentdb.com/

 

Open Trivia DB

Free to use, user-contributed trivia questions!

opentdb.com

 

해당 사이트에 오른쪽 상단 'API' 를 클릭하여

취향에 맞게 선택 후, Select Type은 True/False를 선택합니다.

 

반환된 딕셔너리를 data = {} 에 넣으면 자바 형식이므로 code reform 을 활용하여 파이썬 코드로 변환해줍니다.

 

question_data = [
    {
        "category": "Science: Computers",
        "type": "boolean",
        "difficulty": "medium",
        "question": "The HTML5 standard was published in 2014.",
        "correct_answer": "True",
        "incorrect_answers": [
            "False"
},
{...},
]

 

Open Trivia DB에서 불러온 데이터를

 

data.py 파이썬 개별 파일에서(from data)

 

question_data로 저장해줍시다(import question_data)

 

저의 경우엔 10가지 딕셔너리만 불러왔습니다.

 

class Question: #파스칼 표기법(Pascal Casing Notation)으로 Q는 대문자

    def __init__(self, q_text, q_answer): #self는 자동으로 입력, 질문, 대답 반환
        self.text = q_text 
        self.answer = q_answer

 

question_model.py 파이썬 개별 파일에서(from question_model)

 

첫 번째 class Question: (import Question)

 

class 사용 시 Question Q는 파스칼 표기법에 의해 대문자를 사용합니다

 

def __init__를 사용하게 되면 변수에 self가 자동으로 표시되는데, 이후 두 변수 text, answer 을 설정합니다

 

이렇게 사용되면 data = {} 딕셔너리에 있는 질문, 답을 자동으로 입력시킬 수 있습니다.

 

class QuizBrain: 

    def __init__(self, q_list):
        self.question_number = 0 #기본 값 0부터 시작
        self.score = 0 #기본 값 0부터 시작
        self.question_list = q_list #list를 받아 자동으로 추가

    def still_has_question(self): #남은 질문을 묻는 반복문
        return self.question_number < len(self.question_list)
#self.question_number은 += 1씩 커지고, len(self.question_list)는 질문의 갯수

 

quiz_brain.py 파이썬 개별 파일에서(from quiz_brain)

 

두 번째 class QuizBrain: (import QuizBrain)

 

첫 번째 class와 마찬가지로 (self)는 자동입력되고, 이번엔 질문 리스트(q_list)를 변수로 설정합니다

 

질문의 순서는 0부터 시작, score는 추후 식으로 += 1 씩 증가하게 됩니다

 

def still has_question(self):는 반복문입니다

 

간단히 설명하자면 0부터 시작하는 질문의 순서는 1씩 증가하는데(+=1) 

 

질문의 순서가 전체 질문의 수가 적은 경우까지 반복합니다.

 

 

    def next_question(self): #다음 질문 반복문
        current_question = self.question_list[self.question_number] #질문인덱싱으로 현재 질문
        self.question_number += 1 #질문마다 1씩 증가
        user_answer = input(f"Q.{self.question_number}: {current_question.text} (True/False): ")
        self.check_answer(user_answer, current_question.answer) #질문 개체이므로 answer

    def check_answer(self, user_answer, correct_answer): #위의 해당 값들을 매개 변수로 받는다
        if user_answer.lower() == correct_answer.lower():
            self.score += 1
            print("You got it!")
        else:
            print("That's wrong")

        print(f"The correct answer was: {correct_answer}") #들여쓰기 True일 경우 반환
        print(f"Your current score is : {self.score}/{self.question_number}")
        print("\n")

 

def next_question(self):는

 

질문 리스트질문 순서인덱싱하여 이를 현재 질문으로 저장합니다

 

질문 순서는 1씩 증가하고

 

user_answer을 input 함수로 True or Flase로 입력받고

 

이를 check_answer(유저 대답, 현재 질문) 변수로 확인합니다.

 

위 check_answer 에  user_answer, current_question.answer 두 변수가 넣어졌으니

 

 

def check_ answer 함수가 이 두 변수를 받아서  대답과 질문이 같다면 

 

score +1 증가, "You got it!"을 출력하고 {correct_answer}정답을 보여주고

 

현재 스코어 / 질문 순서반환하여 현 상황을 출력합니다.

 

반대로 대답과 질문이 같지 않다면 "That's wrong"을 반환합니다

 

 

위 세 가지 개별 파이썬 파일들을 main.py에서 불러와서 사용합니다

 

from question_model import Question 
from data import question_data
from quiz_brain import QuizBrain

question_bank = [] #질문을 받을 리스트 생성
for question in question_data: #질문 DB에서 질문을 반복합니다
    question_text = question["question"] #질문 인덱싱하여 불러오기
    question_answer = question["correct_answer"] #정답 인덱싱하여 불러오기
    new_question = Question(question_text, question_answer) #새로운 질문을 text,answer 불러오기
    question_bank.append(new_question) #불러온 새로운 질문을 질문 받을 리스트에 추가

quiz = QuizBrain(question_bank) #초기화 시 [목록] 제출

while quiz.still_has_question(): #질문 순서 < 전체 질문수가 True일 경우
    quiz.next_question() #다음 질문은 반환합니다.


print("You have completed the quiz")
print(f"Your final score was: {quiz.score}/{quiz.question_number}")

 

 

먼저 앞서 작성한 세 개별 파이썬 파일들을 순서대로 불러오고

 

질문을 받을 리스트 question_bank = [] 로 생성하고

 

질문 DB에서 질문을 for 문을 이용해 반복합니다

 

질문, 정답을 인덱싱하여 가져와 저장하고, 이를 바탕으로 새로운 질문을 추가하여 question_bank = []

 

리스트에 추가합니다.

 

    def still_has_question(self):
        return self.question_number < len(self.question_list)

 

추가한 질문들을 while 문을 이용해 질문 순서 < 전체 질문 = True

 

로 전체 질문이 다 나올 동안 반복합니다.

 

그리고 마지막으로 합산된 quiz.score / 전체 질문 수 quiz.question_number 로 출력해서 보여줍니다.

 

 

 

조금 헷갈리실 수도 있을거 같습니다 !

 

저도 class 함수를 활용한 경험이 없기 때문이죠. ! 

 

하지만 위와 같이 간단한 퀴즈에 대한 값을 자동으로 입력해주는

 

class __init___(self) 형식을 잘 알고 사용한다면 정말 편하게 작성 가능할거 같습니다.

 

특히 많은 딕셔너리를 포함하는 퀴즈와 같은 질문에 대한 반환일 경우 빛을 발하는거 같습니다 !

 

그렇다면 한번씩 사용해서 작성해봅시다 !

 

 

 

 

 

 

Comments