[2357] 2357의 AI는 어떻게 만들어졌는가? Lu's…〃 Programing。



『2357』게임의 인게임영상. AI가 잘 하진 못해도 스스로 움직입니다.


────────────────────────────

 군대에서 전역한 직후부터 시간 날 때마다 만들었던 『2357』이 완성됐습니다. 결과적으로 2015년 학과 과제전에 출품하게 되어 감개가 무량한 작품입니다.

『2357』은 2인용 턴제 전략 시뮬레이션으로, 원 형태의 유닛을 이용해 적을 공격하여 적을 전멸시키는 게임입니다. 아군과 적은 특정 지역(거점)에서 유한하게 생성됩니다.

 2월 중순즈음, 게임에 대한 설명서를 작성하며 게임의 AI에 대해 생각해보게 됐습니다. 턴제 게임이라 상대랑 번갈아가며 플레이하는 방식으로 게임을 진행할 수 있습니다...만, 역시 그러면 모양이 빠지죠. 그래서 며칠동안 고민해가며 인공지능, AI라는 것에 대해 생각해봤습니다.



 AI(Aritifical Intelligence)는 직역하면 인공지능입니다. 사람(人)이 만든(工) 지능(知能)이라는 뜻을 가지는데, 진짜 사람처럼 생각하며 주어진 작업을 처리하는 기술을 일컫습니다. 하지만 제가 무슨 능력이 있다고. 목표는 '플레이어와 대전을 할 수 있는' 코드를 적용시키는 겁니다.

 그럼 여기서 문제. 어떻게하면 '플레이어와 대전을 시킬 수 있는' 인공지능을 만들까요?

1. 자신의 턴이 되면
2. 플레이어와 AI의 상태를 파악해
3. 어떻게 하는게 가장 합리적일지 정해
4. 행동에 옮긴다.

 이것이 현재 제가 만들 AI의 순서입니다. 여기서 1.은 게임을 만들 때 이미 턴 구분이 생겼고, 4.는 AI 플레이어가 가진 모든 유닛이 개별적으로 판단한 판단점수를 가지고 가장 중요한 일을 먼저 처리하게 하면 됩니다. 문제는 2 ~ 3입니다. 얘들을 어떻게 해야하누.

 일단 2. 플레이어와 AI의 상태를 파악하는 것. 유의미한 정보들을 모아야 합니다. 게임에 대한 자세한 설명을 생략하고 이야기합니다.

2에서 생각해야 할 점은 총 세 가지입니다.
 2 - 1. 현재 적 유닛의 위치.
 2 - 2. 현재 적 거점의 위치.
 2 - 3. 현재 판단하고 있는 유닛의 정보

이 세가지를 세세하게 살펴보면

 2 - 1. 현재 적 유닛의 위치.
2 - 1 - 1. 적 유닛을 현재 공격할 수 있는가?
2 - 1 - 2. 적 유닛을 현재 판단하고 있는 유닛이 소멸시킬 수 있는가?
2 - 1 - 3. 적 유닛이 나를 공격할 수 있는 범위에 존재하는가?
 2 - 2. 현재 적 거점의 위치 :
2 - 2 - 1. 적 거점에 적 유닛이 존재하는가?
 2 - 3. 현재 판단하고 있는 유닛의 정보에서 :
2 - 3 - 1. 유닛이 업그레이드가 가능한가? 주변에 업그레이드 가능한 유닛이 존재하는가?
2 - 3 - 2. 유닛이 현재 거점을 만들 수 있는가?
2 - 3 - 3. 유닛이 현재 방책을 만들 수 있는가?
 3. 이외 사항 :
3 - 1. 유닛이 거점일 때 > 유닛을 생성한다. 
3 - 1 - 1. 근처에 업그레이드가 가능한 유닛이 있는가?
3 - 1 - 2. 근처에 적이 공격하는가?

이렇게 됩니다.

 일단 1 ~ 4 까지 생각하고 어떤 식으로 만들어야할지 생각했습니다. 실제 구현은 어떻게 해야하나.

