2D 타일 게임에서 엔티티에 대한 가능한 움직임 찾기


10

이에 대한 특정 검색어와 관련하여 문제가 발생하지만 2D 턴 기반 전략 게임 (예 : FF : Tactics, Fire Emblem, Advance Wars)에서 가능한 움직임을 찾는 방법은 무엇입니까?

여기에 이미지 설명을 입력하십시오

이 시점에서 지형 (또는 충돌)에 대해서는별로 생각하지 않습니다. X 엔터티가 5 개의 타일을 이동하고 그보다 2 개의 타일을 공격 할 수 있음을 알기 위해 사용할 수있는 알고리즘이 궁금합니다.

Dijkstra와 같은 것을 사용하여 두 점 사이의 거리를 찾을 수 있다는 것을 알고 있습니다. 한 가지 가능한 구현은 플레이어 위치에서 시작하여 Dijkstra가 반환 한 거리가 이동 횟수보다 클 때까지 그 지점에서 분기됩니다.

누군가가 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다 (알고리즘, 기술, 기사 등).


검색어로 경로 찾기라고 생각하고 있습니까? 경로 찾기를 사용하면 필요한 것을 처리하기위한 카운터를 가질 수 있습니다
Exikle

이것은 본질적으로 경로 찾기의 일부입니다 (이동 비용에 대한 메타 데이터 계산). 범위 내에있는 위치 만 결정하지만 원하는 경로를 반드시 결정할 필요는 없습니다.
마리오

1
FFTactics 기반 턴테이블 인 경우 실시간 (RTS)이 아닙니다. : p
Alayric

2d에서는 Taxicab / Manhattan 계산을 사용할 수 있습니다. en.wikipedia.org/wiki/Taxicab_geometry
Gerben Jacobs September

답변:


5

나는 제한된 Dijkstra가 정확하게 당신이 사용하고 싶은 것이라고 생각합니다. Dijkstra가 두 점 사이의 거리를 찾는 방법은 원점 노드에서 모든 노드까지의 거리를 매핑 한 다음이 거리 맵에서 가장 짧은 경로를 '선택'하는 것입니다. 특정 지점에 대한 경로가 아니라 출력으로 생성 된 거리 노드 그래프를 원한다는 점을 제외하고는 사실상 동일한 작업을 수행하려고합니다.

수정하려는 한 가지 방법은 이미 최대 이동 범위를 초과 한 노드로부터의 거리 계산을 건너 뛰는 것입니다. 그런 다음 장치가 이동할 수있는 모든 노드의 노드 그래프와 경계선을 가지므로 이동 허용량보다 거리가 큰 노드를 잘라내십시오.

비올라.

다시 말해서, 당신이 당신의 질문에 묘사 한 것은 당신이해야 할 것입니다. 또한 더 이상의 계산을 수행 할 필요없이 출력을 사용하여 경로 찾기를 수행 할 수 있다는 이점이 있습니다.


이 경우 Dijkstra는 과도하다고 생각합니다. OP는 모든 가능한 이동 목적지에 대한 경로가 필요하지 않으며, 에이전트가 도착할 수 있는지 여부에 대한 예 / 아니오 답변입니다. 사용자가 경로를 선택하면 나중에 경로를 계산할 수 있습니다.
Michael Kristofik

목적지가 결정된 후 경로를 계산하기 위해 Dijkstra의 알고리즘을 사용하는 비용은 경로를 위해 A *와 같은 휴리스틱 접근법을 사용하지 않는 한, 경로를 사전에 사용한 것과 거의 동일합니다. Dijkstra는 '어디로 갈 수 있습니까?'와 '어떻게 갈 수 있습니까?' 또한 이동 비용을 변경하는 환경에 합병증을 추가 할 수 있지만 애플리케이션에는 불필요 할 수 있습니다. 또한 접근 방식이 잘 문서화되어있어 구현 자에게 도움이됩니다.
TASagent

1
Mario의 답변을 살펴보면 실제로 거리를 뒤집는 것을 제외하고 Dijkstra의 알고리즘을 설명하고 Dijkstra는 언급하지 않습니다.
TASagent

1
Dijkstra라고는 말할 수 없습니다. 왜냐하면 당신은 실제로 가장 짧은 경로를 찾고 있지 않거나 특정 지점에 도달하려고하지 않기 때문입니다. 그것은 본질적으로 Dijkstra의 알고리즘의 첫 번째 부분이지만, 사실입니다. Dijkstra를 사용하는 문구 문제는 오해의 소지가있을 수 있으며 이것이 마이클을 혼란스럽게 만드는 것이라고 생각합니다. 그는 아마도 당신이 각 필드 / 셀마다 한 번 Dijkstra를 사용하도록 제안했다고 생각했습니다.
마리오

1
이 접근법은 잘 작동하고 장애물을 처리하기가 매우 쉽습니다.
NRaf

12

내가 지금 생각할 수있는 가장 간단한 (그리고 아마도 가장 순진한) 접근 방식 :

  • 캐릭터에서 시작하여 모든 주변 필드를로 표시하십시오 steps - 1.
  • 반복 처리는 이상 새로 필드를 표시하고 다시 한 번 그들의 주변 필드 표시 할 steps - 1경우 steps새 필드가 이미 높은 숫자를하지 않는 한, 현재 필드의 스텝 번호가 될 것입니다.
  • 단계가 부족해질 때까지 마지막 단계를 반복하십시오.

1
이 알고리즘의 이름은 Flood Fill 입니다.
Michael Kristofik

6
@MichaelKristofik : 나는 그것을 폭 넓은 검색 이라고 부를 것이다 . 홍수 채우기는 거리를 추적하지 않습니다.
BlueRaja-대니 Pflughoeft

2

당신이 찾고있는 것은 Manhattan Distance 일 것 입니다. 장애물이 없다고 가정하면 다음과 같은 경우 단순히 사각형에 도달 할 수 있다고 말할 수 있습니다.

| toX-fromX | + | toY-fromY | <maxMoveDistance

나중에 장애물이있을 경우이 알고리즘이 올바른 방향이 아닐 수도 있습니다. 그것을 적응시키는 한 가지 가능한 방법은 장애물에 '그림자'를 던지고 가장 가까운 지점에서 재평가하는 것을 포함 할 수 있습니다.

편집 (지금 조금 여유 시간이 있기 때문에) :

'그림자'는 다음과 같은 의미입니다. 0이 도달 가능한 사각형이면 C는 문자이고 X는 장애물입니다.

 012345678
0    0
1   00
2  000X
3 000C000
4  00000
5   000
6    0
 012345678

(5, 2)는 장애물이므로 x> = 5 AND y <= 2로는 아무것도 얻을 수 없다고 가정합니다. 그런 다음 다른 사각형에서 다시 계산할 수 있습니다. (5, 1)로 가려면 (4, 1)에서 맨해튼 거리를 계산하고 그 문자에서 (4, 1)까지의 거리가 플레이어의 이동 거리보다 작은 지 확인할 수 있습니다.

이것은 매우 사소한 예이지만 여러 장애물 및 / 또는 약간 더 긴 이동 범위가있는 경우 복잡성을 처리 할 수 ​​있어야합니다.

프로그래밍 복잡성이나 실행 효율성 측면에서 실제로 홍수로 가득 채우는 것보다 더 나을지 여부에 대한 단서는 없습니다. 문제를 해결하는 더 흥미로운 방법처럼 보였습니다.


그림자를 드리 우면 무슨 뜻입니까?
NRaf

1
설명을 위해 편집되었습니다.
Tin Man
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.