티스토리 뷰

 이글은 KGDA의 nairrti 이 올리신 글입니다. 상당히 좋은 글이라 생각되어 일단 블로그로 가져왔습니다. 하지만 허락을 받지 않았기 때문에 문제가 된다면 삭제 하겠습니다.

 

 

 

 Better Monster AI - Joseph Swing

 

  나아진 인공지능에 대해서 (2) 조셉 스윙

 

2002년 09월 30일, 저자로부터의 허락을 받아 번역 및 주석을 달았음.

김 종 득(Nairrti@mail.com)

 

(문서에 대한 역자의 설명 이 문서는 원 저자가 공개된(public) 형태로 만든 문서이므로 한글 번역된 내용도 똑같이 공개되어 있습니다. 내용의 수정을 제외한 주석을 달거나 인용하는 것에 대해서 아무런 제제가 없습니다.

 

이 편에서는 좀 더 실제적인 예를 들어서 설명하고 있습니다. 원문은 편을 나누지 않고 있으며, 1편과 2편의 내용을 합친 것과 같습니다. 개인적으로 영어 전공자가 아니라서 번역상 약간의 오류가 있을 수 있음을 양지하여 주시고, 내용이 이상한 부분이 있다고 생각되면 원문을 참고하시기를 바라며, 올바른 내용을 알려주시기 바랍니다.)

 

이것(1회에서 설명했던 내용들)을 통해 만들어진 재미있는 결과들:

 

#1: 전투 능력이 4로 되어있는 오우거(ogre) 보보는 약한 몬스터와 조금 강한 몬스터의 사이에 위치하게 되었고, 약한 몬스터 쪽으로 약간 치우쳐 있습니다. 보보는 더 약한 몬스터를 공격하기 위해 그 쪽으로 움직이게 됩니다.

 

#.........

#..3..B.2.

#.........

 

#           = 벽  

.            = 빈 공간

3            = 전투 능력 3의 몬스터

B           = 보보

2            = 전투 능력 2의 몬스터

 

보보는 2를 따라가게 됩니다.

 

(*) Steven Salter는 몬스터의 가장 큰 관심은 자신이 이길 수 있다고 생각되는 강한 쪽의 몬스터를 공격할 것이라고 주장했습니다. 이는 약한 대상이 있는 상태에서 자신의 위험을 감수하고 (주1 - 더 강한) 대상을 선택하는 것이며, 저는 동의하지 않습니다. 대부분의 몬스터가 비슷한 전투 능력을 가지고 있는 적을 만났을 때, 강한 상대를 공격해서 상처를 입는 것보다 약한 상대를 공격하는 것이 낫다는 것입니다. 몬스터를 어떻게 설정하는지, 얼마나 많은 몬스터가 그 층에 생성되는 지에 대해서는 많은 것들이 관련됩니다. 무엇이 상황과 취향에 따라 적절하게 결정하면 되겠습니다.

 

#2: 오우거인 보보는 1을 따라가는 상황입니다.

 

........

.1...8..

........

...B....

........

 

그는 즉시 왼쪽으로 움직이게 될 것이고, 1을 중심으로 나선을 그리며 1에게 접근하여 죽이고는 도망가기 시작할 것입니다. (1과 8은 멈추어있다고 가정합니다.)

 

#3: 여러분은 아주 조심스러운 청소부 타입의 몬스터(a cautious scavenger type, 주2 청소부 타입의 몬스터는 돌아다니면서 물건을 집어먹고 던전에 떨어진 아이템들을 청소하는 역할을 하기 때문에 그렇게 부르는데, 여기서 scavenger는 약간 다른 의미이지만 우리말로는 비슷한 뜻이라고 해석 했습니다)를 설정했습니다. 만약 이 날렵한 님블(Nimble the Rat Theif - 공격성향 1, 공포심 4, 욕구 4)이 주인공(hero 전투능력 4, 금은보화 4 소지)과 마주쳤다면, 님블은 영웅과의 거리를 3칸으로 유지하면서 따라가다가 영웅이 다른 몬스터를 만나 상처를 입어 약해지면 거리를 점점 좁힙니다. 님블은 영웅의 뒤를 그림자처럼 따라다니는 동안 영웅이 버리고 가는 물건들(goodies)을 줍고, 영웅이 점점 약해지면 그를 공격할 것입니다.

 

