장애물을 길을 찾는 방법?


10

다음 상황을 대표하는 방법-최고 요원 ( @)이 목표 ( $) 에 도달해야합니다 . 경로는 해자 ( ~~~)에 의해 차단됩니다 . 장애물을 가로 지르는 레이크 (또는 워터 워크 부츠와 같은 다른 장치)를 사용할 수 있습니다.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

어떻게 제대로에서 pathfind하기 @$가능한 경로가 더 즉시 없습니다 제공? 내 길에 비용뿐만 아니라 전제 조건이 있어야합니까?

UPD : 문제는 목표에 접근 할 수없고 갈퀴는지도에서 가능한 많은 물체 중 하나 일뿐입니다. 질문은 "대리인이 갈퀴가 필요하다는 것을 이해하게하는 방법"입니다.


유스 케이스를 명확히해야한다고 생각합니다.이 문제를 해결하는 데 필요한 접근 방식에 영향을 미치기 때문입니다. 예를 들어, 유스 케이스가 적의 경로를 계산하는 것이라면 먼저 목표에 도달 할 수 있는지 확인해야합니다. 적군이 갈퀴를 얻지 못하면 (즉, 갈퀴는 목표입니다) 첫 번째 경로를 찾으십시오. 다시 목표.
jhocking 2013 년

답변:


6

나는 목표의 스택에 대해 생각하고 있습니다. 길 찾기에는 주석달려 있어야합니다 :

  • 목표로 시작 get $
  • $워터 워크 기능이 필요한 경로 찾기 -경로가 있습니다.
  • 목표를 미십시오 get waterwalking.
  • 목표 스택은 이제 get waterwalking, get $
  • 어쨌든 갈퀴가 물을 뿌린다는 것을 알게되면 보트로 이름을 바꾸십시오.
  • 갈퀴 길. 최고 목표에 도달했습니다 get $. 스택에서 펼치십시오. 목표는 입니다.
  • 경로 $-이제 우리는 능력이 있으며 목표에 도달 할 수 있습니다.

1
+1 내 게임과 비슷한 작업을 수행 하고 Unit Tasks and pathfinding 아래 에 약간의 게시물을 썼습니다 .
MichaelHouse

@ byte66은 레이크를 사용하지 않는 경로가있을 때 특별한 경우를 처리하지 않지만 레이크를 사용하면 경로가 짧아집니다.
Ali1S232

@Gajet 당신이 맞아요. 추측에는 다른 접근 방식이 필요합니다.
zzandy

1
추가 비용을 추가하기 만하면됩니다. 물이 생기면 물 위를 걷는 물건을 길에 가져 오는 비용을 더하십시오. A *는 가장 저렴한 경로가 될 때까지 물 위를 건너 뜁니다.
MichaelHouse

3

전체 경로 찾기 항목은 그래프에서 가장 짧은 경로를 검색하는 것입니다. 문제를 해결하려면 적용해야 할 유일한 변경 사항은 경로 보트가 취할 수있는 여분의 가장자리를 추가하고 간단한 경로 찾기 알고리즘을 수행하는 것입니다. BFS, Dijkstra 또는 A * 중 어느 것을 사용하든 상관없이 약간의 추가 모서리가있는 정상적인 경로 찾기 알고리즘을 구현하십시오. 그래프 확인 위키 페이지 에서 경로 찾기에 대한 자세한 정보


+1 물과 땅 사이의 꿀벌이 일방 통행 링크와 함께 갈퀴를 물과 일방 통행 링크로 만듭니다.
Laurent Couvidou

기하학적 검색과 기능 검색을 함께 바인딩하는 방법을 명확하게 이해하지 못했습니다. 방법에서 이동 no path from @ to $goto rake, bring it to water, place it, goto $.
zzandy

경로를 찾는 동안 @zzandy, 각 타일에 대해 가능하면 가장 가까운 타일로 이동하십시오. 현재 노드가 레이크 인 경우 강 반대편에서 노드를 직접 추가하여 목록을 열 수 있다는 조건을 추가하기 만하면됩니다.
Ali1S232

그러나 장치를 휴대 할 수 있다면 어떨까요? 나는 그것이 그가 의미하는
바라고

예, 기기를 휴대 할 수 있습니다. @kaoD, 귀하의 답변에는 상담원이 갈퀴가 필요한 아이디어를 얻는 단계가 포함되어 있지 않습니다.
zzandy

2

나는 일종의 행동 트리 솔루션으로 이것을 할 것입니다-당신은 목표로 향하고 A *를 막고있는 모든 장애물을 기록하십시오. 실패하면 해당 장애물을 극복하는 데 도움이되는 객체가 있는지 확인합니다 (이 경우 해당 객체의 경로). 반복. 이것은 에이전트가 목표를 향한 길을 가고 도구 사용에 대한 아이디어를 얻기 전에 실패해야한다는 것을 의미합니다. 특히 모든 타일을 검사해야하는 거대한 타일이있는 경우 시간이 걸릴 수 있습니다. 상담원이 문제를 해결하는 방법에 대해 생각하는 데 시간이 걸리는 것처럼 보이지 않을 수 있습니다.

그러나 실제 하드 코어 솔루션을 상상할 수 있습니다. 경로 찾기 그리드에 다른 치수를 추가하십시오. 따라서 2D 맵의 경우 경로 찾기 그리드를 3D로 만듭니다. 이 간단한 예에서이 새로운 차원은 깊이가 2이지만 실제 게임에서는 빠르게 커질 것입니다.

z = 0에서는 정상적인 상황에서 지형을 매핑합니다. 즉, 워터 타일은 통과 할 수없는 것으로 간주됩니다.

z = 1에서는 갈퀴가있는 동안 지형을 그대로지도에 표시합니다. 즉, 물 타일은 걸을 수있는 것으로 간주됩니다 (예를 들어 벽 타일이있는 경우 단색으로 유지 될 수 있음).

경로 찾기는 x 및 y 차원에서 일반적인 A *입니다. 즉, 모든 그리드 셀은 인접 셀에 액세스 할 수있는 것으로 간주됩니다. 그러나 z 치수에서 A *는 퍼질 수 없습니다.

갈퀴가있는 곳을 제외하고. 레이크 객체는 경로 찾기 그리드에서 z = 0과 z = 1 사이의 개구부 역할을합니다.

이것은 A *가 z = 0에서 바깥쪽으로 채워지고 물을 치고 옵션이 부족하다는 것을 의미합니다. 그런 다음 레이크 타일을 통해 z = 1로 퍼지고 z = 1 (물이 걸을 수있는 곳)로 퍼집니다 목표를 향한 길을 찾으십시오. 결과적으로 망설임없이 NPC가 갈퀴로 이동 한 다음 최단 경로를 목표로 이동합니다.


필자는이 예에서 레이크를 "워터 부츠"처럼 취급하고 있습니다. 갈퀴가 실제로 지형의 한 부분으로 "건축"되어야하고 물을 가로 질러 도달하기에 충분하지 않을 수도있는 제한된 양의 타일을 포함하는 경우 문제가 더 어려워집니다. 내 솔루션은 z = 1로 이동하면 자동으로 다시 z = 0으로 드롭 다운되면 일회용 항목을 허용합니다.
Joar Jakobsson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.