[내일배움캠프 12일차] TextRPG-이번에는 팀플이다! 2
1. 오늘의 할 일
정확하게는 오늘의 진척도.
무엇을 했나요?
1. 캐릭터 상태창에 DEX, EVA 값 등 추가값 더함-해당 값에 따른 데이터 변화는 구현예정
2. 캐릭터 직업에 따른 스테이터스 구현
이미 한 번 해본 거라 어렵진 않았다. 하지만 오늘의 메인은 막무가내로 길던 상태창별 로그를 깔끔하게 정리한 것이다.
2. 작업개시🛠️
1. 사실 데이터 추가는 어렵지 않다.
DEX, EVA 등의 데이터가 추가되었지만, 어려운 것은 아니었다. 당장 사용되는 기능이 아니었으니까.
도리어 이 능력치들은 '새로운 기능'을 위해 필요한 것이었으므로, 데이터를 집어넣기만 하면 되었다.
public int DEX { get; set; } // 민첩=명중률
public int CRIT { get; set; } // 치명타 확률
public float CRITDMG { get; set; } // 치명타 대미지 배수
public int EVA { get; set; } // 회피율
이런 느낌.
문제는 바로 다음이다.
2. 캐릭터 직업에 따른 스테이터스 구현
개인 작업물에서는 어차피 직업이 3개 뿐이라, 그냥 if문으로 전사, 마법사, 궁수로 끝냈다.
하지만 여긴 직업이 무려 6개. 변하는 스탯도 한 두가지가 아니다.
그걸 if문으로 작성하면 어떻게 되겠는가?
정답:
이걸 보는 나:
feat. 132줄까지 내려간다. 55번부터 132번줄까지.
심지어 character.Attack= ...은 전부 똑같고 데이터만 바뀌는데!!
일단 '기능'을 구현해두기 위해서 해당 로그는 깃허브에 커밋하고, 다시 수정하기 시작했다.
'기능'은 유지하고, 대신 유지보수가 쉬운 방향으로 바꾸는 것이다.
Q. 그럼 그 방법이 뭔데?
A. Dictionary.
Step 1. 일단 Stats라는 이름의 구조체를 만들어준다.
왜 구조체를? : 데이터 변화하는 애들만 따로 모아서 캡슐화 하기 위함이다.
Step 2. Dictionary를 만든다.
Key값은 Departments(부서=직업의 역할을 한다.)
그에 대한 value는 Stats가 대신한다.
이렇게 변화하는 데이터를 쭉 집어넣는다.
이렇게 한 번 만들어두면, 이후 새로운 직업이 추가될 경우 아래에 한 줄만 더 추가하면 된다.
(물론, Enum에 해당하는 Departments에도 이름은 추가해야한다)
만들었으면 해당 데이터를 제대로 집어넣어주기도 해야한다.
Step 3. 유효한 선택만 받도록 만든다.
int departmentChoice;
while (!int.TryParse(Console.ReadLine(), out departmentChoice) || !Enum.IsDefined(typeof(Departments), departmentChoice))
입력한 값을 departmentChoice라는 int값으로 나오게 만든다(out)
또한, 내가 입력한 값이 Enum의 Departments에 해당하는 값이어야 한다. (Enum.IsDefined)
즉, 위의 while 반복문은 내가 입력한 값이 1. 숫자가 아니거나 2. Enum에서 유효한 값이 아닌 동안 계속 반복하게 된다.
이런 느낌. 마지막에 적힌 4는 유효한 번호이기 때문에, 누르면 정상적으로 다음 장면으로 넘어간다.
Step 4. 선택이 되면, 데이터를 할당받는다!
//캐릭터 직업에 따른 스탯 부여
Departments selectedDepartment = (Departments)departmentChoice;
character.ClassName = selectedDepartment.ToString();
if (character.classStats.TryGetValue(selectedDepartment, out Stats selectedStats))
{
character.Attack = selectedStats.Attack;
character.Defense = selectedStats.Defense;
character.MaxHealth = selectedStats.MaxHealth;
character.Health = selectedStats.Health;
character.MaxMP = selectedStats.MaxMP;
character.MP = selectedStats.MP;
character.DEX = selectedStats.DEX;
character.CRIT = selectedStats.CRIT;
character.CRITDMG = selectedStats.CRITDMG;
character.EVA = selectedStats.EVA;
}
이름이 죄다 길어져서 헷갈릴 수도 있을 것 같지만.
의외로 내용은 간단하다.
selectedDepartment를, departmentChoice에서 선택된 값과 동일한 값을 가진 요소와 매치시킨다.
그리고 매치된 이름을 ToString();을 이용해 ClassName에 집어넣는다.
그 다음 정해진 Department의 값을 가져가 classStats 딕셔너리에 있는 Key에 집어넣고,
Key와 매치되는 내용(value)를 selectesStats라는 이름으로 가져온다.
그 값을 character의 각 요소와 동일한 것으로 설정해준다. 그것으로 끝!
줄줄이 if문이 생기지도 않고, 내용과 요소를 추가하고 빼기도 수월해졌다.
사실 좀 더 줄이는 방법도 고민하고 있지만, 아직 캐릭터 Status에서 빼도 되는 녀석과 빼면 안되는 녀석들의 구분이 되지 않는다.
일단 정상적으로 작동하고 있으므로, 이후 한 번 더 리팩토링을 거쳐 볼 예정이다.
3. 내일 할 일
LevelUP!
플레이어에게 LevelUP을 위한 경험치와 필요 경험치를 할당하고, 조건이 맞으면 LevelUP 메서드가 불려오도록 할 것이다.
이미 한 번 만들어본 것이니 어렵지 않을 것 같다.
조원들의 능력이 출중하니 필수과제를 넘어 도전과제들까지 빠르게 채워지고 있다.
서로서로 충돌나지 않도록 신경쓰는 건 힘들지만, 여럿이 뭉치니 확실히 속도가 빠르다는 걸 실감한다.