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

时间:2011-05-12 02:46:37

标签: c

所以我试图在C中为游戏制作六边形网格。我真的很愚蠢,从哪里开始。任何人都有任何想法。

编辑:我需要大约15-20个六角形的握把形状全部加入,就像游戏板一样。对于我正在进行的游戏。抱歉不清楚

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

所以,让我们直截了当,游戏将在控制台上播放?是的,现在您需要设置数据结构,最明显的是节点。

节点

每个六边形都是一个有六条边的节点。

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;

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

想象一下以下的六边形:

 /\
|  |
 \/

它有以下边缘,NORTHEAST,EAST,SOUTHEAST,SOUTHWEST,WEST和NORTHWEST。接下来观察它们的排列方式(10,11和12以十六进制表示,以便它们可以放在一个空间中):

//  0 1 2 3
// 4 5 6 7 8
//  9 A B C

因此0将通过5链接与SOUTHEAST相关联,4通过SOUTHWEST链接链接到{0, 1, 2, 3}。还要注意行如何在奇数和偶数元素之间交替。我们打电话给{4, 5, 6, 7, 8} 行[0] ,然后malloc(sizeof(Node) * width * height) 行[1] 。我们称之为 5x3 hexmap。创建此数组的最简单方法是使用width-1

连接节点

首先让我指出每个偶数行(0,2,4,...)都有4, 5, 6, 7, 8个元素。但是还有更多,这一行上的每个元素(x,y)将链接到数组中的以下元素:

  • (x + 1,y-1) - NORTHEAST
  • (x + 1,y) - EAST
  • (x + 1,y + 1) - 东南
  • (x,y + 1) - 西南
  • (x-1,y) - WEST
  • (x,y-1) - NORTHWEST

其他行上的元素(例如{width})将包含0 <= x < width元素,其中元素(x,y)链接到以下内容:

  • (x,y-1) - NORTHEAST
  • (x + 1,y) - EAST
  • (x,y + 1) - SOUTHEAST
  • (x-1,y + 1) - 西南
  • (x-1,y) - WEST
  • (x-1,y-1) - NORTHWEST

尝试将(x1,y1)与(x2,y2)相关联时,请确保0 <= y < height和{{1}}。

记住......

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