Powiedzmy, że tworzę grę planszową z hextile grid, na przykład Settlers of Catan :
Zwróć uwagę, że każdy wierzchołek i krawędź mogą mieć atrybut (droga i osada powyżej).
Jak mógłbym stworzyć strukturę danych reprezentującą tę tablicę? Jakie są wzory dostępu do sąsiadów, krawędzi i wierzchołków każdego kafelka?
data-structures
płatny frajer
źródło
źródło
Odpowiedzi:
Amit Patel opublikował niesamowitą stronę na ten temat. Jest tak obszerna i cudowna, że musi być ostateczną odpowiedzią na to pytanie: siatki sześciokątne
źródło
Taką siatkę można przedstawić w postaci dwuwymiarowej tablicy:
Jeśli
jest numerem jeden z jego sąsiadami w siatce heksadecymalnej, możesz to umieścić w tablicy 2D w następujący sposób:
Oczywiście sąsiedztwo jest określane w tej siatce nie tylko przez to, że sąsiaduje w poziomie lub w pionie, ale także na podstawie jednej przekątnej.
Możesz jednak użyć wykresu, jeśli chcesz.
źródło
W tym artykule opisano, jak skonfigurować grę z siatką izomeryczną / sześciokątną. Polecam zajrzeć do
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
sekcji i sekcji ruchu. Chociaż różni się od tego, czego szukasz, może pomóc ci sformułować, jak robić to, co chcesz.źródło
Dużo zajmowałem się klątwami. W takich przypadkach śledzisz każdy z 6 punktów dla granic heksa. Pozwala to dość łatwo go narysować.
Będziesz mieć pojedynczą tablicę obiektów reprezentujących heksy. Każdy z tych obiektów heksadecymalnych ma również 6 „wskaźników” (lub indeks do innej tablicy) wskazujących na inną tablicę „boków”. To samo dotyczy „wierzchołków”. Oczywiście wierzchołki miałyby 3 wskaźniki do sąsiednich heksów, a boki miałyby 2.
Zatem hex może być czymś w rodzaju: X, Y, Point (6), Vertices (6), Sides (6)
Następnie masz tablicę Hex, tablicę wierzchołków i tablicę boczną.
Wtedy bardzo łatwo jest znaleźć wierzchołki / boki dla hexa lub czegokolwiek.
Kiedy mówię pointer, równie łatwo może to być liczba całkowita wskazująca na element w tablicy wierzchołków lub bocznych lub cokolwiek innego. I oczywiście tablice mogą być listami lub czymkolwiek.
źródło
Możesz także spróbować „spłaszczyć” wiersze mapy. W tym przykładzie byłoby to:
Czasami bardziej przydatne jest umieszczanie wierszy w jednym wierszu: P
źródło
Sugerowałbym coś takiego (użyję deklaracji w stylu Delphi):
Każdy heks ma sześć krawędzi i sześć wierzchołków. Każda krawędź śledzi dwa sąsiednie heksy, a każdy wierzchołek śledzi jego trzy sąsiednie heksy (heksy na krawędziach mapy będą przypadkiem specjalnym).
Oczywiście jest wiele rzeczy, które możesz zrobić w inny sposób. Możesz użyć wskaźników zamiast tablic, możesz użyć obiektów zamiast rekordów i możesz przechowywać swoje heksy w dwuwymiarowej tablicy, jak sugerowali inni respondenci.
Miejmy nadzieję, że może to dać ci kilka pomysłów na temat jednego ze sposobów podejścia.
źródło
Zaimplementowaliśmy AI Settlers of Catan dla projektu klasowego i zmodyfikowaliśmy kod z tej odpowiedzi (który był błędny), aby stworzyć tablicę ze stałym, losowym dostępem do wierzchołków i krawędzi. To był fajny problem, ale tablica zajęła dużo czasu, więc na wypadek, gdyby ktoś nadal szukał prostej implementacji, oto nasz kod w Pythonie:
źródło
Siedzę tu „w wolnym czasie programując dla zabawy” z heksami. I wygląda to tak ... Opowiem wam słowami, jak to wygląda.
To tylko pomysł, jak bym nad tym pracował.
źródło
Możesz utworzyć tablicę 2D, a następnie rozważyć prawidłowe pozycje jako:
W przypadku każdej komórki sąsiadami byłyby:
Ilustracja: Siatka sześciokątna
Znaki x to heksy. x, które są ukośnie względem siebie, są sąsiadami. | łączy pionowych sąsiadów.
źródło