go4game 에 AI를 붙이고 있습니다.
By SeukWon Kang
설명 : go4game webgl client 플레이 동영상.
사진 설명 : 서버의 상태를 보여주는 페이지 ( 팀 이름 , AI 종류 , 팀 object 수 , 팀 점수, 팀 AP , 팀 패킷 통계 )
go4game도 이제 wxgame2 정도로 작업이 진행되어 여러 AI끼리 대전을 시키고 그 진행사항과 순위를 볼 수 있는 페이지를 만들었습니다.
위 와 같은 형태로 만들어서 여러 형태의 AI를 만들고 AI끼리 대전을 시키면서 개선을 해나 가고 있는데 이전 wxgame2 작업할 때도 썼지만 AI를 개량해서 그 AI가 이전에 만든 것보다 좋도록 만드는 것은 참 생각대로 안됩니다.
지금 사용중인 AI는 AINothing, AIRandom, AI2, AI3 의 4가지가 있습니다.
여러 AI를 지원 하기위해 go언어의 interface를 사용해서 이 interface만 준수하면 ( interface AIActor 입니다. ) 새 AI를 간단히 추가 할 수 있습니다.
AINothing과 AIRandom은 예제 및 AI 수준의 기준점 으로 사용하기 위해 만들었습니다.
AINothing은 이름대로 아무것도 하지 않는 AI입니다. 그냥 떠 돌아 다니기만 합니다.
AIRandom은 가능한 5가지 동작중에 4가지를 무작위로 합니다.
AI2 과 AI3은 나름 똑똑한 AI를 만들어 본 것입니다. ( AI3이 새버전 )
AI가 할 수 있는 동작은 한 프레임당 5개 동작 까지 가능합니다.
( 현재 프레임은 초당 60 프레임 )
회피와 위치 이동을 위한 가속(accel) ( 위치나 이동 vector를 직접 조작할수 없고 가속 vector 만 조작 가능합니다. )
기본 공격인 bullet 의 발사 ( 현 위치에서 탄환의 이동 vector를 지정 가능 )
관통 공격인 super bullet 발사 ( 기본 공격과 같이 이동 vector 지정 )
목표를 최대 60초간 따라 다니는 추적 탄환인 homming ( target object ID 지정 )
대량의 무작위 탄을 동시에 발사하는 burst shot ( 탄의 갯수를 지정 )
의 5가지 이며 이 동작들은 모두 AP( action point)를 소비합니다.
즉 AP가 없으면 클라이언트가 동작요청을 해도 서버가 무시합니다.
이 동작별 AP는 게임의 컨텐츠와 밸런싱에 영향을 주는 값들이므로 globaldata.go 파일의 GameConst 안에 정의 되어 있습니다. 각 팀은 매 프레임 자동으로 AP를 얻습니다만 모두 같은 양을 받는 것이 아니고 월드의 중점에서 가까울 수록 많은 양을 멀수록 적은 량을 얻습니다. 게임 구조상 중앙에서 멀어 질수록 유리하기 때문에 반대 급부로 설정한 부분입니다.
동작의 결과로 적을 명중 시키면 ( mainobj ) 점수를 얻고 적의 탄에 내가 명중되면 점수를 잃습니다.
일단 zerosum 게임 입니다만 동시에 3개 object 가 collision 되는 경우가 있기 때문에 점수의 총합이 항상 0이 되는 것은 아닙니다.
( 두 팀의 탄이 한 팀을 동시에 명중시킨 경우 두팀 다 점수를 얻음 )
wxgame 만들때 이것때문에 고민을 많이 했는데 결국 간단하게 처리하는게 제일 좋더군요.( 두팀에 점수를 나누어 주거나 두배의 점수를 뺏기거나하는 형태도 생각해 볼수는 있습니다. )
게임 내의 object는 main , shield , bullet, superbullet, homming bullet 의 5종으로
superbullet과 hommingbullet은 일반 bullet에 영향을 받지 않습니다. 하지만 일반 bullet은 영향을 받습니다. ( 충돌시 일반 bullet만 없어집니다. )
따라서 일반 bullet을 사용해서 superbullet을 맞추는 것은 의미없는 일이 됩니다.
(AI차별화가 가능한 부분입니다. )
이 object끼리 충돌시 영향을 받는 여부는 globaldata.go의 InteractionMap에 정의 되어 있습니다.
현재 작업중인 AI3 (AI2는 이전 버전 )는
각 동작별 object list를 만들고 각 object별로 중요/위험도를 계산 해서 그 수치를 기준으로 정렬합니다.
그리고 높은 순으로 대상을 선정해서 그 대상에 동작을 수행합니다.
사용하는 기본factor들은 거리, 충돌 까지 남은 시간, 상대 속도, 충돌 가능성 , 상대의 종류 , 요격을 위한 각도, 요격 지점 등입니다.
각 동작들의 factor는 위 기본factor를 가중치를 줘서 조합해 만들어 냅니다.
그 외에 최근에 선정된 목표를 제외한 목표를 선정하기 위한 기록 도 수행합니다.
이 정도로도 조합의 형태와 종류가 대단히 많기 때문에 실제로 효과적인 AI를 만드는 과정은 간단하지 않고 그래서 즐기며 작업을 진행하고 있습니다.