✅ 들어가기 앞서
팀프로젝트 발표를 위해 발표자료를 넘겨줘야해서 구현한 TextRPG의 전투 시스템을 구조 정리를 해보았다.
✅ 전투 흐름 요약 - Battle.cs
핵심 메서드 : Battle()
- while 루프를 이용해 플레이어 체력 > 0 && 몬스터 중 한 마리라도 살아있을 경우 전투
- 매 턴마다 PlayerTurn() -> MonsterTurn() 순으로 진행
PlayerTurn
- 몬스터 리스트 출력 + 번호 입력 유도
- int.TryParse()로 잘못된 입력 방지
- 선택된 몬스터를 AttackResult()로 전달
AttackResult
- 선택된 몬스터와의 전투 처리
- PlayerBasicAttck -> PlayerAttack 생성자로 전달
- Attack() 호출로 데미지/회피/치명타 처리
- 공격 결과 출력 및 사망 처리
MonsterTurn
- foreach로 살아있는 모든 몬스터가 한 번씩 플레이어를 공격
- MonsterBasicAttack -> MonsterAttack 생성자로 전달
- 몬스터에게 치명타는 없음, 데미지와 회피만 처리
✅ 공격 구조 - Attack.cs
인터페이스 : IAttack
- (int damage, bool isCritical, bool isMiss) 튜플로 반환
- 공격자는 플레이어든 몬스터든 동일한 구조
PlayerAttack
- 생성자에서 IDamageCalculator를 받음
- Attack(monster) 실행 시
- 플레이어 공격력, 몬스터 방어력을 계산기로 전달
- 데미지 결과를 몬스터 체력에 반영
MonsterAttack
- 구조는 PlayerAttack과 거의 비슷
- 공격 대상은 게임매니저를 통해 받은 플레이어값
- 몬스터에게 치명타 공격은 없음 (isCritical = false)
✅ 데미지 계산기 구조 - DamageCalculator.cs
인터페이스 : IDamageCalculator
- 공격력과 방어력을 받아옴
- (damage, isCritical, isMiss) 튜플로 반환
- 실제 계산 로직을 유연하게 분리 가능
PlayerBasicAttack
- 공격력의 10% 오차 반영
- 지정한 치명타 확률, 회피 확률 반영
- 최종 데미지와 치명타, 회피 여부 반환
MonsterBasicAttack
- PlayerBasicAttack과 거의 비슷
- 치명타는 제외 (isCritical = false)
✅ 정리 및 느낀점
공격과 계산을 인터페이스로 분리하여 사용하니 유지보수와 확장성 부분에서 확실이 좋은거 같고,
이후 기본공격 외에 스킬 공격과 같은 기능들도 쉽게 추가 가능해진 구조인거 같다.
객체지향 설계에 대해 조금 더 가까워진 느낌이다.