파이썬/파이썬(python) 중급

[17-5 파이썬] 퀴즈 게임 만들기(클래스, 속성, 메소드)

Olivia-BlackCherry 2022. 8. 25. 18:02

1. 클래스, 생성자 만들기

- Quiz 클래스 만들기
- init 함수에 text, answer 속성 만들기

[코드]

class Quiz:
    def __init__(self, text, answer):
        # 생성자(constructor): 속성 만들기
        self.text = text
        self.answer = answer
        
# 객체 만들기
quiz1 = Quiz("여름에 가장 좋아하는 음식이 무엇인가요?", "팥빙수")
quiz2 = Quiz("겨울에 가장 좋아하는 음식이 무엇인가요?", "귤")

[실행 화면]

 

 

 

2. 질문 사전 만들기

- question data에 text, answer가 있음.
- 이 데이터들을 파라미터로, Quiz클래스의 객체를 차례대로 생성하자.
- 이 객체들의 모음을 quiz_bank라고 이름짓는다.

[코드]

#데이터들
question_data = [
    {"text": "비만 오면 시끄럽게 나타나는 가장 빠른 개는", "answer": "번개"},
    {"text": "어느 식당이든 다 키우고 있는 개는?", "answer": "이쑤시개" },
    {"text": "개는 개인데 여러 색을 가진 개는?", "answer": "무지개"},
    {"text": "우리가 잘 때 늘 옆에 있어 주는 개는?" , "answer": "베개"},
    {"text": "개는 개인데 날아다니는 개는?", "answer": "솔개"},
]

# quiz_bank, 빈 리스트 생성하기
quiz_bank = []

# 반복문 돌리면서 해당 순서의 text, answer로 객체 만들기
for data in question_data:
  data_text = data["text"]
  data_answer= data["answer"]
  quiz_bank.append(Quiz(data_text, data_answer))
print(quiz_bank)

[실행 화면]

 

 

 

3. 문제 내는 머신 만들기

1. 문제 내는 머신인 class 만들기 :QuizBrain 
2. 문제 번호와 문제 모음이 있는 생성자 만들기: question_number, quiz_bank
3. 문제가 나오면 사용자가 정답을 입력하기
4. 문제를 실행하고 나면, question_number가 1이 추가 된다.

[코드]

class Quiz_Brain:
  #생성자 만들기
  def __init__(self, questions_list):
    self.question_number = 0 
    self.quiz_bank =questions_list

  #문제 내기
  def next_question(self):
    current_question = quiz_bank[self.question_number]
    input(f"Q.{self.question_number + 1}: {current_question.text}?")
    self.question_number += 1
# 객체 만들기
quiz_brain = Quiz_Brain(quiz_bank)
#실행하기 
print(quiz_brain.question_number)
print(quiz_brain.quiz_bank)
quiz_brain.next_question()
print(quiz_brain.question_number)

[실행화면]

 

 

 

4. 문제 수 만큼, 자동으로 문제 넘어가기

1. 만약 문제가 남아 있다면, 자동으로 문제가 나오게 하기- while구문
2. quiz_brain의 메소드로 넣기 (question_left)

[코드]

class Quiz_Brain:
  def __init__(self, questions_list):
    self.question_number = 0 
    self.quiz_bank =questions_list

  def next_question(self):
    current_question = quiz_bank[self.question_number]
    input(f"Q.{self.question_number + 1}: {current_question.text}?")
    self.question_number += 1

  # 문제 남아 있는지 확인하기 True/False
  def still_has_question(self):
    return self.question_number < len(self.quiz_bank)
    
# 문제 있는 동안 자동으로 문제 나오게 하기
while quiz_brain.still_has_question():
  quiz_brain.next_question()

[실행화면]

 

 

 

5. 답변 확인하기

- 답을 맞추었다면, 점수를 1 더하기(check_answer 메서드와 score 속성 추가하기)
- 상황에 맞는 문구 출력하기(정답입니다. 틀렸습니다. 점수는 ~입니다 등등)

[코드]

class Quiz:
  def __init__(self, text, answer):
    self.text = text
    self.answer = answer  
    

class Quiz_Brain:
  def __init__(self, questions_list):
    self.question_number = 0 
    self.quiz_bank =questions_list
    # score 속성 추가하기. 기본값으로 0
    self.score = 0

  def next_question(self):
    current_question = self.quiz_bank[self.question_number]
    self.question_number += 1
    # user_answer, correct_answer 변수 정하기.
    user_answer = input(f"Q.{self.question_number}: {current_question.text}?")
    correct_answer = current_question.answer
    # next_question 함수 내에서 정의되었으므로
    # 즉, quizbrain()객체의 속성이 아니므로
    # check_answer의 파라미터로 들어가는 위의 두 변수에는 self붙이지 X
    self.check_answer(user_answer, correct_answer)

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

  def check_answer(self, user_answer, correct_answer):
    if user_answer == correct_answer:
      #score은 quiz_brain()객체의 속성이기에 self붙임
      self.score += 1
    else:
      print(f"땡!! 정답은 {correct_answer}입니다.")
    print(f"현재 점수는 {self.score} / {self.question_number}입니다.")


quiz_bank= []
for data in question_data:
  data_text = data["text"]
  data_answer= data["answer"]
  quiz_bank.append(Quiz(data_text, data_answer))
#print(quiz_bank)

quiz_brain = Quiz_Brain(quiz_bank)

while quiz_brain.still_has_question():
  quiz_brain.next_question()
  print()

print(f"모든 문제를 풀었습니다. 최종 점수는 {quiz_brain.score} / {quiz_brain.question_number}입니다.")

[실행화면]

 

 

 

[최종화면]

아래의 재생버튼 ▶을 눌러서 실행해보세요