내가 만드는 첫 번째 프로그램, 터미널에서 동작하는 퀴즈 게임입니다.
Python의 기본 문법과 객체 지향 프로그래밍(OOP)을 배우기 위한 실습 프로젝트
프로그램을 직접 처음부터 끝까지 구현하면서 코드 작성, 데이터 저장, 그리고 Git 버전 관리까지 경험합니다.
- 🎮 메뉴 기반 대화형 게임 - 사용자가 원하는 기능을 선택해서 실행
- 🔄 데이터 영속성 - 프로그램을 종료해도 퀴즈와 점수가
state.json에 저장됨 - 🏗️ 객체 지향 구조 -
Quiz와QuizGame클래스를 활용한 체계적 설계 - 🛡️ 견고한 예외 처리 - 사용자 입력 오류, 파일 손상, 종료 시그널에 대응
| 기능 | 설명 |
|---|---|
| 🎯 퀴즈 풀기 | 저장된 퀴즈를 풀고 정답 여부를 확인하며 점수를 계산 |
| ➕ 퀴즈 추가 | 새 퀴즈를 질문, 선택지, 정답, 힌트와 함께 등록 |
| 🗑️ 퀴즈 삭제 | 저장된 퀴즈를 목록에서 선택해 삭제 |
| 📋 퀴즈 목록 | 저장된 모든 퀴즈 제목을 확인 |
| 🏆 점수 확인 | 최고 점수와 최신 플레이 기록을 확인 |
| 📜 플레이 기록 | 전체 기록을 조회하고 필요 시 삭제 |
| ✨ 보너스 과제 선택 | 활성화할 추가 기능을 선택/해제 |
| 🚪 프로그램 종료 | 데이터를 저장하고 안전하게 종료 |
python main.py현재 state.json에 저장된 상태에 따라 메뉴 항목이 동적으로 변경됩니다.
기본적으로는 다음과 같은 메뉴가 표시됩니다:
============================================================
🎮 퀴즈 게임 메뉴 (퀴즈 6개, 최고점수 50점) 🎮
============================================================
1. 🎯 퀴즈 풀기
2. ➕ 퀴즈 추가
3. 🗑️ 퀴즈 삭제
4. 📋 퀴즈 목록
5. 🏆 최고 점수 확인
6. 📜 플레이 기록 보기
7. ✨ 보너스 과제 선택 (3개)
8. 🚪 종료
============================================================
선택: _
state.json현재 상태
- 퀴즈 6개
- 최고 점수 50점
- 플레이 기록 1개
- 선택된 보너스: 퀴즈 삭제, 점수 기록 히스토리, 문제 수 선택
- 번호를 입력하여 원하는 기능을 선택합니다.
- 각 기능의 안내에 따라 진행합니다.
- 프로그램을 종료하면 변경 내용이 자동 저장됩니다.
e1-2/
├── docs/
│ └── README.md # 이 파일
├── main.py # 프로그램의 메인 파일
├── quiz.py # Quiz 클래스 (개별 퀴즈 관리)
├── quiz_game.py # QuizGame 클래스 (게임 로직 및 저장소 관리)
├── state.json # 퀴즈 및 점수 데이터 저장 파일
└── .gitignore # Git에서 추적하지 않을 파일 목록
state.json에는 다음 데이터가 저장됩니다.
quizzes: 등록된 퀴즈 목록best_score: 전체 최고 점수history: 플레이 기록 리스트selected_bonus: 활성화된 보너스 과제 번호 리스트
현재 저장된 예시
{
"quizzes": [
{
"question": "파이썬은 몇 년에 만들어졌을까?",
"choices": ["1989년", "1991년", "1995년", "1999년"],
"answer": 1,
"hint": "파이썬은 1991년에 공식 발표되었습니다."
}
],
"best_score": 50,
"history": [
{
"timestamp": "2026-08-10 16:17:30",
"questions": 2,
"correct": 1,
"score": 50,
"hints_used": 0
}
],
"selected_bonus": [3, 4, 1]
}특징:
- UTF-8 인코딩으로 저장
- 프로그램 실행 시 자동 로드
- 파일이 없거나 손상되면 기본 데이터로 자동 복구
사용자 입력의 안정성을 위해 다음을 처리합니다:
- ✅ 입력 앞뒤 공백 자동 제거
- ✅ 숫자 입력 시 형식 오류 처리
- ✅ 허용 범위 밖 입력 거부
- ✅ 빈 입력 감지 및 재입력 안내
- ✅
Ctrl+C와 입력 스트림 종료 안전 처리 - ✅ 손상된 파일 자동 복구
- 랜덤 출제
- 퀴즈 풀기 시 문제를 랜덤하게 섞어 출제합니다.
- 문제 수 선택
- 풀 문제 개수를 직접 선택할 수 있습니다.
- 힌트 기능
- 풀기 중
h입력 시 힌트를 보여주고, 정답 번호도 함께 안내합니다. - 힌트 사용 시 점수에서 10점씩 감점됩니다.
- 퀴즈 삭제 기능
- 등록된 퀴즈를 삭제할 수 있으며, 삭제 후
state.json에 반영됩니다.
- 점수 기록 히스토리
- 완료한 게임 기록을 저장하고 전체 기록을 조회할 수 있습니다.
main.py는 게임 실행 흐름을 담당하는 진입점입니다.
QuizGame인스턴스를 생성하고state.json에서 데이터를 로드합니다.build_menu_options()로 동적 메뉴를 구성하며, 선택한 보너스 과제 상태에 따라 메뉴 항목을 추가합니다.render_menu()로 현재 퀴즈 수와 최고 점수를 포함한 메뉴를 출력합니다.get_user_choice()로 안정적인 숫자 입력을 받습니다.- 메뉴 항목은 다음 기능을 실행합니다:
play_quiz(): 퀴즈를 풀고 점수를 계산하며, 힌트 사용 시 감점 처리add_quiz(): 새로운 퀴즈를 추가하고state.json에 저장delete_quiz(): 저장된 퀴즈 삭제show_quiz_list(): 퀴즈 목록 출력show_scores(): 최고 점수 및 최근 플레이 기록 출력show_history(): 전체 기록 표시 및 기록 삭제 지원select_bonus_tasks(): 보너스 과제 선택/해제
- 종료 시
game.save_data()로 데이터를 안전하게 저장합니다.
quiz_game.py는 게임의 상태와 데이터를 저장/관리하는 핵심 클래스인 QuizGame을 구현합니다.
load_data()로state.json을 읽어와 퀴즈, 최고 점수, 플레이 기록, 선택된 보너스를 초기화합니다.save_data()로Quiz, 최고 점수, 히스토리, 보너스 선택 상태를 JSON으로 저장합니다.add_quiz()와delete_quiz()를 통해 퀴즈 추가/삭제 기능을 제공합니다.update_score()는 새로운 점수가 최고 점수를 갱신할 때만 변경합니다.record_history()는 게임 완료 후 날짜/시간, 문제 수, 정답 수, 점수, 힌트 사용 횟수를 기록합니다.get_all_quizzes(),get_best_score(),get_history(),get_selected_bonus(),quiz_count()등의 조회 메서드를 제공합니다.toggle_bonus_task()로 선택된 보너스 과제를 켜고 끌 수 있습니다.
quiz.py는 개별 퀴즈 데이터를 관리하는 Quiz 클래스를 제공합니다.
question,choices,answer,hint속성을 가진 퀴즈 객체를 정의합니다.display()로 문제와 선택지를 출력합니다.is_correct()로 사용자가 고른 번호가 정답인지 확인합니다.get_correct_answer_text()로 정답 텍스트를 가져옵니다.get_hint_text()로 힌트를 반환합니다.to_dict()/from_dict()로 JSON 저장용 딕셔너리 변환을 지원합니다。
- ✅ Git 기본 명령어(init, add, commit, push, pull)
- ✅ 브랜치 생성 및 병합
- ✅ 원격 저장소 관리
* 686f38e (HEAD -> main, origin/b1lyh, b1lyh) Git & 버전 관리 리드미에 추가
* c267ca5 보너스 과제 번호 부여
* b5a2f34 (origin/main, origin/HEAD) README에 소스 기능 추가
* dc43c1e 보너스과제 추가
* bd2c83a Merge pull request #1 from yhlee53/brLYH
|\
| * 9942078 (origin/brLYH) 보너스 기능 구현
* | 71d6ef0 Fix formatting of quiz deletion option in README
* | 629555d 초기저장
|/
* c44a352 초기
% git clone https://github.com/yhlee53/codyssey_e1_2.git
'codyssey_e1_2'에 복제합니다...
remote: Enumerating objects: 52, done.
remote: Counting objects: 100% (52/52), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 52 (delta 22), reused 41 (delta 14), pack-reused 0 (from 0)
오브젝트를 받는 중: 100% (52/52), 24.38 KiB | 12.19 MiB/s, 완료.
델타를 알아내는 중: 100% (22/22), 완료.