오늘은 내가 맡았던 부분을 플레이 해보며 다듬는 느낌으로 진행했다.
내가 스킬을 구현하며 마나도 캐릭터의 필드로 넣었는데 현재 마나 상태를 보여주지 않는 부분이 있었다.
코드라고 해봤자 player.Mp
이거 추가해준 것들이 끝이라 사진만 올렸다.
게임에 마나 회복이 추가해줬다.
여관에 돈내고 체력회복하는 파트가 있어서 무료로 명상을 할 수 있게 추가구현했다.
internal class Player : IDamagable
{
,,, 생략 ,,,
public void Meditate() => Mp = MaxMp;
,,, 생략 ,,,
}
팀장님이 게임의 데이터 저장하고 다시 불러오는 과정에서 찾은 오류를 알려주셔서 고치는 과정이 있었다.
Skill 클래스에는 Owner
라는 Player
타입의 참조 변수가 있었고, 생성자에서 Player
객체를 전달 받았다.
마나의 소모를 편하게 구현하기 위해서 넣어놨었는데 문제가 난거다.
Json으로 저장할 때 Skill
클래스 객체들의 내용도 저장하는데 그 떄 Player
객체를 참조하는 필드 Owner
도 저장했다.
동적할당하는 것은 절대 이런 식으로 저장하면 안되는 것인데..
C++로 치면 파일에다가 동적할당으로 생성한 객체의 주소를 저장해놓고 나중에 또 써보겠다는 것과 같다.(흑흑)
그래서 Skill
클래스에서 Owner
필드를 없애고 Owner
를 사용하는 메서드는 Player를 직접 매개 변수로 받도록 수정해주었다.
한 가지의 메서드만 예를 들면 아래와 같다.
public float UseSkill(float originDamage)
{
Owner.Mp -= Cost; // 마나 소모
return originDamage * AtkMultiplier; // 스킬 배수 계산 반영 데미지 반환
}
이 메서드를
public float UseSkill(Player player, float originDamage)
{
player.Mp -= Cost; // 마나 소모
return originDamage * AtkMultiplier; // 스킬 배수 계산 반영 데미지 반환
}
이와 같이 Player를 직접 전달 받도록 변경해주었다.
나는 수포자였기에 알고리즘 책을 공부하며 유클리드 호제법을 처음 보게 됐다.
간단히 말하면 유클리드 호제법은 두 정수의 최대 공약수를 찾아주는 재귀 형태의 알고리즘이다.
멋진 이름이 무색하게 내용은 간단하다.
피보나치 수열은 가끔 보면 "아~맞다. 이런 원리지" 하고 또 까먹는 내용이었는데, 글로 정리해보며 좀 더 확실하게 알 수 있었다.
피보나치 수열을 베이스 케이스와 함수 호출로만 구현하면 성능상 문제가 있어 메모이제이션 동적 계획법이라는 기법을 사용한다고 한다. (뭔가 무서운 이름이다.)
그 내용은 내일 공부해볼 것이다.