在二维网格上,是否存在一种算法可以将威胁范围与任意移动范围结合起来?

4
我正在制作一个简单的基于2D网格的游戏,想要找到一种方法来计算每个角色在游戏板上可以施加的“威胁”区域。从当前位置开始的威胁很容易计算 - 这是下面的红色菱形。但我希望将这些信息与任意的“可以走到这里”的区域(橙色)结合起来。
一起使用这个算法,我就能得到我的角色可以从所有可用的移动和当前位置进行攻击的所有瓷砖的组合
当然,我可以遍历所有可能的移动,将菱形形状应用于那里,并创建所有威胁方块的集合。有更好的方法吗?

你不能将钻石形状应用于玩家可以行走的瓷砖吗?你仍然需要执行“遍历所有可能”的过程,但它会显著限制你需要解析的瓷砖数量。除非我漏掉了什么。 - jraede
所以,你只需要担心边缘移动,对吧?最外层的方块?在绘制原始菱形后,迭代所有“canMoveTo”方块,但不是遍历整个菱形,而是遍历边框方块。 - nhgrif
不要遍历玩家可以移动到的每个方块(在首先完成原始正方形的完整菱形后),如果你这样做,只有当玩家所在位置和可移动位置之间存在空格时才会发生你所说的情况(就像国际象棋中马的移动方式)。 - nhgrif
@nhgrif:但是你的建议是不要遍历玩家可以移动到的每个方块。你的建议是只遍历移动范围的边界。即使包括单位的起始点,一个移动距离为10且攻击范围为1的单位在计算威胁区域时也会有一个大的环形空洞。 - user2357112
只有攻击范围的边框?如果单位移动受到某些限制,这种方法可能有效,但完全有可能出现这样的情况:一个单位可以跳过一个间隙而无法停下来在中途进行攻击,或者一个单位可以在垂直和水平移动被地形阻挡的情况下对角线移动。 - user2357112
显示剩余2条评论
1个回答

6

您在这里解决的问题类似于二维卷积

---------------     ---------------     -------XX------
-------X-------     ---------------     ------XXXX-----
------XXX------     -------XX------     -----XXXXXX----
-----XXXXX-----  *  ------XXX------  =  ----XXXXXXX----
------XXX------     --------X------     -----XXXXXX----
-------X-------     ---------------     ------XXXX-----
---------------     ---------------     --------X------

在您的情况下,如果一个元素只有被覆盖或未被覆盖(而不是包含标量或向量值),则这将简化为形态学中的膨胀操作。有许多关于高效实现膨胀的论文和代码示例 - 这个看起来特别适用于您的问题。

这正是我在寻找的。该算法的名称为“K膨胀”。 - Alex Stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接