好的,所以我可能只是遗漏了一些东西,但我正在尝试制作一个六角形的地图,就像在文明中一样。我们的想法是将每个十六进制作为具有各种属性(即颜色,类型等)的对象。然后有一个所有这些不同的六角板。将有3种板类型,矩形,圆形,三角形。
我遇到的问题是如何在数据类型中表示每个十六进制。我认为一个二维数组将是要走的路,如果我只需要知道十六进制位置本身就没问题。但是我需要知道每个十六进制的顶点和边缘,以便我可以做这些在这些到六边形之间的边缘添加这个。这让我很困惑。如何以一种方式表示每个十六进制的所有边和点,我可以要求连接到该点或边缘的邻居等。
任何想法,我已经阅读了很多关于此的文章,但由于某些原因我仍然不明白,也许是因为这是所有的想法,我没有任何线索来实现它。
答案 0 :(得分:4)
二维数组将强化矩形网格的概念。
为什么不改为定义一个Cell
类,并引用相邻的单元格:
public class Cell {
private Cell north;
private Cell south;
private Cell northWest;
// etc.
}
对于网格边界上的Cells
,引用将为null。
您必须通过遍历行来构建网格,创建每个Cell
并将其绑定到邻居。
答案 1 :(得分:0)
您可以使用基于二维数组的类,以及一些其他方法来计算邻居。
在标准数组中,单元格 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