Скажем, я создаю настольную игру с гекстильной сеткой, например Settlers of Catan :
Обратите внимание, что каждая вершина и ребро могут иметь атрибут (дорога и населенный пункт выше).
Как мне создать структуру данных, представляющую эту доску? Каковы шаблоны для доступа к соседям, краям и вершинам каждой плитки?
data-structures
оплачиваемый ботаник
источник
источник
Ответы:
Амит Патель опубликовал потрясающую страницу по этой теме. Он настолько всеобъемлющий и замечательный, что должен быть окончательным ответом на этот вопрос: гексагональные сетки.
источник
Такую сетку можно представить в виде двумерного массива:
Если
это номер один со своими соседями в шестнадцатеричной сетке, тогда вы можете поместить его в 2D-массив следующим образом:
Очевидно, что соседство в этой сетке определяется не только соседством по горизонтали или вертикали, но и использованием одной диагонали.
Однако вы также можете использовать график, если хотите.
источник
В этой статье рассказывается, как настроить игру изомерной / гексагональной сетки. Я рекомендую вам взглянуть на
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
раздел и раздел движения. Хотя он отличается от того, что вы ищете, он может помочь вам сформулировать, как делать то, что вы хотите.источник
Я много имел дело с проклятиями. В подобных случаях вы отслеживаете каждую из 6 точек границ гекса. Это позволяет довольно легко его нарисовать.
У вас будет единый массив объектов, представляющих гексы. Каждый из этих шестнадцатеричных объектов также имеет 6 «указателей» (или индекс другого массива), указывающих на другой массив «сторон». То же самое и с «вершинами». Конечно, у вершин будет 3 указателя на соседние гексы, а на сторонах - 2.
Итак, шестиугольник может быть примерно таким: X, Y, Point (6), Vertices (6), Sides (6).
Затем у вас есть шестнадцатеричный массив, массив вершин и боковой массив.
Тогда довольно просто найти вершины / стороны шестиугольника или чего-то еще.
Когда я говорю «указатель», это может быть целое число, указывающее на элемент в вершине или боковом массиве, или что-то еще. И, конечно, массивы могут быть списками или чем-то еще.
источник
Вы также можете попытаться «выровнять» ряды карты. В этом примере это будет:
Иногда удобнее располагать строки в одну строку: P
источник
Я бы предложил что-то вроде следующего (я буду использовать объявления в стиле Delphi):
Каждый шестиугольник имеет шесть ребер и шесть вершин. Каждое ребро отслеживает свои два смежных гекса, а каждая вершина отслеживает свои три смежных гекса (гексы на краях карты будут особым случаем).
Конечно, есть много вещей, которые вы могли бы сделать по-другому. Вы можете использовать указатели, а не массивы, вы можете использовать объекты, а не записи, и вы можете хранить свои гексагоны в двумерном массиве, как предлагали другие ответчики.
Надеюсь, это может дать вам некоторые идеи о том, как к этому подойти.
источник
Мы реализовали Settlers of Catan AI для проекта класса и изменили код из этого ответа (который был ошибочным), чтобы создать доску с постоянным случайным доступом по времени к вершинам и ребрам. Это была забавная проблема, но плата заняла много времени, поэтому на случай, если кто-то все еще ищет простую реализацию, вот наш код Python:
источник
Я сижу здесь «в свободное время, кодирую для развлечения» с проклятиями. А происходит это так ... Я расскажу вам, как это выглядит словами.
Это просто идея, как я буду над этим работать.
источник
Вы можете создать 2D-массив, а затем рассматривать допустимые позиции как:
Для каждой ячейки ее соседями будут:
Иллюстрация: шестигранная сетка
Знаки x - это шестиугольники. x, диагональные друг к другу, являются соседями. | связывает вертикальных соседей.
источник