gpt4 book ai didi

map - 基于二维网格的游戏 : represent passability

转载 作者:行者123 更新时间:2023-12-02 02:11:00 26 4
gpt4 key购买 nike

考虑一个基于方 block 的游戏,其中每个代理都可以直线/对角线(8 个方向)移动。基本上,像这样的 map 可以表示为规则的二维网格,其中 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](向下)。

我已经对此进行了一些思考,但对我来说,我无法想出足够清晰的东西。

提前致谢。

最佳答案

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

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

例如,让方向这样布置:

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

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

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

(抱歉,恐怕我不太了解 Lua,无法用那种语言写这篇文章)

编辑

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

Enterability(X)=2

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

Enterability(X)=2 | 64

其中 | 是按位或运算。

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

Enterability(X)=(~8)

其中 ~ 是 not 操作。

如果我需要关上一扇门,比如向东,我可以取消设置:

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

关于map - 基于二维网格的游戏 : represent passability,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com