用Java表示十六进制映射

时间:2011-03-30 21:17:35

标签: java map hex

好的,所以我可能只是遗漏了一些东西,但我正在尝试制作一个六角形的地图,就像在文明中一样。我们的想法是将每个十六进制作为具有各种属性(即颜色,类型等)的对象。然后有一个所有这些不同的六角板。将有3种板类型,矩形,圆形,三角形。

我遇到的问题是如何在数据类型中表示每个十六进制。我认为一个二维数组将是要走的路,如果我只需要知道十六进制位置本身就没问题。但是我需要知道每个十六进制的顶点和边缘,以便我可以做这些在这些到六边形之间的边缘添加这个。这让我很困惑。如何以一种方式表示每个十六进制的所有边和点,我可以要求连接到该点或边缘的邻居等。

任何想法,我已经阅读了很多关于此的文章,但由于某些原因我仍然不明白,也许是因为这是所有的想法,我没有任何线索来实现它。

2 个答案:

答案 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