在二维平铺游戏中寻找实体的可能移动


10

我在为此提出一个特定的搜索词时遇到了问题,但是如何在基于2D回合的策略游戏(即FF:战术,火焰纹章,进阶战争)中寻找可能的动作。

在此处输入图片说明

在这一点上,我没有太多考虑地形(甚至碰撞)的问题。我只是想知道我可以使用哪种算法来找出X实体可以移动5个图块并比其攻击2个更远的图块。

我知道我可以使用Dijkstra之类的东西来找到两点之间的距离。一种可能的实现方式是从玩家位置开始,然后从那里分支,直到Dijkstra返回的距离大于移动次数。

只是想知道是否有人可以指出我正确的方向(即算法名称,技术,文章等)。


我在想将其称为搜索词的路径查找?如果您使用路径查找,那么您可能会有计数器来处理您需要的内容
Exikle 2013年

这实质上是路径查找的一部分(计算移动成本的元数据)。您只能确定范围内的位置,但不一定确定您要走的路线。
马里奥

1
如果它是基于回合的FFT策略,则不是实时(RTS)。:p
Alayric

在2d中,您可以使用Taxicab / Manhattan计算en.wikipedia.org/wiki/Taxicab_geometry
Gerben Jacobs

Answers:


5

我认为有界Dijkstra正是您要使用的。Dijkstra找到两点之间距离的方式是,它绘制出从原始节点到每个节点的距离,然后从该距离图中“选择”最短路径。您实际上希望做同样的事情,只是希望将其创建的距离节点图作为输出,而不是指向任何特定点的路径。

您要进行的一种修改是跳过计算与已经超出最大移动范围的节点之间的距离。然后,您将获得一个单元可以移动到的所有节点的节点图,再加上一个边界,因此只需剪切距离大于运动允许范围的节点即可。

中提琴

换句话说,您在问题中描述的几乎是您需要做的。 它还具有能够使用输出进行寻路的优势,而无需进行任何进一步的计算。


在这种情况下,我认为Dijkstra的能力过于强大。OP不需要通向所有可能移动目的地的路径,仅需回答是/否就可以确定座席能否到达目的地。用户选择了路径后,他便可以稍后计算路径。
Michael Kristofik 2013年

在确定目的地之后,使用Dijkstra的算法来计算路径的成本几乎与预先使用它完全相同(除非您使用启发式方法(例如A *)进行路径设置)。如果不事先做,只会造成多余的工作,因为Dijkstra会回答“我可以去哪里”和“我如何到达那里”这两个问题。它还允许增加环境复杂性,从而改变移动成本,尽管这对于应用程序可能是不必要的。此外,该方法已被详细记录,这对实施者很有帮助。
TASagent

1
在看了Mario的答案后,他实际上描述了Dijkstra的算法,只是他反转了距离,没有提到它是Dijkstra。
TASagent

1
不会说是Dijkstra,因为您并不是真正在寻找最短的路线,也不是想到达某个特定点。从本质上讲,它是Dijkstra算法的第一部分,但确实如此。使用Dijkstra的措辞问题可能会引起误解,我认为这也是Michael的困惑。他可能认为您建议对每个字段/单元使用一次Dijkstra。
马里奥(Mario)

1
最后使用此方法,因为它效果很好,并且很容易扩展以处理障碍。
NRaf 2013年

12

我现在可以想到的最简单(也许是最幼稚)的方法:

  • 从您的角色开始,并将所有周围的字段标记为steps - 1
  • 遍历所有新的有关资料,并再次标记及其周边领域steps - 1,其中steps将当前场的步数,除非新领域具有较高的已经数。
  • 重复最后一步,直到用尽所有步骤。

1
该算法的名称为:Flood Fill
Michael

6
@MichaelKristofik:我称其为广度优先搜索。洪水填充不会跟踪距离。
BlueRaja-Danny Pflughoeft 2013年

2

我认为您要寻找的可能是Manhattan Distance。假设没有障碍,您可以说只要满足以下条件,便可以达到一个正方形:

| toX-fromX | + | toY-fromY | <maxMoveDistance

如果您以后会遇到障碍,则此算法可能不是正确的方向。适应它的一种可能方法可能包括让障碍物投射“阴影”并从最近的点重新评估。

编辑(因为我现在有更多的空闲时间):

“阴影”的意思是这样的,如果0是可到达的正方形,C是字符,X是障碍物:

 012345678
0    0
1   00
2  000X
3 000C000
4  00000
5   000
6    0
 012345678

由于(5,2)是一个障碍,因此首先假设x> = 5 AND y <= 2不能到达任何东西。然后,您可以从另一个正方形重新计算;如果要转到(5,1),则可以从(4,1)计算出曼哈顿距离,并查看该距离+从角色到(4,1)的距离是否小于玩家的移动距离。

这是一个非常简单的示例,但是如果您有多个障碍和/或更长的移动范围,则它应该能够处理复杂性。

无论是在编程复杂性还是在执行效率方面,它实际上是否比泛洪都要好,我都不知道。似乎是解决问题的一种更有趣的方法。


投射阴影是什么意思?
NRaf 2013年

1
编辑为澄清。
Tin Man
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.