직업은 전사(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레벨 던전을 가면 모든게 한방컷이다 (/▽\)
'C# > Study' 카테고리의 다른 글
[C#] TextRpg 팀 프로젝트 중, 직업 별 초기스탯 적용 (0) | 2025.02.14 |
---|---|
[C#] TextRpg 팀 프로젝트 중, 특정한곳 입장 시 아이템 충전 (0) | 2025.02.12 |
[C#] 이것저것, 함수 / 선언 / 변수 / 배열 (0) | 2025.02.11 |
[C#] C# 문법 1주차 숙제풀이 (0) | 2025.02.07 |