[TIL] 팀프로젝트 (TextRPG) 2/4

백성은·2025년 4월 23일

TIL

목록 보기
19/34

✅ 들어가기 앞서

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

✅ 전체 구조

  • Battle() : 전투 루프 시작
  • PlayerTurn() : 사용자 입력으로 몬스터 타겟 지정
  • AttackResult() : 지정된 몬스터 타겟 공격 및 출력
  • MonsterTurn() : 적 몬스터들이 순서대로 플레이어 공격

이때, 각 공격은 IAttack 인터페이스를 기반으로 공격하고, 플레이어와 몬스터 공격을 확장 가능하게 구현했다.

데미지 계산 구조

	public interface IDamageCalculator
	{
    	(int damage, bool isCritical) Calculate(int atk, int def);
	} //  데미지 계산 인터페이스
  • IDamageCalculator는 공격력과 방어력 받아와 데미지를 계산하는 인터페이스
	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);
    }
}
  • 오차 범위 10%를 적용하여 랜덤 데미지 설정
  • 치명타 확률 15퍼를 부여해 확률적으로 1.6배의 데미지
  • 계산된 데미지에서 방어력을 빼고 최종 데미지를 반환해줬다.

공격 구조

	public interface IAttack
	{
    	(int damage, bool isCritical) Attack(Monster monster);
	}
  • IAttack은 몬스터를 전달받아 데미지를 계산하고 반환하는 인터페이스.
	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);
    	}
	}
  • IDamageCalculator로 게산된 데미지와 크리티컬을 받아옴
  • 계산된 데미지를 실제 몬스터 체력에서 차감
  • 데미지와 크리티컬 여부를 튜플로 반환

✅ 후기

이번 전투 시스템을 만들면서 확장성을 생각해 인터페이스 기반으로 코드작성을 해보았는데 인터페이스를 처음으로 사용해봐서 조금 낯설고 개념적으로 어려운 부분이 있었지만 적용해보며 역할 분리와 코드구조가 유연해지는게 확실히 느껴졌다.

profile
게임 개발일지

0개의 댓글