이 예에서 님블은 영웅이 가진 금은보화를 죽이는 것보다 더 선호합니다. 그래서 님블은 영웅의 뒤퉁수를 치고 죽이기 보다는 그가 가지고 있는 문건들을 쌔비기(pickpocket)를 하려고 합니다.

 

이 모델의 단점

 

거리가 멀어지면, 마음도 멀어진다(out of sight, out of mind)라는 속담처럼 이 모델에는 중요한 문제가 있습니다. 우리가 만든 이 몬스터들은 전 턴에 어디로 계속 가려고 했는지를 이번 턴에서 기억하지 못합니다. 몬스터가 시야에서 대상을 놓치게 되면, 그 대상의 존재 자체를 잊어버리게 됩니다.

 

#..........

#.B........

#......####

#........$.

 

#           = 벽

.            = 빈 공간

B           = 보보

$            = 금은보화

 

보보는 동쪽으로 이동하다가 시야에서 $를 놓치게 됩니다.

(주3 전편에서 이야기를 하였듯이, 몬스터는 8방향으로만 자신의 목표를 기억하고 있습니다. 따라서, 보보가 옆으로 3칸을 이동하게 되면 남동 방향에 있는 $가 벽에 가려져서 시야에서 사라지게 됩니다.)

 

한가지 해결 방법: 이 문제는 대부분 욕구에서 발생하게 될 것입니다. 다른 몬스터들은 주변을 돌아다니다가 다시 그들의 목표에 일치하는 것이 시야에 들어오거나 계속 이동해서 관심을 잃게 됩니다. 한가지 해결 방법은 전 턴에서 가장 크게 작용한 욕구과 그 방향을 기억하는 것입니다. 만약 욕구에 대한 계산 결과가 아무 방향에도 없는 것으로 된다면(대상이 시야에서 사라지게 되면), 이전 턴에 있었던 욕구의 대상이 있던 방향을 다시 기억해내면 됩니다. (주4 이전 턴의 복구에도 없는 경우에는 원래 없던 것이므로 무시하면 되겠군요)

 

(주5 이 글 전체에서 desire가 두 가지로 사용되면서 저도 계속 욕구와 요구사항에 대해서 헷갈리기 시작했습니다. 일단, 일반적인 상황에서의 요구사항은 대체로 몬스터가 하고 싶어 하는 것들(5가지)이라는 뜻이고, 여기에서는 보물 등의 재화를 원하는 정도로 해석하시면 됩니다. 앞으로는 소급 적용하여 욕구(후자의 뜻)와 요구사항(전자의 뜻)을 구분하도록 하겠습니다.)

 

장애물의 회피

 

몬스터가 자신의 시야 범위 안에서 함정 같은 장애물을 발견하면 몬스터는 어떻게 함정을 피해서 갈 지를 알지 못합니다. 장애물은 아마도 몬스터가 볼 수 있는 8방향 중의 하나에 있을 때에만 문제가 되겠지만, 몬스터는 종종 이런 상황에 스스로 걸어 들어가고는 합니다. 이 것을 어떤 길찾기(pathfinding) 방법과 합치려고 한다면, 몬스터의 지향방향과 실제 이동방향에 대해서 분리하는 (아래와 같은) 약간의 작업 예제들이 있습니다.

 

#.....

#.B.X$

#.....

 

#           = 벽

.            = 빈 공간

B           = 보보

$            = 금은보화

X           = 함정

 

보보는 이제 문제에 직면했습니다.

 

Aidan Ryder는 저런 구덩이나 다른 함정들이 공격성향, 욕구에만 적용되고 공포심에는 거의 영향이 없다는 것을 지적해 주었습니다.

 

