[C++ 프로그램] 디자인 패턴을 적용한 Text RPG
디자인 패턴을 적용한 Text RPG
RPG 게임에서 일부 모듈들을 구현해보는 연습을 하기 위해서, 텍스트 기반 RPG 게임을 가정해 C++로 일부 기능 몇가지를 디자인 패턴을 사용해 구현해보았습니다.
플레이어 캐릭터는 여러 상태를 가질 수 있고, 상태에 따라 다른 행동을 사용해야하므로, 상태 패턴을 적용해 상태에 따라 행동이 달라질 수 있도록 구현했습니다.
상태 패턴으로 적용하면서 if-else
또는 switch-case
를 사용하지 않게되어 코드의 가독성이 높아지고 확장성이 증가됐습니다.
플레이어 캐릭터는 다양한 무기를 장착할 수 있으며, 무기에 따라 공격 방식이 달라질 수 있으므로, 전략 패턴으로 무기를 구현했습니다.
전략 패턴으로 적용하면서 if-else
를 사용하지 않고 각 무기의 공격 방식을 독립적으로 정의했기 때문에 변경이 용이해졌고, 새로운 무기를 추가해도 기존 코드에 영향을 주지 않은 상태에서 확장이 가능해졌습니다.
전투의 기본적인 흐름은 일정할 수 있지만, 특정 세부 사항이 다를 수 있기 때문에 템플릿 메서드 패턴을 사용해 전투 시나리오를 구현했습니다.
전투의 공통적인 로직을 템플릿 메서드로 정의하고, 각 전투 유형에 맞게 특정 행동을 오버라이드 할 수 있게되어 중복이 줄고, 코드 재사용성이 높아졌습니다.
아이템은 여러 속성(이름, 체력회복량, 마나회복량, 공격력, 방어력 등)을 가질 수 있기 때문에 복잡한 생성과정이 필요해지기 때문에 빌더 패턴을 사용해 구현했습니다.
결과적으로 빌더 패턴을 통해 단순하게 생성자를 호출하는 방법보다 가독성이 좋고, 생성 로직을 모듈화할 수 있게되어 유지보수가 쉬워졌습니다.
자세한 코드가 담긴 깃허브 레포지토리 링크입니다.
해당 링크의 README
에 클래스에 대한 간략한 설명을 적어두었습니다.
구현한 코드를 예시로 사용해본 출력입니다.
=== 전투 과정 (템플릿 메서드 패턴) ===
몬스터가 나타났습니다.
플레이어가 행동합니다.
[NormalState] 플레이어가 공격합니다.
Sword 공격
몬스터가 행동합니다.
전투 종료
몬스터가 나타났습니다.
플레이어가 행동합니다.
[NormalState] 플레이어가 공격합니다.
Sword 공격
몬스터가 행동합니다.
전투 종료
몬스터가 나타났습니다.
플레이어가 행동합니다.
[NormalState] 플레이어가 공격합니다.
Sword 공격
NormalState에서 BerserkState로 변경됩니다.
몬스터가 행동합니다.
전투 종료
=== 전투 과정 (템플릿 메서드 패턴) ===
보스가 나타났습니다.
플레이어가 행동합니다.
[BerserkState] 플레이어가 공격합니다.
Sword 공격
Sword 공격
보스가 강력한 스킬을 사용합니다.
전투 종료
=== 아이템 생성 (빌더 패턴) ===
아이템: 기본 회복 물약
HP 회복: 50, MP 회복: 20
공격력 증가: 0, 방어력 증가: 0
아이템: 철검
HP 회복: 0, MP 회복: 0
공격력 증가: 10, 방어력 증가: 2
댓글남기기