이전 게시글에 이어서 TextRPG 구조를 팀원들과 구성한뒤 역할을 나누었는데 내가 맡은 역할은 게임에서 몬스터와 전투를 치르게 되는 전투시스템을 맡게 되었다.


이때, 각 공격은 IAttack 인터페이스를 기반으로 공격하고, 플레이어와 몬스터 공격을 확장 가능하게 구현했다.
public interface IDamageCalculator
{
(int damage, bool isCritical) Calculate(int atk, int def);
} // 데미지 계산 인터페이스
public class PlayerBasicAttack : IDamageCalculator
{
private Random random = new Random();
private double criticalChance = 0.15;
private double criticalHit = 1.6;
public (int damage, bool isCritical) Calculate(int atk, int def)
{
int error = (int)Math.Ceiling(atk * 0.1);
int min = atk - error;
int max = atk + error;
if (min < 0) min = 0;
int damage = random.Next(min, max + 1);
bool isCritical = random.NextDouble() < criticalChance;
if (isCritical) damage = (int)Math.Ceiling(damage * criticalHit);
int finalDamage = damage - def;
if (finalDamage < 0) finalDamage = 0;
return (finalDamage, isCritical);
}
}
public interface IAttack
{
(int damage, bool isCritical) Attack(Monster monster);
}
public class PlayerAttack : IAttack
{
private readonly IDamageCalculator calculator;
public PlayerAttack(IDamageCalculator calculator)
{
this.calculator = calculator;
}
public (int damage, bool isCritical) Attack(Monster monster)
{
var (damage, isCritical) = calculator.Calculate(GameManager.Instance().player.TotalAttack, monster.def);
monster.health -= damage;
return (damage, isCritical);
}
}
이번 전투 시스템을 만들면서 확장성을 생각해 인터페이스 기반으로 코드작성을 해보았는데 인터페이스를 처음으로 사용해봐서 조금 낯설고 개념적으로 어려운 부분이 있었지만 적용해보며 역할 분리와 코드구조가 유연해지는게 확실히 느껴졌다.