Хитрость заключается в назначении координат каждому блоку.
Что вы можете сделать, так это представить себе простую квадратную сетку 4x4 с координатами x в диапазоне от 0 до 4 и y от 0 до 3.
Алгоритм рисования отвечает за смещение нечетных ячеек х (1 и 3) на половину шестиугольного радиуса, чтобы они правильно совмещались.
Подумайте о isAdjacent(other)
методе для каждой ячейки. В квадратной сетке вы можете обосновать isAdjacent с помощью тривиальной проверки: if self.x == other.x & plusmn; 1 и self.x == other.x & plusmn; 1. Есть 8 соответствующих комбинаций -1, 0, 1 для x, -1, 0, 1 для y, которые нужно проверить.
В гексагональной сетке смежность немного отличается. Если self.y == other.y & plusmn; 1 и self.x == other.x является его частью. Но смежность x зависит от того, в каком столбце находится self. Если x является четным столбцом (0, 2, 4), то соседняя ячейка находится в нечетном столбце, что означает self.y == other.y или self.y == other.y + 1. Аналогично, если x нечетный столбец (1, 3), то соседняя ячейка находится в четном столбце. Я оставлю это на ваше усмотрение, чтобы поработать с остальной частью Соседства.
"А как насчет краев"? Легко. Включите их в свой метод grid.get()
. Для координат вне пределов вернуть специальную пустую ячейку, которая никогда не занята. Это делает сравнение проще.
Хорошо, учитывая isAdjacent()
как мне найти подключенный путь, горизонтальный или вертикальный?
На самом деле вы хотите, чтобы две формы перечисления были смежными. Вы хотите создать enum_adjacent_vert(y_offset)
и enum_adjacent_horiz(x_offset)
. Для перечисления вертикально смежных получим три значения (self.x-1, self.y+y_offset), (self.x, self.y+y_offset), (self.x+1, self.y+y_offset)
. Чтобы перечислить соседние по горизонтали, укажите два значения, если self.x находится в нечетном столбце: (self.x+x_offset, self.y), (self.x+x_offset, self.y+1)
. Если self.x находится в четном столбце: (self.x+x_offset, self.y), (self.x+x_offset, self.y-1)
.
Это относительно просто. Учитывая крайнюю ячейку, вы хотите пройти "поперек" или "вниз" по доске к соседним ячейкам в определенном направлении.
Допустим, вы идете слева направо (увеличивая х). Вы хотите найти соседнюю ячейку в списке enum_adjacent_horiz
. Чтобы перейти сверху вниз (с увеличением y), вы найдете соседнюю ячейку в списке enum_adjancent_vert
.