Czy kwadratowe lub heksagonalne siatki są lepsze do wyszukiwania ścieżek?

17

Czy jest jakaś znacząca różnica między użyciem kwadratowej lub heksagonalnej siatki dla obszaru przeszukiwanego przez algorytm wyszukiwania ścieżki? Innymi słowy, jest kwadratowy lub sześciokątny lepszy, a jeśli tak, to dlaczego.

Edwin Earl Ross
źródło
4
Pomyśl, że powinieneś użyć tego, co pasuje do twojej gry;)
Andrew Russell

Odpowiedzi:

19

Główną kwestią przy podejmowaniu decyzji, czy używać siatek kwadratowych vs heksadecymalnych, nie powinna być łatwość implementacji sztucznej inteligencji - algorytmy wyszukiwania w pierwszej kolejności i w pierwszej kolejności są w zasadzie takie same, bez względu na rodzaj posiadanego wykresu.

Jest to raczej problem z grą, który powinien wziąć pod uwagę projektant gry. Kwadratowe siatki są bardziej dostępne dla rynku masowego (tablice sześciokątne zwykle wyglądają „maniakalne”), aw świecie kontrolek góra / dół / lewo / prawo jest o wiele bardziej intuicyjne poruszanie się po kwadratach niż heksy z punktu widzenia interfejsu użytkownika. Kwadratowe siatki również nieco bardziej ograniczają ruch; zakładając ruch ortogonalny (a nie ukośny), potrzeba 4 ruchów, aby obejść przeszkodę o jednym kwadracie, w porównaniu do 3 ruchów na siatce heksadecymalnej. Z punktu widzenia programowania, hexy są również nieco łatwiejsze do implementacji, ale nie chodzi tu o algorytmy wyszukiwania, ponieważ kwadratowa siatka jest równa dwuwymiarowej tablicy, ale siatka heksadecy tak naprawdę nie jest odwzorowana na standardową strukturę danych.

Wadą kwadratowych siatek jest to, że ruch nigdy nie wydaje się właściwy. Poruszanie się po przekątnej powinno zająć sqrt (2) punkty ruchu, ale w praktyce jest to albo 1 ruch (co sprawia, że ​​chodzenie po przekątnych jest szybkie i rzadko ma powód, aby chodzić ortogonalnie), albo 2 ruchy (co sprawia, że ​​ruch po przekątnej jest zbyt wolny ). W przypadku siatek heksadecymalnych odległość ruchu jest o wiele bardziej intuicyjna, ponieważ zawsze jest taka sama odległość od jednego heksa do drugiego, bez względu na wybraną ścieżkę.

Ian Schreiber
źródło
4
+1. To jest decyzja projektowa, a nie decyzja AI. Jeśli chcesz sześciokątnych siatek, siatka z przesuniętymi kwadratami, taka jak www-cs-students.stanford.edu/~amitp/game-programming/grids/..., może być mniej zastraszająca dla zwykłych graczy, a matematycznie równoważna sześciokątom. Jest to również wygodna reprezentacja w pamięci.
2
+1 za zdanie „Kwadratowe siatki są bardziej dostępne dla rynku masowego (tablice sześciokątne zwykle wyglądają„ geeky ”)”: D
Kornel Kisielewicz
Edwin nie pyta, co jest lepsze w grze opartej na siatce. Pyta, co jest lepsze dla AI, aby użyć kwadratu lub sześciokąta. Świat i sama rozgrywka nie muszą ograniczać się tylko do tych, na których węzłach szuka AI.
AttackingHobo
Wdrożyłem turowe gry strategiczne z siatką szesnastkową i kwadratową, i nie ma absolutnie żadnej niezbędnej różnicy pod względem złożoności ścieżki. Zmieniłem nawet jedną grę z mapy heksadecymalnej na mapę kwadratową i (oprócz renderowania) jedyną zmianą, którą musiałem wprowadzić, była metoda MapLocation :: GetDistance (), która obliczała odległość między dwoma sektorami. Musiałem po prostu dostosować obliczenia, aby poradzić sobie z każdym przesunięciem nieco wiersza. W obu przypadkach można użyć tej samej reprezentacji w pamięci. Tak więc, jak powiedzieli inni, to naprawdę problem projektowy.
Mike Strobel
4
Na marginesie, heksy można odwzorować na tablicę dwuwymiarową. Wyobraź sobie kwadratową siatkę, a następnie przesuń każdą parzystą kolumnę o pół kroku w dół. Masz teraz przesuniętą kwadratową siatkę, która jest izomorficzna do siatki heksadecymalnej.
Asmor
3

W żadnym wypadku nie jestem ekspertem od sztucznej inteligencji, ale różnica powinna być znikoma. Siatki kwadratowe są nieco szybsze (4 połączenia na węzeł zamiast 6), ale tak naprawdę nie jest to czynnik ograniczający w środowisku algorytmicznym. W zależności od algorytmu, którego planujesz użyć, kod może być nieco bardziej złożony dla siatki heksadecymalnej, ponieważ obliczenie współrzędnych jest nieco bardziej skomplikowane, a trudniej jest użyć rodzaju skrótów czterokrotnie / ośmiokątnych, które moim zdaniem są często używane w poszukiwaniu ścieżek.

Ale w prostym świecie, takim jak turowy poziom strategii, różnica między dwoma układami nie powinna mieć większego znaczenia; kwadratowa siatka będzie nieco prostsza i szybsza.

Gregory Avery-Weir
źródło
5
„Siatki kwadratowe są nieco szybsze (4 połączenia na węzeł zamiast 6)” - chyba że możesz podróżować wzdłuż przekątnych, w którym to przypadku jest to 8 połączeń w porównaniu z 6.
Ian Schreiber
Touche. Masz całkowitą rację; oczywiście prawdopodobne są połączenia diagonalne.
Gregory Avery-Weir
3

Jest jedna praktyczna różnica, którą mogę przemyśleć w zakresie planowania ścieżki. Przemieszczanie się od środka komórki heksadecymalnej do jednego z sąsiadów jest zawsze tej samej odległości, natomiast jeśli pozwalasz na ruch ukośny, nie dotyczy to kwadratów.

Clodéric
źródło
0

Ten przewodnik na temat sześciokątów jest niesamowity. Część o wyszukiwaniu ścieżek zawiera interaktywny przykład i kilka informacji o tym, jak stosować kwadratowe wyszukiwanie ścieżek.

Jeśli korzystasz z graficznego wyszukiwania ścieżek, takiego jak A * lub algorytm Dijkstry lub Floyd-Warshall, wyszukiwanie ścieżek na siatkach szesnastkowych nie różni się od wyszukiwania ścieżek na siatkach kwadratowych.

  • Sąsiedzi Przykładowy kod, który podaję w samouczku odnajdywania ścieżek, wywołuje graph.neighbors, aby uzyskać sąsiadów z lokalizacji. W tym celu użyj funkcji w części dotyczącej sąsiadów. Odfiltruj sąsiadów, którzy są nieprzejezdni.
  • Heurystyczny. Przykładowy kod dla A * wykorzystuje funkcję heurystyczną, która podaje odległość między dwiema lokalizacjami. Użyj formuły odległości, skalowanej w celu dopasowania do kosztów ruchu. Na przykład, jeśli koszt ruchu wynosi 5 na heks, pomnóż odległość przez 5.
znak
źródło