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