1. 은 이미 완료된 시점이므로 생략하겠습니다. 그리고 어떤 식으로 구현하느냐. 『2357』에서는 각 유닛별로 각 상황에 대한 판단점수를 별개로 기록한 뒤(이동 판단 점수, 공격 판단 점수, 업그레이드 판단 점수 등 세분화) 가장 높은 수치를 유닛의 대표 점수로 만들었습니다. 이 수치를 해당 유닛의 대표적인 판단점수로 설정한 뒤 AI 플레이어가 소유한 모든 유닛들의 대표 판단점수들을 비교, 가장 높은 '현재 턴에 가장 행동해야 할 유닛'을 선택하여 움직이게 합니다.



 그러면 어떤 식으로 판단점수를 매기는가? 실제 구현은 생각보다 단순하고, 지루합니다.

2 - 1. '적 유닛을 향해 나아가는' 판단입니다. 현재 적 유닛과의 거리를 구합니다. 기준 점수(판단점수_거리)를 기준으로 가까울수록 점수가 높아집니다. 그리고 2 - 1 - 1.부터 판정을 하여 각 부분에 대한 기준 점수를 더합니다. 만약 2 - 1 - 1. 이 참이면 + 점수, 아니라면 - 점수 같은 식으로. 조금 더 구체적인 AI를 제작하고 싶다면 예외사항을 둡니다 : 2 - 1 - 2. 와 2 - 1 - 3. 이 모두 충족된다면, 점수를 감하지 않고 특수한 점수를 더한 뒤, 적 유닛과 반대 방향으로 '후퇴'하는 판단을 내리게 합니다.

2 - 2. '적 거점의 핵(거점의 생명력)을 직접 공격하는' 판단입니다. 현재 거점의 핵과의 거리를 구합니다. 그리고 거점을 공격하는 점수를 더합니다.

2 - 3. 은 AI 플레이어의 모든 유닛들을 대상으로 판단합니다. 판단도 2 - 1. 과는 다르게 개별적으로 판단하게 됩니다 :
 2 - 3 - 1. 한 번에 갈 수 있는 거리가 아니면 생략하고, 그 이후에 업그레이드가 가능한지 확인합니다. 모두 참일 경우 거리는 점수에 포함시키지 않고 업그레이드 점수를 매깁니다.
 2 - 3 - 2. 와 2 - 3 - 3. 유닛이 현재 거점이나 방책을 만들 수 있는지 판단한 후 거점(또는 방책) 생성 점수를 매깁니다.
 그리고 3. 현재 선택된 유닛이 거점의 핵일 경우(거점의 핵은 유닛으로 취급하여 관리합니다) 무조건 유닛 생성 점수를 매기며 3 - 1 - 1. 과 3 - 1 - 2. 를 판단합니다. 판단 후 참인 경우에 별개의 판단 점수를 부여합니다.(3 - 1 - 1. 은 업그레이드 점수에 겹쳐도 됩니다. 거점은 업그레이드 하지 않으므로) 둘 모두 거짓이면 거점에서 가장 높은 공격력을 가질 수 있는 유닛을 생성합니다. 이는 별개의 함수로 체크합니다.

이 모든 것을 AI 플레이어의 모든 유닛에 걸쳐 실행합니다. 유닛이 많으면 많을수록 처리가 오래 걸리겠지만, 『2357』의 경우 유닛의 최대치는 50 이하이므로(심지어 AI의 경우에는 무조건 유닛을 뽑지 않고 조건에 맞으면 업그레이드를 시키므로 실제로는 20개체정도 존재하면 모든 유닛을 뽑았다고 봐도 무방합니다.) 크게 문제될 정도는 아닙니다.

 판단을 마친 뒤, 모든 유닛에 대해 '가장 행동해야 할 유닛'을 선택하여 해당 판단을 실행합니다.

 이상으로 『2357』의 AI 구현이 종료되었습니다.


.
.
.


 그림이라도 잘 그리면 그림을 첨부해서 이해가 좀 더 편하게 하겠지만, 그건 저에게 너무 무리한 요구입니다...

마지막으로 2357의 스크린샷을 올리며 글을 마칩니다. AI에 대해 궁금한 점이 있다면 댓글 달아주시면 답변해드립니다.






덧글

  • 슈퍼스타감사용 2017/05/23 17:45 # 삭제 답글

    실제로 ai 를 짜는데 많은 도움이 되었습니다. 약간의 이해하기 어려운 부분도 있지만. 간단하게 읽어본다면 도움이 많이될듯합니다.

    이 글을 읽어본 결과로는 결국 AI는 가장 합리적인 수만내면 된다 즉 장기 알고리즘과 같은것과 크게 다를게 없다고 생각되네오ㅛ

    감사합니다.
댓글 입력 영역