加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:17:06 所属栏目:Python 来源:网络整理
导读:我正在用六角形瓷砖制作游戏,并决定使用三角形/六边形网格.我发现 this问题帮助我生成坐标,并稍微修改了代码,将所有坐标存储为字典中的键,其值为“.”. (floor)或“X”(wall,)并包括一个打印出地图的字符串表示的函数,其中每个非空白字符代表一个六边形图块.
我正在用六角形瓷砖制作游戏,并决定使用三角形/六边形网格.我发现 this问题帮助我生成坐标,并稍微修改了代码,将所有坐标存储为字典中的键,其值为“.”. (floor)或“X”(wall,)并包括一个打印出地图的字符串表示的函数,其中每个非空白字符代表一个六边形图块.这是新代码:
deltas = [[1,-1],[0,1,[-1,0],1],-1,[1,0]]
class HexGrid():
    def __init__(self,radius):
        self.radius = radius
        self.tiles = {(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,c),tile in self.tiles.iteritems():
            l[self.radius-1-b][a-c+(2*(self.radius-1))] = self.tiles[a,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,c]

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

解决方法

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

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

+--+--+--+--+--+--+--+
 / / / / / / /    Even row

  / / / / / / /   Odd row
 +--+--+--+--+--+--+--+

或者对于六边形:

__    __    __    __
 /  __/  __/  __/  __ Even row
 __/  __/ A__/  __/   Odd  row
 /  __/ F__/ B__/  __ Even row
 __/  __/ X__/  __/   Odd  row
 /  __/ E__/ C__/  __ Even row
 __/  __/ D__/  __/   Odd  row
 /  __/  __/  __/  __ Even row
 __/  __/  __/  __/   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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读