if-else 문으로 도배된 내 적 로직의 꼬라지를 보고, 이건 도저히 안되겠다 싶어서 적에게 '평가 함수'를 도입하기로 마음먹은지 어느덧 2주째....
다른 많은 일을 하느라 적 리팩토링의 리자도 꺼내지 못했지만, 이제는 진짜 해야할 거 같아서 리팩토링을 시작했다.
혹시라도 궁금한 사람 있을까봐 올리는 평가 함수 코드. 굳이 안읽어도 밑에서 대강 설명 해줄거임
메서드가 좀 길기는 하지만 로직 자체는 간단하다.
1. 이동 가능 범위 탐색
2. 시야 내의 플레이어 유닛을 가져오고, 근거리 / 원거리 공격 방식에 따라, 해당 유닛들을 공격 가능한 타일을 담기.
3. 플레이어의 시야 상태, 벽의 품질, 플레이어와의 거리, 플레이어를 공격 가능한 위치 등등 다양한 평가 요소를. scoreCard 에 담긴 점수를 기반으로 더해준다.
4. 공격 / 수비 우선도를 최종적으로 곱해주고, 공격과 수비 중 더 높은 점수의 타일을 목적지로 설정한 뒤, 평가 점수를 반환한다.
아직 공격에 대한 평가 함수를 작성하지는 않았지만, 작성 한 이후 두 평가 점수의 값을 비교하여 임계치 미만이면 경계, 이상이면 높은쪽을 선택하도록 할것임.
Scorecard는 아래와 같은 방식으로 작성되어있음
일단은 최대한 쏠림이 발생하지 않게 하기 위해서, 공격적 선택과 수비적 선택의 최대값을 맞춰놓는 식으로 조율함.
이제 이 평가함수를 적용한 뒤, 적 AI의 행동을 한번 살펴보자. 참고로 아직 이동하는 부분은 작성 안해서, 대충 좌표만 보여줄거임.
우선 에디터 상에서 타일은 이렇게 깔아놨다.
이 화면상에서 주황색 타일은 사실상 쓸모 없는 길막용 타일이고,
플레이어와 사이에 검은 외곽선 타일이 존재한다면, 일반적으로는 데미지 감소가 적용되지만,
공격자가 인접해 있다면, 해당 공격자에 한해서는 데미지 감소가 적용되지 않는다.
첫 번째 케이스
공격적인 타일 선정은 보라색 검은 외곽선 타일에 인접하게 아주 잘 위치해있다. 저 위치로 이동 한다면, 적은 플레이어를 데미지 손실 없이 때릴 것 이지만, 플레이어는 적을 공격할 경우, 데미지 손실이 발생할 것이다.
수비적인 타일 선정도 잘 되어있다. 플레이어와 최대한 멀리 떨어지며, 플레이어의 공격이 벽에 가로막혀 데미지 감소가 존재하는 위치로 이동하게 된다.
두 번째 케이스.
플레이어 유닛을 하나 더 끌어와 양각을 잡아주니,
공격적 위치 선정은 두 유닛 모두에 대해서 유리한 자리로 목적지가 잡힌것을 확인 가능하며,
수비적 위치 선정은 두 유닛의 공격 모두 피해 감소가 줄어들며, 최대한 먼 거리로 이동 목적지가 잡힌것을 확인 가능하다.
적 리팩토링이 완전히 끝난다음에 세부적인 조정은 해야겠지만, 일단 상당히 잘 작동하니 기분이 좋다 ㅋㅋㅋㅋ
댓글 3