타워 방어 게임을위한 동적 경로 알고리즘


16

타워 디펜스를 만들고 있는데 좋은 경로 알고리즘이 필요합니다.

Dijkstra에 대해 생각했지만 역동적 일 수있는 것이 필요합니다. 전체 재 계산없이 하나의 모서리를 제거하거나 추가 할 때 자체적으로 업데이트 될 수 있어야합니다.

도움이된다면 C #으로 코딩하고 있습니다.

답변:


8

찾고자하는 중요한 것이 없다면 A *를 사용하는 것이 좋습니다.


A *에 익숙하지 않은 경우 동적으로 변화하는 환경을 어떻게 해결합니까? 매 프레임마다 다시 계산 하시겠습니까? 충돌시?
Justin L.

1
일반적으로 이와 같은 간단한 게임에서 각 프레임의 경로를 다시 지정합니다. 맵 그리드는 매우 작을 것이고 최대 수백 명의 에이전트 수입니다. 막대한 성능 문제가 발생하면 나중에 필요할 때를 제외하고 트리를 다시 작성하지 않으면 나중에 최적화 할 수 있습니다.
coderanger

6
그것이 느리다면, 나의 권장 사항 : 모든 폭도의 경로를 계산하지 마십시오. 아마 그들은 모두 같은 길을 가고 있습니다. 나는 새로운 탑 배치에 대해서만 계산 하고 탑은 현재 경로에 있습니다. 그럼에도 불구하고, 블록 광장 앞의 경로에있는 몬스터들에 대해서는 재 계산을 수행하십시오. 그런 다음 길 찾기를 더 짧게 만들기 위해 이미 그곳에서 길을 알고 있기 때문에 차단 된 광장을 따라 제곱하는 길을 찾도록 제한 할 수 있습니다.
seanmonstar

4
실제로 "mob"는 "모바일 객체"에 대한 산업 (및 MMO / MUD 플레이어) 용어입니다.

3
그럼에도 불구하고, 그것은 MUD1로 거슬러 올라가는 오랜 역사를 지니고 있으며 많은 출판물에 등장 할 정도로 표준입니다. en.wikipedia.org/wiki/Mob_%28computer_gaming%29

19

비슷한 문제를 해결해야했습니다. 끊임없이 변화하는 "비용"과 장벽이있는 큰 미로 같은 그리드에서 길을 찾는 것입니다.

문제는 타워 디펜스 게임에서 경로를 해결해야하는 엔티티 수는 일반적으로 그래프의 노드 수보다 훨씬 큽니다. A *는 이것을 처리하기에 가장 적합한 알고리즘 이 아닙니다 . 무언가가 바뀔 때마다 새로 해결해야하기 때문입니다. 하나의 경로 만 찾으면 적절하지만 제 경우에는 다른 위치에 나타날 수 있고 각각 자체 경로가있는 엔티티를 처리 할 수있었습니다.

플로이드 - Warshall의 내 경우에 내가 노드 변경, 그것은 때마다 모든 이웃 노드에 대한 비용을 다시 계산하는 사용자 정의 알고리즘을 쓴하지만 알고리즘이 훨씬 더 적합하고 있는 경우 이웃은 호출이 변경되었습니다 재귀 적으로 그들.

게임을 시작할 때 모든 "목표"노드에서이 알고리즘을 실행합니다. 그런 다음 단일 노드가 변경 될 때마다 (예를 들어, 통과 할 수 없게 됨) 해당 노드에서 노드를 시작하면 변경 사항이 영향을받는 모든 노드에 전파되어 중지됩니다. 따라서 전체 재 계산이 필요하지 않으며 알고리즘은 경로 찾기가 필요한 엔티티 수와 완전히 독립적입니다.

내 알고리즘은 기본적으로 (의사 코드)와 같습니다.

update_node method in Node class:
    $old <- $my_score
    find $neighbor node among all neighbors such that
        $neighbor.score + distance_to($neighbor) is minimal
    $my_score <- $neighbor.score + distance_to($neighbor)
    $next_node <- $neighbor
    if ($my_score != $old)
        for each $neighbor
            $neighbor.update_node()

노드가 대상인지 또는 어떤 종류의 장벽인지에 따라 초기 점수.


1
또한 CPU로드가 변경 될 때이를 프레임에 동적으로 쉽게 확산시킬 수 있습니다.
tenpn

A *가 올바른 알고리즘이 아닌 경우 +1
Ricket

5

TD에서 사용한 경로 알고리즘은 게임에 포함 된 개체 수로 인해 일반 A * 경로에서 거꾸로되었습니다. 목표에서 나쁜 녀석으로 라우팅하는 대신 목표에서 보드의 모든 빈 사각형으로 라우팅했습니다.

시간이 오래 걸리지 않으며 "비용"을 찾을 때까지 계속 보드를 반복하고 차단 된 경로에 대해 좋은 피드백을 제공합니다 (해당하는 경우). Floyd의 알고리즘을 사용하면 데이터 종속 조회를 수행하지 않고 스트림의 데이터를로드하고 작동하기 때문에 A *에 비해 빠르고 캐시 친화적입니다.

