needmoreeasy EN 한국어
배우기

38 — 퀴즈 — 파일의 문제

★★★★☆ (4/5)게임/데이터
선수 지식
14 — JSON, 26 — 모험
결과물
JSON 파일에서 문제를 불러와 채점하고 결과를 알려 주는 객관식 퀴즈

퀴즈는 데이터를 도는 반복입니다. 한 라운드마다 문제 하나를 보여 주고 답을 읽은 다음 점수에 더합니다. 14 가이드는 기록 하나를 저장했고, 이 가이드는 문제를 JSON 파일에 두어 퀴즈를 바꾸려면 코드가 아니라 데이터를 고치게 합니다. 메뉴 반복은 26 가이드의 것을 방향 대신 선택지에 쓴 것입니다.

단계

  1. questions.json — 문제 딕셔너리들의 목록을 만듭니다. 각 딕셔너리는 questionoptions, 그리고 0부터 세는 정답 위치인 answer를 가집니다:

    [
      {"question": "5 + 3은 얼마인가요?", "options": ["6", "7", "8", "9"], "answer": 2},
      {"question": "하늘은 무슨 색인가요?", "options": ["초록", "파랑", "빨강", "노랑"], "answer": 1},
      {"question": "강아지는 다리가 몇 개인가요?", "options": ["2", "3", "4", "5"], "answer": 2}
    ]
    
    실행해 보기 →

    "answer": 2는 세 번째 선택지, "8"을 뜻합니다. 파일을 데이터만 담게 두면 새 문제는 JSON에서 줄 하나입니다.

  2. 14 가이드의 json읽기로 문제를 불러옵니다. 파일에 목록이 있으므로 json읽기는 딕셔너리들의 목록을 돌려줍니다:

    파일 사용 최신
    문제들 = json읽기("questions.json")
    말해 f"문제 {len(문제들)}개를 불러왔습니다"
    
    실행해 보기 →

    nme 실행 quiz.ko를 실행하면 문제 3개를 불러왔습니다가 출력됩니다.

  3. for q in 문제들: 반복이 각 딕셔너리를 방문하고, enumerate가 선택지에 번호를 매깁니다. 물어봐가 답을 읽고, if가 저장된 위치와 비교합니다:

    파일 사용 최신
    문제들 = json읽기("questions.json")
    점수 = 0
    for q in 문제들:
        말해 q["question"]
        for i, 선택지 in enumerate(q["options"]):
            말해 str(i + 1) + ". " + 선택지
        물어봐 answer, "정답 번호를 입력하세요: "
        if answer == str(q["answer"] + 1):
            점수 = 점수 + 1
    
    실행해 보기 →

    정답은 0부터 세어 저장되지만 플레이어는 1부터 세므로, 비교 양쪽에 + 1이 필요합니다.

  4. 전체 게임은 그 반복을 while 다시 == "yes":로 감싸 끝난 퀴즈를 다시 시작할 수 있게 하고, 틀린 문제를 셉니다. quiz.ko.nme로 저장합니다:

    # 퀴즈: 질문이 JSON 파일에서 옵니다.
    # 실행: nme 실행 quiz.ko
    # questions.json 파일이 같은 폴더에 있어야 합니다.
    
    파일 사용 최신
    
    말해 "NME 퀴즈에 오신 것을 환영합니다!"
    물어봐 이름, "이름을 입력하세요: "
    문제들 = json읽기("questions.json")
    
    다시 = "yes"
    while 다시 == "yes":
        점수 = 0
        번호 = 0
        틀린것 = []
    
        for q in 문제들:
            번호 = 번호 + 1
            말해 ""
            말해 f"{번호} / {len(문제들)}번 문제: {q['question']}"
            for i, 선택지 in enumerate(q["options"]):
                말해 f"  {i + 1}. {선택지}"
            물어봐 answer, "정답 번호를 입력하세요: "
            if answer == str(q["answer"] + 1):
                말해 "정답입니다!"
                점수 = 점수 + 1
            else:
                말해 "틀렸습니다. 정답은 " + str(q["answer"] + 1) + "번이에요."
                틀린것.append(번호)
    
        퍼센트 = 점수 * 100 // len(문제들)
        말해 ""
        말해 f"{이름}님: {len(문제들)}문제 중 {점수}개 정답 ({퍼센트}%)."
        if 틀린것:
            말해 "틀린 문제: " + str(틀린것)
        if 퍼센트 == 100:
            말해 "만점입니다!"
        elif 퍼센트 >= 70:
            말해 "잘했어요!"
        elif 퍼센트 >= 50:
            말해 "괜찮아요. 계속 연습하세요!"
        else:
            말해 "문제를 잘 읽고 다시 도전해 보세요."
    
        물어봐 다시, "다시 할까요? (yes/no): "
    
    말해 "게임에 참여해 주셔서 감사합니다, " + 이름 + "님!"
    
    실행해 보기 →
  5. 실행합니다. 파이프 입력으로 한 라운드를 진행합니다 — 이름, 각 문제에 1, 그다음 no:

    printf '민수\n1\n1\n1\nno\n' | nme 실행 quiz.ko
    
    NME 퀴즈에 오신 것을 환영합니다!
    이름을 입력하세요: 
    1 / 3번 문제: 5 + 3은 얼마인가요?
      1. 6
      2. 7
      3. 8
      4. 9
    정답 번호를 입력하세요: 틀렸습니다. 정답은 3번이에요.
    
    2 / 3번 문제: 하늘은 무슨 색인가요?
      1. 초록
      2. 파랑
      3. 빨강
      4. 노랑
    정답 번호를 입력하세요: 틀렸습니다. 정답은 2번이에요.
    
    3 / 3번 문제: 강아지는 다리가 몇 개인가요?
      1. 2
      2. 3
      3. 4
      4. 5
    정답 번호를 입력하세요: 틀렸습니다. 정답은 3번이에요.
    
    민수님: 3문제 중 0개 정답 (0%).
    틀린 문제: [1, 2, 3]
    문제를 잘 읽고 다시 도전해 보세요.
    다시 할까요? (yes/no): 게임에 참여해 주셔서 감사합니다, 민수님!
    

    여기서 1 답은 셋 다 틀리므로 점수는 0이고 틀린 목록에 모든 문제가 듭니다. 3, 2, 3으로 답하면 만점이 됩니다.

  6. 영어 쌍둥이 quiz.nmeuse file latest, json_load, ask, show로 같은 게임을 씁니다. 답이 숫자라서 두 언어에서 같은 파이프 입력이 동작합니다.

직접 해보기

questions.json을 여러분만의 문제 네 개로 바꾸고 각각 answer가 맞는 선택지를 가리키게 하세요. 그런 다음 quiz.ko.nme를 다시 실행해 정답 번호로 답하면 점수가 100%가 되어야 합니다.

배운 것

  • JSON 딕셔너리 목록은 문제 은행 전체이고, json읽기가 리스트로 돌려줍니다.
  • enumerate(q["options"])가 선택지에 표시 번호를 매깁니다.
  • 저장된 answer는 0부터, 플레이어의 선택은 1부터 셉니다.
  • while 다시 == "yes":가 플레이어가 퀴즈 전체를 다시 하게 합니다.

GitHub에서 이 문서 보기