38 — 퀴즈 — 파일의 문제
퀴즈는 데이터를 도는 반복입니다. 한 라운드마다 문제 하나를 보여 주고 답을 읽은 다음 점수에 더합니다. 14 가이드는 기록 하나를 저장했고, 이 가이드는 문제를 JSON 파일에 두어 퀴즈를 바꾸려면 코드가 아니라 데이터를 고치게 합니다. 메뉴 반복은 26 가이드의 것을 방향 대신 선택지에 쓴 것입니다.
단계
questions.json— 문제 딕셔너리들의 목록을 만듭니다. 각 딕셔너리는question과options, 그리고 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에서 줄 하나입니다.14 가이드의
json읽기로 문제를 불러옵니다. 파일에 목록이 있으므로json읽기는 딕셔너리들의 목록을 돌려줍니다:
실행해 보기 →파일 사용 최신 문제들 = json읽기("questions.json") 말해 f"문제 {len(문제들)}개를 불러왔습니다"nme 실행 quiz.ko를 실행하면문제 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이 필요합니다.전체 게임은 그 반복을
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): " 말해 "게임에 참여해 주셔서 감사합니다, " + 이름 + "님!"실행합니다. 파이프 입력으로 한 라운드를 진행합니다 — 이름, 각 문제에
1, 그다음no:printf '민수\n1\n1\n1\nno\n' | nme 실행 quiz.koNME 퀴즈에 오신 것을 환영합니다! 이름을 입력하세요: 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으로 답하면 만점이 됩니다.영어 쌍둥이
quiz.nme는use file latest,json_load,ask,show로 같은 게임을 씁니다. 답이 숫자라서 두 언어에서 같은 파이프 입력이 동작합니다.
직접 해보기
questions.json을 여러분만의 문제 네 개로 바꾸고 각각 answer가 맞는
선택지를 가리키게 하세요. 그런 다음 quiz.ko.nme를 다시 실행해 정답
번호로 답하면 점수가 100%가 되어야 합니다.
배운 것
- JSON 딕셔너리 목록은 문제 은행 전체이고,
json읽기가 리스트로 돌려줍니다. enumerate(q["options"])가 선택지에 표시 번호를 매깁니다.- 저장된
answer는 0부터, 플레이어의 선택은 1부터 셉니다. while 다시 == "yes":가 플레이어가 퀴즈 전체를 다시 하게 합니다.