총격전에서 지능형 적을 구현하는 방법?


13

우리 모두가 아는 매우 간단한 총격전을 상상해보십시오.

쏴 버려 1

당신은 플레이어입니다 (녹색). 움직임이 X축으로 제한됩니다 . 우리의 적 (또는 적)은 화면 상단에 있으며 그의 움직임도 X축으로 제한됩니다 . 플레이어는 적에게 총알 (노란색)을 발사합니다.

플레이어의 총알을 피하는 데 정말 좋은 적을 위해 AI를 구현하고 싶습니다. 첫 번째 아이디어는 화면을 개별 섹션으로 나누고 가중치를 할당하는 것이 었습니다.

가중 촬영

두 가지 가중치가 있습니다. "총알 무게"(회색)는 총알이 부과하는 위험입니다. 총알이 적에게 가까울수록 "총알 중량"이 높아집니다 ( 0..11이 가장 위험합니다). 총알이없는 차선의 가중치는 0입니다. 두 번째 가중치는 "거리 가중치"(연두색)입니다. 모든 차선에 대해 0.2이동 비용을 추가합니다 (이 값은 이제 임의적이며 조정할 수 있습니다).

그런 다음 간단히 가중치를 추가하고 (흰색) 가장 낮은 가중치를 가진 차선으로 이동합니다 (빨간색). 그러나이 접근 방식은 최적의 장소가 단순히 두 개의 들어오는 총알 사이에 있기 때문에 (흰색 화살표로 표시됨) 로컬 최소값을 쉽게 놓칠 수 있기 때문에 명백한 결함이 있습니다 .

그래서 여기 내가 찾고있는 것이 있습니다 :

총격전 총 파괴

  • 총알의 위협을 가하지 않는 장소가없는 경우에도 총알을 뚫을 수있는 방법을 찾아야합니다.
  • 적은 최적 (또는 거의 최적) 솔루션을 선택하여 총알을 안정적으로 피할 수 있습니다.
  • 알고리즘은 다른 속도로 움직일 수 있으므로 총알 이동 속도를 고려할 수 있어야합니다.
  • 다른 수준의 난이도를 적용 할 수 있도록 알고리즘을 조정하는 방법 (지능형 적에게는 벙어리).
  • 적은 총알을 피하고 싶지 않을뿐 아니라 플레이어를 쏠 수도 있기 때문에 알고리즘은 다른 목표를 허용해야합니다. 즉, 총알을 피할 때 적이 플레이어에게 발사 할 수있는 위치를 선호해야합니다.

어떻게이 문제를 해결하겠습니까? 이 장르의 다른 게임 들과는 달리, 나는 멍청한 적들의 질량 대신에 단지 몇 가지지 만 매우 "숙련 된"적들을 갖고 싶습니다.


2
스티어링 행동과 같은 것을 사용하는 것을 고려 했습니까? 장애물 회피를위한 특별한 방법이 있습니다 : red3d.com/cwr/steer/Obstacle.html
Tetrad

@Tetrad 나는 조향 동작에 대해 생각했습니다. 또한 "플레이어를 쏴보십시오"와 같이 멋지게 전환 할 수 있고 위험이 앞서있을 때 "피하다"로 전환 할 수 있기 때문입니다. 회피의 1D 버전 (내가 기본적으로 다루고있는 것)이 좋은 결정을하기에는 너무 어리 석 을까 걱정됩니다. 그래도 잘못되었을 수 있습니다.
bummzack

답변:


8

나는 당신의 기본 아이디어가 건전하다고 생각하지만 그것은 아날로그가 아닙니다. 화면에서 실행되는 아날로그 값 필드가 필요합니다. 따라서 1D 확산 그라디언트를 사용하면 해당 선의 정확한 지점에서 값을 즉시 얻을 수 있습니다. 확산 그라디언트는 저렴 하고 환경을 설명하기 때문에 여러 적들이 동시에 사용할 수 있습니다. . 이 그라디언트는 상대적으로 매끄러 워서 적의 유기적 인 움직임을 불러 일으키고 게임 상태와 마찬가지로 분명히 업데이트됩니다. 아마도 이동 평균 ?

그라디언트는 다음을 결합해야합니다.

  • 근접
  • 속도
  • 총알의 폭
  • (선택 사항) 목표 위치 (플레이어)

회피를 위해서는 솔루션이 존재할 때마다 솔루션을 정확하게 찾을 수 있어야 합니다 . 적을 피할만큼 작은 간격이있을 때마다 그렇습니다. 즉, 할 수있는 일만 할 수 있으므로 그래디언트 접근 방식은 다른 의미의 접근 방식보다 나쁘지 않습니다.

확산 그래디언트는 적을 움직일 필요가 적고 로컬 최적화 (그래프의 피크가 됨)쪽으로 적을 밀어야합니다. 우리가 로컬 최소값에 가까워 질수록 회피 효과가 감소합니다. 이것은 적에게 발사가 잘되는시기에 대해보다 지능적인 의사 결정의 문을 열어줍니다.

발사의 필요성이 움직일 필요보다 크다면 그렇게하십시오. 코드가 얼마나 다른지에 따라 이를 결정할 수도 있습니다 . 이를 기본 그래프의 일부로 구현할 수 있습니다.이 경우 플레이어 위치는 그래프의 주변 값을 낮추고 (적을 가장 낮은 지점으로 끌어들이는 경우) 모든 의사 결정을 하나의 그래프로 결합하거나 " 욕망 "그래프와 주요 닷지 욕구 그래프가 분리되어있어보다 직접적인 제어가 가능합니다.

