🗺️
실습 프로젝트 (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 와 동일▶ 실행 결과
(예제 참고)