보드를 무한 비용으로 설정 한 다음 목표 제곱을 비용 0으로 설정 한 다음 보드를 반복하여 인접 셀 비용이 현재 비용에 여행 비용을 더한지 확인하십시오. 여행 비용은 휴리스틱을 넣는 곳입니다 (제 경우 대각선 여행 비용은 무한하지만 탑을 통한 여행 비용은 높았으므로 탑을 통해 먹을 수는 있었지만 선택)

비용 그리드를 확보 한 후에는 셀에서 가장 가파른 비용 기울기를 테스트하여 그로부터 "흐름"그리드를 신속하게 구축 할 수 있습니다. 그들은 길을 찾을 필요가 없기 때문에 방대한 양의 나쁜 녀석들에게 정말 효과적입니다.

또 다른 이점은 방해물을 조정할 때마다 (또는 게임에서 크립이 타워 중 하나를 통과 할 때)이 작업 만 수행하면된다는 것입니다. 크리프 / 몹이 필드에 들어갈 때마다 (수천 몹과 초당 수십 명이 상당히 어려웠을 것).


4

길 찾기는 빠르며 일반적인 타워 방어 게임과 비슷한 크기로 무언가가 바뀔 때마다 정식 A * 또는 Dijkstra 패스를 실행하는 데 아무런 문제가 없습니다. 완전히 새로 고치기 위해 1 밀리 초 미만으로 잘 이야기하고 있습니다. 모든 종류의 적응 형 길 찾기는 끔찍하게 복잡해집니다. 세계에서 가장 큰 타워 방어 그리드를 만들지 않는 한 간단하게 수행하십시오.


1
길 찾기가 빠르지 않은 휴대 전화에서 타워 디펜스가 유명하다는 점은 주목할 가치가 있습니다. 특히 Sidekick 또는 Android 1.6 장치와 같은 약간 오래된 장치에서.
seanmonstar

1
개발자들은 수십 년 동안 훨씬 덜 강력한 하드웨어에서 A * 및 Dijkstra와 같은 경로 찾기 알고리즘을 사용해 왔습니다 (게임 보이). 물론 구현이 합리적으로 효율적이라면 게임에 적합한 화면을 갖기에 충분한 새로운 전화기에는 문제가 없어야합니다. 일부 멋진 최적화가 여기에있다 설명 : harablog.files.wordpress.com/2009/06/beyondastar.pdf
마이크 스트로벨

+1. 내 DTD 클론을 개발할 때도 같은 결론에 도달했습니다. 경로를 증분 업데이트하려고 시도했지만 알고리즘이 너무 복잡해졌습니다. 그것에 하루를 보낸 후, 나는 각 변화에 대한 완전한 재 계산으로 전환했습니다. 그것은 효과가 있었고, 약간의 조정으로 나는 그것을 충분히 빨리 만들 수있었습니다.
finnw


2

이것은 솔루션에 과잉 일 수 있지만 앞으로 전달하는 대신 뒤로 라우팅하는 것을 생각하십시오.

TD 게임에서 적들은 일반적으로 특정 목표를 달성하려고합니다. 해당 목표에서 첫 번째 적에게 뒤로 향한 다음 해당 경로를 캐시하십시오. 후속 적을위한 경로 생성시 첫 번째 경로를 시작점 등으로 사용하십시오. 적의 적발 지점이 여러 개이거나 목표가 여러 개인 경우, 미리 캐시 된 경로의 범위를 시작하십시오.


1

일반적으로 ai가 직접 경로를 따르는 수준에 따라 웨이 포인트 경로 찾기가 td 게임에 가장 적합 할 것입니다. 기본적으로 노드 또는 웨이 포인트를 설정 한 다음 "ai"가 웨이 포인 방향으로 향하고 걸어 가면, 다음 웨이 포인트로 이동하여 마주보고 그 방향으로 이동합니다.


이것은 보드 측면에 타워를 배치 할 수있는 게임이 아닌 경로 측면에만 터렛을 배치 할 수있는 TD 게임에만 적용됩니다.
Iain

예, 처음에는 저자가 원하는 유형을 지정하지 않았으므로 동적이지 않은 것으로 가정했습니다.
Loktar

1

누군가가 물었으므로 플레이어는 탑을 놓거나 탑을 제거 할 때마다 경로를 다시 계산하여 역동적으로 변화하는 환경을 해결하고 그 경로를 그 동안 메모리에 저장합니다. 모든 프레임에서 환경이 변하지는 않습니다.

일부 TD 게임에는 경로가 설정되어 있으며 타워를 배치 할 수 없으므로 경로를 쉽게 찾을 수 있습니다. 경로를 하드 코딩하고 차단하지 않도록하십시오 :)


1

간단한 해결책은 속이는 것입니다.

막 다른 곳이 없도록 맵을 미리 설계하십시오. 그런 다음 각 교차점에 캐릭터가 경로를 선택하도록하는 트리거를 추가하십시오 (예 : 항상 왼쪽으로 회전, 항상 오른쪽으로 회전 또는 임의).


1
아마도 그는 사용자가 즉석에서지도를 만드는 Desktop TD와 같은 것에 대해 이야기하고있을 것입니다. 여전히 좋은 해결책이 될 수있는 "멍청한"적들에게는 더 나은 AI를 가진 적들을 약간의 난이도 향상으로 만들 수 있습니다.
coderanger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.