关键是为每个块分配坐标。
你可以将其视为一个简单的4x4方格,其中x坐标范围在0到4之间,y坐标范围在0到3之间。
绘图算法的责任是将奇数x单元格(1和3)向下偏移半个六边形半径,以便它们正确拼合。
考虑为每个单元格创建一个isAdjacent(other)
方法。在正方形网格中,您可以通过一个微不足道的检查来推理出isAdjacent:如果self.x == other.x ± 1且self.x == other.x ± 1,则为真。需要检查8个相关的组合,包括x的-1、0、1和y的-1、0、1。
在六边形网格中,相邻性有所不同。如果self.y == other.y ± 1且self.x == other.x是其中的一部分。但x相邻性取决于self位于哪一列。如果x是偶数列(0、2、4),则相邻单元格位于奇数列,这意味着self.y == other.y或self.y == other.y + 1。同样,如果x是奇数列(1、3),则相邻单元格位于偶数列。我会让你自己解决isAdjacent的其余部分。
“边缘怎么办?”很容易。将它们包含在您的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)
。要枚举水平相邻,则在自身x为奇数列时产生两个值:(self.x+x_offset, self.y), (self.x+x_offset, self.y+1)
。如果自身x在偶数列中:(self.x+x_offset, self.y), (self.x+x_offset, self.y-1)
。
这相对简单。给定一个边缘单元格,您想要沿着棋盘“横向”或“向下”走到特定方向的相邻单元格。
假设您从左到右(增加x)移动。您想在enum_adjacent_horiz
列表中找到相邻的单元格。要从上到下(增加y),请在enum_adjancent_vert
列表中找到相邻的单元格。