IRL, 나는 최고 회피 속도에서 피하기 어려워지기 시작한 거리 내에있을 때까지 발사체를 피하는 것을 귀찮게하지 않을 것입니다. 젊은이를 돌로 던지는 경험. 속도 y로 이동하는 x 거리의 총알은 2y에서 이동하는 2x 거리의 총알과 동일한 위험 등급을 갖습니다. 따라서이를 올바르게 고려해야합니다.

적 난이도에 대한 알고리즘을 조정하는 방법은 다음과 같습니다.

  • 그래프 업데이트에 지연 시간 도입 (Born Too Slow)
  • 임의의 지역화 된 부정확성을 그래프에 도입
  • 단순히 AI 게으름으로 인해 일련의 업데이트 (예 : 1 ~ 10 프레임)에 걸쳐 그래프가 알려주는 내용에 적을 갖지 않게하는 것입니다.

다시 말하지만, 모든 요소를 ​​하나의 그래프 (제어가 적고 여러 적에게 유용하지 않음) 또는 결과를 얻기 위해 함께 볼 수있는 여러 그래프로 구현할 수 있습니다. 이 방법을 사용할 수있는 방법이 많으므로 더 구체적으로 설명하기가 어렵습니다.


1
친애하는 Nick. 나는 그 행동의 작은 테스트 버전을 플래시로 구현했으며 결과에 매우 만족합니다 (글 머리 기호는 무작위로 생성됩니다). 현재 3 개의 그라디언트를 사용하고 있습니다. 하나는 위협, 이동 비용 및 정적은 그라디언트입니다 (화면 가장자리는 바람직하지 않습니다). 플래시 응용 프로그램에서 시각화됩니다. 나는 약간의 조정으로 매우 좋은 결과를 얻을 수 있으며 촬영 위치와 같은 다른 무게를 고려할 수 있다고 생각합니다. 많은 친구 감사합니다.
bummzack

1
이봐 @bummzack, 그것은 쾌락 친구, 멋진 작은 데모입니다! 문제에 대한 당신의 견해는 새로운 것이었고 흥미로워 보였습니다. 도움을 주셔서 감사 드리며 공유해 주셔서 감사합니다.
엔지니어

7

이것은 경로 문제로 볼 수 있습니다. baddy가 총알을 피하는 방법을 생각하는 대신 총알을 고정시키는 것은 고정되어 있으므로 baddy는 화면 아래로 이동해야합니다.

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E = 적
B = 불릿
P = 플레이어
* = 화면 하단의 경로 옵션

일단 불량배가 성공적인 길을 꾸미면 매번 다음 단계를 수행하면됩니다. 이와 같은 경로 찾기를위한 좋은 알고리즘이 이미있을 것입니다. baddy가 총알과 같은 속도로 움직인다면 하나의 예제 알고리즘이있을 수 있습니다.

baddy에서 시작하여 빈 공간의 안전한 위치를 왼쪽 아래, 오른쪽 아래 및 오른쪽 아래에 표시하십시오. 그런 다음 방금 만든 각 안전 공간을 고려하고 반복하십시오. 아래에 안전한 공간이 없으면 언제든지 안전하지 않은 공간으로 표시하십시오.


1
재미있는 접근법. 환경이 너무 빠르게 변함에 따라 이것이 다소 비싸고 일반적인 경로 찾기 알고리즘을 사용하기가 어렵 기 때문에 이산적인 "지도"를 사용하는 것이 가장 어렵습니다.
bummzack

그것은 너무 비싸지 않아야합니다. 매 턴마다 맨 아래 줄만 계산해야한다는 것을 잊지 마십시오. 모든 것을 다시 계산할 필요는 없습니다.
Qwerky

@bummzack 환경은 적어도 컴퓨터 측면에서 "빠르지"않습니다. 게임 개발자에게는 거의 모든 게임이 단계를 기반으로한다는 점을 이해해야합니다. 그러나 각 단계에서 계산을 수행 할 수 있으므로 Qwerky 솔루션이 필요합니다.
Deele November

사실, @bummzack에 동의합니다. 이 방법은 논리적으로 견고하지만 문제에서 제안 된 1D 방법보다 비쌉니다. 조기 최적화 일 수는 있지만 그 접근법이 훨씬 더 우아하다는 것을 알았습니다. 그것에 대한 자세한 내용은 내 대답을 참조하십시오.
엔지니어

2
이것은 아마도입니다 적절한 정확하게하지 대답하지만, 사실 하나. 적이 경로를 계산하는 데 걸리는 시간에, 필드는 경로를 완전히 무효화하는 또 다른 총알 세트를 가질 수 있습니다. 즉, 경로를 다시 계산하는 것이 필수적입니다. 그리고 재계 산은 나쁜 년 입니다. 또한, 안전한 곳으로 역 전파한다는 생각은 훨씬 비쌉니다! @Nick Wiggill 나는 그것이 조기 최적화가 아니라고 생각합니다. 가랑이에 빠지지 않도록 좋은 예지력입니다.
Ray Dey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.