#...........

#.......X...

#...D.B.X...

#.......X...

#...........

 

#           = 벽

.            = 빈 공간

X           = 함정

             B           = 불행한 보보

             D           = 무지무지 무서운 용(Greater HellWyrm)

 

보보는 가능한 최대한 빨리 도망쳐야 하고, 함정들은 무지무지 무서운 용의 뒤쪽에 있기 때문에 상관할 바가 아닙니다. 만약 함정 쪽으로 비잉 돌아서 접근하려고 한다면 무시무시한 용은 보보를 맛있게 먹을 수 있을 겁니다.

 

한가지 해결 방법: 저의 첫 번째 해결 방법은 꽁수였습니다. 장애물이 정확하게 8방향 중의 하나에 있고 몬스터가 장애물을 건너서 가야만 한다면, split the attractive vectors (Aggression and Desire) to point 3/4 at (desired direction + 45 degrees) and 1/4 at (desired direction -45 degrees). (주6 이 부분에 대한 해석은 결국 지향 방향에 대한 벡터를 대각선으로 옮겨주고, 하나의 타일을 빗겨가게 만드는 부분입니다만, 원문에 대한 이해가 제대로 안되어서 원문을 그대로 올립니다. 죄송합니다. 해석에 대해서 정확한 뜻을 아시는 분은 연락 주시면 수정하도록 하겠습니다.) 만약 장애물이 넘을만한 경우면, 그리 탐탁지는 않지만, 공포심은 그대로 둡니다. 이것은 작은 장애물에 대해서 피해갈 수 있게 해주고 한 방향에서 다른 방향으로 이동하게 해주는 다른 충동들(주7 욕구)에 대한 해결책은 되겠습니다. 이것은 몬스터가 커다란 장애물에 걸렸을 때 별로 좋은 해결 방법은 되지 못하고 길을 잃기도 합니다. 하지만, 현재의 모델에서는 그런대로 쉽게 적용할 수 있습니다.

 

좋은 해결 방법: 우리는 이치에 맞는 선에서 길 찾기 알고리즘과 합쳐야 합니다. 그러면 추가로 (x,y) 좌표에 해당하는 데이터가 필요하게 될 것입니다. 몬스터의 요구사항(주8 - 1~10개의 항으로 1편에서 소개된 몬스터의 판단 순서)이 정해지면, 우린 이것을 방향뿐만이 아니라 목표의 위치까지 저장합니다. 가장 높은 순위의 욕구가 공포나 배회 성향으로 결정되면 이 값은 널(null)로 합니다. 기타 성향인 경우에는 그 성향의 특정한 목적에 따라서 달라지겠습니다.

 

모든 타일(squares)에 대한 계산이 되었고 그 값(주8 (x,y)에 해당하는 목표 위치)이 널이 아닌 경우면, 이 값에 길 찾기 알고리즘을 적용할 수 있게 됩니다. 여기서는 단지 욕구의 방향에 따른 계산된 길만이 필요하거나 인접한 두 개의 방향과 욕구의 방향만 필요할 겁니다. 이미 계산된 다른 욕구들도 물론 포함해야 한다는 것을 잊어서는 안되겠습니다(만약 동쪽으로 이동하고 싶고 북쪽으로 강한 공포심을 느끼고 있는 경우에는 남동쪽의 길을 택하려고 합니다. 궂이 공포심에 의해서 새로 생긴 북쪽에 대한 지향성을 다시 계산해 줄 필요는 없습니다).

 

(x, y)가 널인 경우에는 간단한 방법으로, 뚜렷하게 목표를 가지지 않은 요구사항에 대해서 계산하여 복귀시키면 됩니다.

 

 

이 문서는 공개되어 있고, 코멘트는 언제나 환영합니다.

 

JSwing@wport.com

 

Last update: August 11, 2002. 12:44:38 pm © Björn Bergström 2000-2002

 

(3편으로 계속)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함