在C中生成/创建六边形网格

因此,我试图在C中为游戏制作六边形网格。 我真的很愚蠢,建立在从哪里开始。 有人有主意吗。

编辑:我需要大约15-20个六角形的握把形状全部加入,像游戏板。 对于我正在努力的游戏。 对不起,不清楚

绝对。 尽管它们有奇怪的形状,但六边形仍然可以包含在您通常的多维数组中,以备将来使用(我假设你会想要把东西放在你的六边形中)。 至于绘制它们,它很简单。 角度之和=(6-2)* 180 = 4 * 180 = 720.一个角度是720/6 = 120度。 首先计算最左边角度的Y位置,它等于√(hexagonSide - hexagonWidth * hexagonWidth) 。 我相信你能算出hexagonWidth ,对吗? 好的,现在相对于最后一个的X位置将为0.您需要将Y位置偏移六边形高度的一半,向上或向下取决于row * col是偶数还是奇数。 由于您知道六边形的宽度,因此您可以使用相反角度的坐标。 旋转120°并重复。

在我继续之前,这应该在控制台中吗? 还是真正的图形?

那么让我们直截了当,游戏将在控制台上播放? 是的,现在你需要建立你的数据结构,最明显的是节点。

节点

每个六边形是具有六个边缘的节点。

 typedef struct Node { void *object; /* Pointer to object */ Node *node_array; /* Pointer to node_array with 'node_count' nodes */ int node_count; /* size of node_array */ } Node; 

如何初始化和连接节点结构

想象一下以下六边形:

  /\ | | \/ 

它有以下边缘,东北,东,东南,西南,西和西北。 接下来观察它们的排列方式(10,11和12以hex表示,以便它们可以放在一个空间中):

 // 0 1 2 3 // 4 5 6 7 8 // 9 ABC 

所以0将通过它的SOUTHEAST链接链接到5 ,并通过它的SOUTHEAST链接链接到4 。 还要注意行如何在奇数和偶数元素之间交替。 让我们调用{0, 1, 2, 3} 行[0]{4, 5, 6, 7, 8} 行[1] 。 我们称之为5×3 hexmap。 创建此数组的最简单方法是使用malloc(sizeof(Node) * width * height)

连接节点

首先让我指出每个偶数行(0,2,4,…)都有width-1元素。 但是还有更多,此行上的每个元素(x,y)将链接到数组中的以下元素:

  • (x + 1,y-1) – 东北
  • (x + 1,y) – EAST
  • (x + 1,y + 1) – 东南
  • (x,y + 1) – 西南
  • (x-1,y) – WEST
  • (x,y-1) – 西北

其他行上的元素(如{ 4, 5, 6, 7, 8 })将具有width元素,其中元素(x,y)链接到以下内容:

  • (x,y-1) – 东北
  • (x + 1,y) – EAST
  • (x,y + 1) – 东南
  • (x-1,y + 1) – 西南
  • (x-1,y) – WEST
  • (x-1,y-1) – 西北

当尝试将(x1,y1)与(x2,y2)链接时,确保0 <= x < width0 <= y < height

记住......

您的数组在每两行(row [0],row [2]等)的末尾包含一个未使用的元素。 此外,您可能希望为它们提供某种标签索引,以便您可以将播放器引用给它们。 你可以将它们标记为(x,y)对,或者用它们的索引数字标记,这完全取决于你。 (x,y)对非常容易,因为它将直接映射到它们存储的数组。