您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:22:40 python 字数 2641 阅读 552 来源 www.jb51.cc/python

我正在用六角形瓷砖制作游戏,并决定使用三角形/六边形网格.我发现 this问题帮助我生成坐标,并稍微修改了代码,将所有坐标存储为字典中的键,其值为“.”. (floor)或“X”(wall,)并包括一个打印出地图的字符串表示的函数,其中每个非空白字符代表一个六边形图块.这是新代码: deltas = [[1,0,-1],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,

概述

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]

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

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

+--+--+--+--+--+--+--+
 \/ \/ \/ \/ \/ \/ \/    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)

总结

以上是编程之家为你收集整理的在Python中存储三角形/六边形网格的最佳方法全部内容,希望文章能够帮你解决在Python中存储三角形/六边形网格的最佳方法所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