您可以使用基于二维数组的类,以及一些额外的方法来计算邻居。
在标准数组中,单元格 E 与 B、D、F 和 H 共享边
+-----+-----+-----+
| | | |
| A | B* | C |
| | | |
+-----+-----+-----+
| | | |
| D* | *E* | F* |
| | | |
+-----+-----+-----+
| | | |
| G | H* | I |
| | | |
+-----+-----+-----+
如果您想象将交替列替换半个单元格;
+-----+ +-----+
| | | |
| A +-----+ C |
| | | |
+-----+ B* +-----+
| | | |
| D* +-----+ F* |
| | | |
+-----+ *E* +-----+
| | | |
| G* +-----+ I* |
| | | |
+-----+ H* +-----+
| |
+-----+
现在单元格 E 与 B、D、F、G H I 共享边。事实上,这种排列方式与六边形网格相同 - 只是形状不规则的六边形。如果我的 ASCII 艺术技能可以达到,方块可以重新绘制为十六进制。
当然,您不能在物理上移动网格,但您可以提供控制对网格的访问并实现相邻单元计算的方法。
+-----+-----+-----+
| | | |
| A | B* | C | B = E - 1xRowLength
| | | | D = E - 1
+-----+-----+-----+ F = E + 1
| | | | G = E + 1xRowLength - 1
| D* | *E* | F* | H = E + 1xRowLength
| | | | I = E + 1xRowLength + 1
+-----+-----+-----+
| | | |
| G* | H* | I* |
| | | |
+-----+-----+-----+
hexGrid.listNeighbors(E) = B,D,F,G,H,I
hexGrid.NeighborAbove(E) = B
hexGrid.NeighborAboveLeft(E) = D
hexGrid.NeighborAboveRight(E) = F
hexGrid.NeighborBelowLeft(E) = G
hexGrid.NeighborBelowRight(E) = I
hexGrid.NeighborBelow(E) = H
etc