【问题标题】:Representing a Hex Map in Java用 Java 表示一个十六进制映射
【发布时间】:2011-03-30 21:17:34
【问题描述】:

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

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

任何想法,我已经阅读了很多关于此的文章,但由于某种原因我仍然不明白,可能是因为这都是想法,我不知道如何实现它。

【问题讨论】:

  • 好的,根据下面的答案,我决定制作单元类,并引用每个相邻单元。我还参考了相邻的边缘和点。这个想法是,我可以向一个单元格询问其相邻边缘,而另一个单元格为其询问,比较两者以获得它们之间的边缘,但是有没有更简单的方法来获得边缘或点。

标签: java map hex


【解决方案1】:

二维数组将强化矩形网格的概念。

为什么不定义一个Cell 类,从而引用相邻单元格:

public class Cell {
   private Cell north;
   private Cell south;
   private Cell northWest;

   // etc.
}

对于网格边界上的Cells,引用将为空。

您必须通过遍历行来构建网格,创建每个 Cell 并根据需要将其绑定到其邻居。

【讨论】:

  • 是的,抛弃二维数组,使用三邻元数据结构。
  • 有趣的想法,这仍然可以让我得到一个单元格的邻居等,拦截的点和边缘呢。
  • “你必须通过遍历行来构建网格,创建每个单元格并将其与相邻的单元格适当地联系起来。”请提供更多信息,我将如何处理。
  • @Tempus35:您的二维数组可能仍处于构建阶段(可能是为了以后更容易从外部访问),并在构建网格时对其进行迭代。因此,您可以回到该场上已经存在的较早的六角形,并将它们连接到您的新六角形。
【解决方案2】:

您可以使用基于二维数组的类,以及一些额外的方法来计算邻居。

在标准数组中,单元格 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

【讨论】:

    猜你喜欢
    • 2016-02-06
    • 2019-02-02
    • 1970-01-01
    • 2021-06-12
    • 2021-07-12
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多