C#/Study

[C#] TextRpg 팀 프로젝트 중, 직업 / 스탯 별 공격력 적용

Jee-U 2025. 2. 13. 20:35

 

직업은 전사(Worrior), 도적(Rogue), 마법사(Wizzard) 총 3개이며

스탯은 힘(str), 민첩(dex), 지능(int), 행운(luk) 총 4개이다.

 - int의 경우 이미 정수로 사용되고 있어 거기에 e를 더 붙여 변수로서는 inte로 사용중이다

public class Player
{
	public JobType job      { get; set; }

    public int str          { get; private set; }
    public int dex          { get; private set; }
    public int inte         { get; private set; }
    public int luk          { get; private set; }
    public float damage     { get; private set; }
    public float baseDamage { get; private set; }
    public float defense    { get; private set; }

    private Random random = new Random();

    public Player()
    {
    	
        str = 0; // 힘
        dex = 0; // 민첩
        inte = 0; // 지능
        luk = 0; // 행운
        damage = 20; // 공격력
        defense = 5; // 방어력
    }

JobType은 enum으로 관리하고있으며 enum을 따로 관리하는 클래스에 넣어두었다.

 - 대부분의 직업/아이템명/씬/마을명 등을 전부 enum으로 관리하였다.

    public enum JobType
    {
        Warrior, // 전사
        Rogue, // 도적
        Wizard // 마법사
    }

 

 

우리는 직업이 있기때문에 직업별 차이를 두기 위해서 공격력에 영향을 미치는 스탯을 다르게 설정하기 위해 각 직업에 맞는 스탯별 데미지 비율을 정하고, 비율에 따라 기존 공격력에서 스탯의 영향을 받아 추가로 더해지게 해주었다.

  • 전사 : str * 1.5 / dex * 0.5 / int * 0.1
  • 도적 : str * 0.5 / dex * 1.5 / int * 0.1
  • 마법사 : str * 0.1\ / dex * 0.5 / int * 0.1
	public class Player
    
		public int TotalDamage 
        {
            get
            {
                var itemStats = GameManager.Instance.player.inventory.ItemStat();

                float baseDamage = damage;
                float bonusDamage = 0;

                switch (job)
                {
                    case JobType.Warrior:
                        bonusDamage += (((float)itemStats.sumStr * 1.5f) + ((float)itemStats.sumDex * 0.5f) + ((float)itemStats.sumInte * 0.1f));
                        break;

                    case JobType.Rogue:
                        bonusDamage += (((float)itemStats.sumStr * 0.5f) + ((float)itemStats.sumDex * 1.5f) + ((float)itemStats.sumInte * 0.1f));
                        break;

                    case JobType.Wizard:
                        bonusDamage += (((float)itemStats.sumStr * 0.1f) + ((float)itemStats.sumDex * 0.5f) + ((float)itemStats.sumInte * 1.5f));
                        break;
                }

                return (int)(baseDamage + bonusDamage + GameManager.Instance.player.inventory.WeaponStat());
            }
         }

- 플레이어 기본 스탯은 Player 클래스에서 관리, 장비에 대한 스탯은 Inventory 클래스에서 관리

- 아이템 스탯의 경로를 매번 써주기엔 번거로워 var를 사용하여 itemStats 변수로 만들어주었다.(다른곳에서도 사용)

데미지 계산은 기존 데미지(baseDamage)와 직업별로 추가된 데미지(bonusDamage), 무기 공격력(WeaponStat)을 더한 값을 TotalDamage로 하였다.

Switch / Case 문을 사용하여 JobType에 따른 직업별 데미지 계산식을 적용하여 스탯별 가중치를 다르게 설정하였으며, 계산이 실수값이므로 float 형으로 처리한 후 최종적으로 int로 반환되게 해주었다.

 

그리고 직업에 영향받는 스탯으로 포함되지 않은 luk, 행운은 직업 공통으로 적용되는데

luk 스탯에 따라 크리티컬이 터지거나, 도망갈 수 있는 확률을 높여주는 스탯으로 지정하였는데

도망 확률은 전투에서 도망을 아얘 없애면서 삭제해버렸다.

        public int LuckyDamage()
        {
            float finalDamage = TotalDamage;

            // 크리티컬
            float critical = luk * 0.3f / 100f; // Luk 10이면 3% 확률 회피
            if (random.NextDouble() < critical)
            {
                finalDamage *= 1.5f;
            }

            return (int)finalDamage;
        }

도망 기능을 없애면서 도망에 관한 코드는 삭제하였으며 코드 자체는 비슷한데 return값만 0으로 하였었다.

(회피 시 데미지 0 적용)

 


 

 

public class StatScene : Scene
{
	public override void Update()
    {
    	var itemStats = GameManager.Instance.player.inventory.ItemStat();

		Console.WriteLine($"힘 : {GameManager.Instance.player.str + itemStats.sumStr} ({itemStats.sumStr})");
        Console.WriteLine($"민첩 : {GameManager.Instance.player.dex + itemStats.sumDex} ({itemStats.sumDex})");
        Console.WriteLine($"지능 : {GameManager.Instance.player.inte + itemStats.sumInte} ({itemStats.sumInte})");
        Console.WriteLine($"행운 : {GameManager.Instance.player.luk + itemStats.sumLuk} ({itemStats.sumLuk})");
        
		Console.WriteLine($"공격력 : {GameManager.Instance.player.TotalDamage} ({GameManager.Instance.player.inventory.WeaponStat()})");
        Console.WriteLine($"방어력 : {GameManager.Instance.player.TotalDefens} ({GameManager.Instance.player.inventory.ArmorStat()})");
}

 

상태창은 StatScene 클래스를 만들어 출력할 코드를 입력해주었으며

플레이어 기본 스탯+장비에 대한 스탯값을 출력, 괄호 안엔 아이템에 대한 스탯값만을 출력하여 상태창에서 조회할 수 있게 해주었다.

- 방어력과 공격력은 ItemStats 외에 Inventory의 다른 메서드로 하여 경로를 전부 입력해주었다.

최초 값

최초엔 아무것도 장착되어있지 않아 기본 스탯으로 표시되며

장비 장착 후

아이템 장착 이후엔 위와같이 표시된다. 참고로 저렇게 1레벨 던전을 가면 모든게 한방컷이다 (/▽\)