在Python中存储三角形/六边形网格的最佳方法

前端之家收集整理的这篇文章主要介绍了在Python中存储三角形/六边形网格的最佳方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在用六角形瓷砖制作游戏,并决定使用三角形/六边形网格.我发现 this问题帮助我生成坐标,并稍微修改代码,将所有坐标存储为字典中的键,其值为“.”. (floor)或“X”(wall,)并包括一个打印出地图的字符串表示的函数,其中每个非空白字符代表一个六边形图块.这是新代码
  1. deltas = [[1,-1],[0,1,[-1,0],1],-1,[1,0]]
  2. class HexGrid():
  3. def __init__(self,radius):
  4. self.radius = radius
  5. self.tiles = {(0,0): "X"}
  6. for r in range(radius):
  7. a = 0
  8. b = -r
  9. c = +r
  10. for j in range(6):
  11. num_of_hexas_in_edge = r
  12. for i in range(num_of_hexas_in_edge):
  13. a = a+deltas[j][0]
  14. b = b+deltas[j][1]
  15. c = c+deltas[j][2]
  16. self.tiles[a,b,c] = "X"
  17.  
  18. def show(self):
  19. l = []
  20. for y in range(20):
  21. l.append([])
  22. for x in range(60):
  23. l[y].append(".")
  24. for (a,c),tile in self.tiles.iteritems():
  25. l[self.radius-1-b][a-c+(2*(self.radius-1))] = self.tiles[a,c]
  26. mapString = ""
  27. for y in range(len(l)):
  28. for x in range(len(l[y])):
  29. mapString += l[y][x]
  30. mapString += "\n"
  31. print(mapString)

使用此代码,我可以生成半径内的所有坐标,如下所示:

  1. import hexgrid
  2. hg = hexgrid.HexGrid(radius)

并访问这样的坐标:

  1. hg.tiles[a,c]

这似乎现在工作正常,但我确信以这种方式存储地图肯定存在一些缺点.如果有任何缺点,请指出它们,并提出更好的存储方式?非常感谢你的时间.

解决方法

使用阵列进行存储可以节省一些cpu时间,但差异可能是微不足道的.

但是,您错过了一种管理此类地图的简单方法.将其视为行和列,只是单元格的形状略有不同.

  1. +--+--+--+--+--+--+--+
  2. \/ \/ \/ \/ \/ \/ \/ Even row
  3.  
  4. /\ /\ /\ /\ /\ /\ /\ Odd row
  5. +--+--+--+--+--+--+--+

或者对于六边形:

  1. __ __ __ __
  2. / \__/ \__/ \__/ \__ Even row
  3. \__/ \__/ A\__/ \__/ Odd row
  4. / \__/ F\__/ B\__/ \__ Even row
  5. \__/ \__/ X\__/ \__/ Odd row
  6. / \__/ E\__/ C\__/ \__ Even row
  7. \__/ \__/ D\__/ \__/ Odd row
  8. / \__/ \__/ \__/ \__ Even row
  9. \__/ \__/ \__/ \__/ Odd row

然后,您可以将数据存储为常规2D数组.奇数行向右偏移.5,你需要弄清楚X的邻居步骤:上面:A =(0,-2),右上:B =(1,-1),右下:C = (1,1),下:D =(0,2),左下:E =(0,左上:F =(0,-1)

如果你没有浪费一点内存,你也可以将其他列留空,并且邻居变得更简单:(0,(1,( 0,( – 1,1)

猜你在找的Python相关文章