← 파이썬 강의 목록으로
🗺️
실습 프로젝트 (Practice) · ★★★
분기·HP·다중 엔딩

Lv3 · 텍스트 어드벤처

장면-선택지로 진행되는 분기형 텍스트 어드벤처. HP/아이템 상태와 다중 엔딩을 구현합니다.

dict상태 관리분기
소요 시간
5~8시간
난이도
📊 중급 종합
선수 조건
🎯 중급 6, 7주차
결과물
장면 그래프와 상태 머신

이 강의에서 배우는 것

  • 1장면 dict 로 시나리오 그래프 표현
  • 2HP/아이템 상태 머신을 관리한다
  • 3엔딩을 분기와 자원으로 분리

프로젝트 개요

  • 최소 5장면, 분기 3회 이상
  • HP/아이템 등 상태 관리
  • 엔딩 2개 이상 (GOOD/BAD/NEUTRAL 등)

도전 과제

  • 진행 저장/불러오기
  • 시나리오 편집기
  • 외부 JSON 시나리오

채점 체크리스트

  • 분기 정확
  • HP 0 시 게임 오버
  • 엔딩 도달

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

solution.py전체 동작 코드 (인라인 시나리오)
CODE
"""텍스트 어드벤처 — 분기 + HP"""

SCENES = {
    "start": {
        "text": "어두운 숲에 들어섰다. 길은 둘로 갈라진다.",
        "choices": {
            "1": {"label": "왼쪽으로", "next": "left", "effect": {"hp": 0}},
            "2": {"label": "오른쪽으로", "next": "right", "effect": {"hp": 0}},
        },
    },
    "left": {
        "text": "늑대를 만났다! 싸울까 도망갈까?",
        "choices": {
            "1": {"label": "싸운다", "next": "fight", "effect": {"hp": -30}},
            "2": {"label": "도망친다", "next": "escape", "effect": {"hp": -10}},
        },
    },
    "right": {
        "text": "낡은 오두막을 발견. 들어갈까?",
        "choices": {
            "1": {"label": "들어간다", "next": "treasure", "effect": {"hp": 0, "item": "검"}},
            "2": {"label": "지나친다", "next": "lost", "effect": {"hp": 0}},
        },
    },
    "fight": {"text": "늑대를 물리치고 보물 발견! 🏆", "ending": True, "result": "GOOD"},
    "escape": {"text": "안전하게 마을로. 평범한 결말.", "ending": True, "result": "NEUTRAL"},
    "treasure": {"text": "오두막에서 검을 얻고 영웅이 됨! 🏆", "ending": True, "result": "GOOD"},
    "lost": {"text": "숲에서 길을 잃고 사라짐...", "ending": True, "result": "BAD"},
}

def main():
    state = {"hp": 100, "items": []}
    current = "start"
    while True:
        scene = SCENES[current]
        print(f"\n{scene['text']}")
        print(f"[HP: {state['hp']}, 아이템: {state['items']}]")

        if scene.get("ending"):
            print(f"\n=== 엔딩: {scene['result']} ===")
            break

        for k, ch in scene["choices"].items():
            print(f"  {k}. {ch['label']}")
        pick = input("> ").strip()
        if pick not in scene["choices"]:
            print("잘못된 선택"); continue

        choice = scene["choices"][pick]
        effect = choice.get("effect", {})
        state["hp"] += effect.get("hp", 0)
        if "item" in effect:
            state["items"].append(effect["item"])
        if state["hp"] <= 0:
            print("\n=== HP 0! 게임 오버 ===")
            break
        current = choice["next"]

if __name__ == "__main__":
    main()
▶ 실행 결과
어두운 숲에 들어섰다. 길은 둘로 갈라진다.
[HP: 100, 아이템: []]
  1. 왼쪽으로
  2. 오른쪽으로
> 2

낡은 오두막을 발견. 들어갈까?
[HP: 100, 아이템: []]
  1. 들어간다
  2. 지나친다
> 1

오두막에서 검을 얻고 영웅이 됨! 🏆
[HP: 100, 아이템: ['검']]

=== 엔딩: GOOD ===

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

프로젝트 구현

목표: 위 사양대로 직접 작성한다.

요구사항
  • SCENES dict
  • 상태 관리
  • 엔딩 2개 이상
💡 힌트

scene.get('ending') 으로 종료 체크

입출력 예시
=== 엔딩: GOOD ===
채점
  • · 분기 동작
  • · HP/아이템 누적
정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일
▶ 실행 결과
(예제 참고)
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