我正在制作一个六角形的游戏,并决定使用三角形/六角形网格。我找到了帮助我生成坐标的this问题,并稍微修改了代码,将所有坐标作为键存储在一个值为“.”(floor)或“X”(wall)的字典中,还包含了一个函数,该函数打印出一个表示地图的字符串,其中每个非空字符表示一个六边形平铺。这是新代码:
deltas = [[1,0,-1],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,-1,0]]
class HexGrid():
def __init__(self, radius):
self.radius = radius
self.tiles = {(0, 0, 0): "X"}
for r in range(radius):
a = 0
b = -r
c = +r
for j in range(6):
num_of_hexas_in_edge = r
for i in range(num_of_hexas_in_edge):
a = a+deltas[j][0]
b = b+deltas[j][1]
c = c+deltas[j][2]
self.tiles[a,b,c] = "X"
def show(self):
l = []
for y in range(20):
l.append([])
for x in range(60):
l[y].append(".")
for (a,b,c), tile in self.tiles.iteritems():
l[self.radius-1-b][a-c+(2*(self.radius-1))] = self.tiles[a,b,c]
mapString = ""
for y in range(len(l)):
for x in range(len(l[y])):
mapString += l[y][x]
mapString += "\n"
print(mapString)
使用此代码,我可以生成半径内的所有坐标,如下所示:
import hexgrid
hg = hexgrid.HexGrid(radius)
访问这样的坐标:
hg.tiles[a,b,c]
目前看来,这样做还不错,但我相信这样存储地图肯定有一些缺点。如果有什么缺点的话,你能指出它们吗?也许能提出一个更好的方法来保存地图?非常感谢你的时间。
使用数组进行存储可以节省一些CPU时间,但这种差异可能是可以忽略的。
但是,您错过了管理这样一个地图的非常简单的方法。假设它是行和列,只是单元格的形状略有不同。
对于六边形:
然后可以将数据存储为一个常规的二维数组。奇数行向右偏移.5,您需要找出
X
的相邻步骤:上面:A = (0,-2)
,右上:B = (1,-1)
,右下:C = (1,1)
,下面:D = (0,2),
,左下:E = (0,1)
,左上:F = (0,-1)
如果您可以浪费一点内存,那么您还可以将其他每一列都保留为空,这样邻域关系就变得更简单了:
(0,-2), (1,-1), (1,-1), (0,-2), (-1,-1), (-1,1)
不要使用hg.tiles[a,b,c]。
用这种方法把瓷砖做成三维列表
hg.tiles = [[[z for z in range(10)] for y in range(10)] for x in range(10)]
现在您可以使用hg.tiles[a][b][c]
访问磁贴PS:
a = a+deltas[j][0]
对于其他赋值,应该是a += deltas[j][0]
,依此类推我也做了一些研究,找到了一个更简单的方法。你不必这么复杂!表可以是一个简单的数组,没有任何特殊规则。
你想用六角形的根坐标系。请看这里的理论:https://en.wikipedia.org/wiki/Root_system。还有https://www.redblobgames.com/grids/hexagons/
单元(0,0)位于结构的中心,然后它有六个邻域:如众所周知的正交表(1,0),(0,1),(-1,0),(0,-1),但也有(1,1),(-1-1)。其他小区同样有六个邻居,不需要模块!
这里有一些Ascii艺术以便更好地理解:
可以计算平面中每个单元的中心位置(在屏幕中也是如此),因为它遵循矢量几何的规则。向量的坐标是60°而不是90°:a=(0,1)但b=(0,87,0.5),只需乘以并加上这些坐标!
你可能想使用pyhton librairy Hexy:https://github.com/RedFT/Hexy
相关问题 更多 >
编程相关推荐