【问题标题】:2D grid based games : represent passability基于 2D 网格的游戏:表示通过性
【发布时间】:2012-10-15 10:51:11
【问题描述】:

考虑基于平铺的游戏,其中每个代理都可以直线/对角线(在 8 个方向上)移动。 基本上,这样的地图可以表示为常规的 2D 网格,其中 0 表示可步行位置,1 表示不可步行位置(我使用的是 Lua):

-- Example : 3x3 sized map
local map = {
 {0,0,0},
 {0,1,1},
 {0,0,0},
}

此时,我们如何根据智能体来自的方向来表示瓷砖可行走性? IE。上面的单元格 [2][2] 是静态不可行走的,如果来自 [1][2](上图)或 [2][1](左),则现在可以行走,但不是,例如,来自 [3 ][2](下)。

我对此有过一些想法,但对我来说,我无法想出足够干净的东西。

提前致谢。

【问题讨论】:

    标签: map path grid path-finding


    【解决方案1】:

    我会用单字节覆盖另一个 2D 网格。字节的每一位对应一个可能的入口方向,1 表示可以从该方向前进,0 表示不能。然后,您可以使用二进制掩码检查可输入性。

    如果您的大部分单元格都可以从任何方向输入,那么您可以考虑使用带有磁贴绝对 ID(例如 X*MaxY+Y)的 map 作为键,并使用上述字节方案指示可输入性.这访问速度较慢,但​​占用的空间更少。

    例如,让方向这样布置:

    Bit #      X offset  Y offset
    123        -1 0 1    -1 -1 -1
    4 5        -1 0 1     0  0  0
    678        -1 0 1     1  1  1
    

    如果我向东北方向走,这对应于#3 位。我可以通过将上述值转换​​为位掩码来执行掩码:

    1   2   4
    8      16
    32 64 128
    

    如果以下返回true,我可以从一个方向进入

    Enterability(CurrentX+Xoffset(Dir), CurrentY+Yoffset(Dir)) & BitMask(Dir)
    

    (抱歉,我对 Lua 的了解不够,无法用那种语言来写这篇文章)

    编辑

    所以,说我的方向等如上,我想要一个只能从北方进入的广场。为此,我设置了第 2 位:

    Enterability(X)=2
    

    如果我想要一个从北方和西南都可以进入的广场,我会使用:

    Enterability(X)=2 | 64
    

    其中| 是按位或运算。

    如果我想让一个正方形可以从除西边以外的任何方向输入:

    Enterability(X)=(~8)
    

    其中~ 是非操作。

    如果我需要关一扇门,比如向东,我可以取消那个位:

    Enterability(X)=Enterability(X) & (~16)
    

    要再次打开门,我使用:

    Enterability(X)=Enterability(X) | 16
    

    或者,更简单地说,

    Enterability(X)|=16
    

    ~16 产生一个位域,除了指代 16 的位之外全为 1。将其与 AND 运算符 (&) 一起使用会保留除指代 16 的位之外的所有位。

    还要注意,十六进制寻址会更方便:

     Decimal          Hexadecimal
    1   2   4       0x1  0x2  0x4
    8      16   =   0x8       0x10
    32 64 128       0x20 0x40 0x80
    

    【讨论】:

    • 感谢理查德的快速回答。我对按位运算/表示不是很熟悉,但我明白了。虽然我遗漏了一些东西......我并不是真的在寻找检查可步行性,而是如何表示它。考虑到我在 OP 中给出的示例,我如何指定 node[i][j] 可以从这个/那个侧输入,但不能从这个/那个侧输入,等等......然后稍后检查通过性应该是我猜是直截了当的操作。再次感谢理查德。
    • 我想我还是会给出同样的答案。与单元格网格具有相同尺寸的 2d 字节网格是一个很好的表示,每个字节的每一位都表示单元格是否可输入。我已经编辑了我的答案以显示一些示例。
    • 哦,对不起。乍一看,我没有得到完整的想法。所以一般的想法是覆盖第二个二维网格,其中每个单元格保存一个字节,表示该单元格可以从哪个方向输入。好吧,多亏了 Lua 的表格灵活性,我不需要额外的网格,我只需将这个字节打包在包含匹配单元格的一些信息的节点的 2D 网格中。但这绝对解决了问题,谢谢理查德!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多