순수 C++로 구현한 콘솔 기반 자동 턴제 전투 시뮬레이터입니다.
Unity와 C# 중심의 개발 경험에서 확장하여, 게임 엔진 없이 C++만으로 전투 흐름, 유닛 구조, 스킬 선택, 데미지 계산, 승패 판정, 전투 결과 통계를 구현하는 것을 목표로 진행한 포트폴리오용 서브 프로젝트입니다.
- 프로젝트명: C++ Turn Battle Simulator
- 개발 형태: 개인 개발
- 개발 언어: C++
- 개발 환경: Visual Studio 2022
- 실행 형태: Windows Console Application
- 프로젝트 목적: C++ 기본기와 게임 전투 로직 구조화 연습
아군 3명과 적 3명이 자동으로 턴제 전투를 진행합니다.
각 유닛은 HP, 공격력, 방어력, 속도 스탯을 가지며, 한쪽 팀의 모든 유닛이 전투 불능 상태가 되면 전투가 종료됩니다.
매 턴마다 살아있는 유닛만 행동 순서에 포함하고, 속도 스탯이 높은 유닛부터 행동하도록 정렬합니다.
단일 공격 시 살아있는 상대 유닛 중 현재 HP가 가장 낮은 유닛을 우선 공격합니다.
상황에 따라 스킬을 자동으로 선택합니다.
- 상대가 2명 이상 살아있으면 Whirlwind 사용
- 상대가 1명 남고 HP가 30 이하이면 Power Strike 사용
- 그 외에는 Basic Attack 사용
공격자, 방어자, 스킬 정보를 기반으로 최종 데미지를 계산합니다.
최종 데미지 = 공격자 공격력 + 스킬 위력 - 방어자 방어력
최소 데미지 = 1전투 시작, 턴 시작, 스킬 사용, 피해량, 남은 HP, 사망 처리, 전투 종료를 콘솔 로그로 출력합니다.
전투 종료 후 BattleResult를 통해 유닛별 전투 통계를 출력합니다.
- 승리 팀
- 총 턴 수
- 유닛별 준 피해량
- 유닛별 받은 피해량
- 유닛별 처치 수
TurnBattleCpp/
├─ main.cpp
├─ Domain/
│ ├─ TeamType.h
│ ├─ SkillTargetType.h
│ ├─ Unit.h
│ ├─ Unit.cpp
│ ├─ Skill.h
│ └─ Skill.cpp
├─ Battle/
│ ├─ DamageCalculator.h
│ ├─ DamageCalculator.cpp
│ ├─ TurnOrderCalculator.h
│ ├─ TurnOrderCalculator.cpp
│ ├─ BattleLogger.h
│ ├─ BattleLogger.cpp
│ ├─ BattleSimulator.h
│ └─ BattleSimulator.cpp
└─ Result/
├─ BattleResult.h
└─ BattleResult.cpp전투에 참여하는 유닛 1명을 표현하는 클래스입니다.
주요 역할:
- 유닛 기본 정보 관리
- 현재 HP 관리
- 피해 적용
- 회복 처리
- 생존 여부 판단
전투 중 사용할 스킬 데이터를 표현하는 클래스입니다.
주요 역할:
- 스킬 ID 관리
- 스킬 이름 관리
- 스킬 위력 관리
- 스킬 대상 타입 관리
공격자, 방어자, 스킬 정보를 기반으로 최종 데미지를 계산하는 클래스입니다.
전투 진행 클래스가 데미지 계산식까지 직접 처리하지 않도록 계산 책임을 분리했습니다.
전투에 참여한 유닛 중 살아있는 유닛만 골라 속도 기준으로 행동 순서를 계산하는 클래스입니다.
전투 진행 중 발생하는 주요 이벤트를 콘솔에 출력하는 클래스입니다.
전투 진행 로직과 출력 로직을 분리하기 위해 사용했습니다.
전투 전체 흐름을 관리하는 핵심 클래스입니다.
주요 역할:
- 전투 시작
- 턴 반복
- 행동 순서 계산 요청
- 자동 스킬 선택
- 자동 타겟 선택
- 공격 실행
- 승패 판정
- 전투 결과 생성
전투 종료 후 결과와 유닛별 통계를 저장하는 클래스입니다.
전투 진행과 결과 데이터 수집 책임을 분리하기 위해 사용했습니다.
한쪽 팀의 모든 유닛이 전투 불능 상태가 되면 전투가 종료되는지 확인했습니다.
살아있는 유닛을 speed 기준으로 정렬하여 속도가 높은 유닛부터 행동하는지 확인했습니다.
전투 중 HP가 0이 된 유닛은 이후 행동 순서에서 제외되는지 확인했습니다.
SkillTargetType::AllEnemies 스킬 사용 시 살아있는 모든 상대 유닛에게 피해가 적용되는지 확인했습니다.
방어력이 공격력보다 높아도 최소 1의 피해가 적용되는지 확인했습니다.
전투 종료 후 유닛별 준 피해량, 받은 피해량, 처치 수가 BattleResult에 정상 기록되는지 확인했습니다.
Turn Battle Simulator Start!
============================
Battle Start
============================
---------- Turn 1 ----------
Archer uses area skill Whirlwind on Goblin. Damage: 13
Goblin HP: 37 / 50
...
============================
Battle End
============================
Winner: Player
============================
Battle Result
============================
Winner: Player
Total Turns: 2
Knight
Damage Dealt: 50
Damage Taken: 5
Kills: 2이 프로젝트는 그래픽이나 엔진 기능보다 C++ 기반 게임 로직 구현에 집중했습니다.
전투 흐름, 유닛 상태, 스킬 데이터, 데미지 계산, 턴 순서 계산, 로그 출력, 결과 통계를 각각의 책임으로 분리하여 작은 규모의 전투 시스템을 구조화하는 것을 목표로 했습니다.
- C++
- STL vector
- STL unordered_map
- enum class
- class / struct
- header / cpp file separation
- pointer / reference
- console logging