Skip to content

About

codyssey 과제 e1-2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

퀴즈 게임 (Quiz Game)

내가 만드는 첫 번째 프로그램, 터미널에서 동작하는 퀴즈 게임입니다.

🎯 프로젝트 개요

Python의 기본 문법과 객체 지향 프로그래밍(OOP)을 배우기 위한 실습 프로젝트

프로그램을 직접 처음부터 끝까지 구현하면서 코드 작성, 데이터 저장, 그리고 Git 버전 관리까지 경험합니다.

주요 특징

  • 🎮 메뉴 기반 대화형 게임 - 사용자가 원하는 기능을 선택해서 실행
  • 🔄 데이터 영속성 - 프로그램을 종료해도 퀴즈와 점수가 state.json에 저장됨
  • 🏗️ 객체 지향 구조 - Quiz와 QuizGame 클래스를 활용한 체계적 설계
  • 🛡️ 견고한 예외 처리 - 사용자 입력 오류, 파일 손상, 종료 시그널에 대응

✨ 주요 기능

기능 설명
🎯 퀴즈 풀기 저장된 퀴즈를 풀고 정답 여부를 확인하며 점수를 계산
➕ 퀴즈 추가 새 퀴즈를 질문, 선택지, 정답, 힌트와 함께 등록
🗑️ 퀴즈 삭제 저장된 퀴즈를 목록에서 선택해 삭제
📋 퀴즈 목록 저장된 모든 퀴즈 제목을 확인
🏆 점수 확인 최고 점수와 최신 플레이 기록을 확인
📜 플레이 기록 전체 기록을 조회하고 필요 시 삭제
✨ 보너스 과제 선택 활성화할 추가 기능을 선택/해제
🚪 프로그램 종료 데이터를 저장하고 안전하게 종료

🚀 실행 방법

1단계: 프로그램 실행

python main.py

2단계: 메뉴 선택

현재 state.json에 저장된 상태에 따라 메뉴 항목이 동적으로 변경됩니다. 기본적으로는 다음과 같은 메뉴가 표시됩니다:

============================================================
       🎮 퀴즈 게임 메뉴 (퀴즈 6개, 최고점수 50점) 🎮
============================================================
1. 🎯 퀴즈 풀기
2. ➕ 퀴즈 추가
3. 🗑️ 퀴즈 삭제
4. 📋 퀴즈 목록
5. 🏆 최고 점수 확인
6. 📜 플레이 기록 보기
7. ✨ 보너스 과제 선택 (3개)
8. 🚪 종료
============================================================

선택: _

state.json 현재 상태

  • 퀴즈 6개
  • 최고 점수 50점
  • 플레이 기록 1개
  • 선택된 보너스: 퀴즈 삭제, 점수 기록 히스토리, 문제 수 선택

3단계: 기능 이용

  • 번호를 입력하여 원하는 기능을 선택합니다.
  • 각 기능의 안내에 따라 진행합니다.
  • 프로그램을 종료하면 변경 내용이 자동 저장됩니다.

📁 프로젝트 구조

e1-2/
├── docs/
│   └── README.md        # 이 파일
├── main.py              # 프로그램의 메인 파일
├── quiz.py              # Quiz 클래스 (개별 퀴즈 관리)
├── quiz_game.py         # QuizGame 클래스 (게임 로직 및 저장소 관리)
├── state.json           # 퀴즈 및 점수 데이터 저장 파일
└── .gitignore           # Git에서 추적하지 않을 파일 목록

🗂️ state.json 구조

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와 입력 스트림 종료 안전 처리
  • ✅ 손상된 파일 자동 복구

보너스 과제 (선택)

  1. 랜덤 출제
  • 퀴즈 풀기 시 문제를 랜덤하게 섞어 출제합니다.
  1. 문제 수 선택
  • 풀 문제 개수를 직접 선택할 수 있습니다.
  1. 힌트 기능
  • 풀기 중 h 입력 시 힌트를 보여주고, 정답 번호도 함께 안내합니다.
  • 힌트 사용 시 점수에서 10점씩 감점됩니다.
  1. 퀴즈 삭제 기능
  • 등록된 퀴즈를 삭제할 수 있으며, 삭제 후 state.json에 반영됩니다.
  1. 점수 기록 히스토리
  • 완료한 게임 기록을 저장하고 전체 기록을 조회할 수 있습니다.

소스 기능 요약

main.py 요약

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 요약

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.py는 개별 퀴즈 데이터를 관리하는 Quiz 클래스를 제공합니다.

  • question, choices, answer, hint 속성을 가진 퀴즈 객체를 정의합니다.
  • display()로 문제와 선택지를 출력합니다.
  • is_correct()로 사용자가 고른 번호가 정답인지 확인합니다.
  • get_correct_answer_text()로 정답 텍스트를 가져옵니다.
  • get_hint_text()로 힌트를 반환합니다.
  • to_dict() / from_dict()로 JSON 저장용 딕셔너리 변환을 지원합니다。

Git & 버전 관리

  • ✅ Git 기본 명령어(init, add, commit, push, pull)
  • ✅ 브랜치 생성 및 병합
  • ✅ 원격 저장소 관리

Git 이력

* 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), 완료.

About

codyssey 과제 e1-2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages