假设我正在构建一个带有六边形网格的棋盘游戏,例如Settlers of Catan:
请注意,每个顶点和边可能都有一个属性(上面的道路和沉降)。
我如何制作代表该板的数据结构?访问每个图块的邻居,边和顶点有哪些模式?
答案 0 :(得分:140)
Amit Patel在此主题上发布了一个惊人的页面。它是如此全面和精彩,它需要成为这个问题的明确答案:Hexagonal Grids
答案 1 :(得分:16)
这样的网格可以用二维数组表示:
如果
2
7 3
1
6 4
5
是其六边形网格中的邻居的第一个,然后您可以将其放入2D数组中,如下所示:
2 3
7 1 4
6 5
显然,在这个网格中不仅通过水平或垂直相邻而且使用一个对角线确定邻居。
如果您愿意,也可以使用图表。
答案 2 :(得分:10)
This article介绍如何设置异构/六角网格游戏。我建议您查看Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
部分和移动部分。虽然它与您正在寻找的不同,但它可以帮助您制定如何做您想要的事情。
答案 3 :(得分:2)
我用hexes处理了很多。在这种情况下,您可以跟踪十六进制边框的6个点中的每一个。这可以让你很容易地绘制它。
您将拥有一个表示十六进制的对象数组。这些十六进制对象中的每一个还具有指向另一个“边”数组的6个“指针”(或指向另一个数组的索引)。 “顶点”也是一样的。当然,顶点将有3个指向相邻六边形的指针,并且边将有2个。
所以,十六进制可能是这样的: X,Y,点(6),顶点(6),侧面(6)
然后你有一个Hex数组,顶点数组和侧数组。
然后找到十六进制的顶点/边是非常简单的。
当我说指针时,它可以很容易地成为指向顶点或侧面数组中的元素的整数或其他。当然,数组可以是列表或其他任何内容。
答案 4 :(得分:0)
2
7 3
1
6 4
5
您还可以尝试“平放”地图行。对于这个例子,它将是:
2
7 1 3
6 5 4
有时在一行中包含行更有用:P
答案 5 :(得分:0)
我建议如下(我将使用Delphi风格的声明):
type
THexEdge = record
Hexes: array[1..2] of Integer; // Index of adjoining hexes.
// Other edge stuff goes here.
end;
THexVertex = record
Hexes: array[1..3] of Integer; // Index of adjoining hexes.
// Other vertex stuff goes here.
end;
THex = record
Edges: array[1..6] of Integer; // Index of edge.
Vertices: array[1..6] of Integer; // Index of vertex.
// Other hex stuff goes here.
end;
var
Edges: array of THexEdge;
Vertices: array of THexVertex;
HexMap: array of THex;
每个十六进制有六个边和六个顶点。每条边都跟踪它的两个相邻的六边形,每个顶点都跟踪它的三个相邻的六边形(地图边缘的六边形将是一个特例)。
当然,有许多事情你可以用不同的方式做。您可以使用指针而不是数组,您可以使用对象而不是记录,并且可以像其他回答者所建议的那样将您的六边形存储在二维数组中。
希望这可能会给你一些关于它的一种方法的想法。
答案 6 :(得分:0)
我坐在这里“用空闲时间编写有趣的代码”。就像这样...我会用语言告诉您它的外观。
这只是一个想法,我将如何进行工作。