【问题标题】:Finding a Path through a Multidimensional Array通过多维数组寻找路径
【发布时间】:2012-10-16 16:44:24
【问题描述】:

我开始使用 C# 编写地牢爬虫,并且已经编写了关卡生成代码。

但是,我遇到了一个问题。我的关卡地图存储在一个 32x32 的多维数组中,每个图块存储为一个字符串。除以下所有图块(所有这些名称都是代表该图块的变量名称)(mongroveplant、tree、hjalaplant、vnosplant、barraplant、weedplant、naroplant、deathweedplant、venustrap、strangulator、雕像、emptiness 和 stonewall)之外的所有图块都不能走过去。

这些图块(可以走过去)构成更长的列表,可在此处找到:Walkable Tiles。在 32x32 多维数组的每个条目中,每个条目都是一个字符串。

如何创建一个寻路算法,避免上面列出的所有图块,但可以遍历链接中列出的所有图块?我正在尝试从“开始”磁贴到“退出级别”磁贴。

【问题讨论】:

  • 我所做的只是计算最短路径。我已经尝试过 A* 算法,仅此而已。我不知道如何使它适合我的需要。
  • 不同的瓷砖有不同的旅行费用,还是所有瓷砖的费用都一样?如果所有瓷砖从瓷砖到瓷砖的旅行成本都相同,那么 A* 可能是多余的,我在这里的回答可能会有所帮助stackoverflow.com/questions/11173116/pathfinding-issues
  • 如果瓷砖不能行走,那么它就是一面“墙”,不是吗?因此,您可以对迷宫进行预处理,将不可行走的瓷砖替换为墙,然后使用算法找到最短路径。如果你不能预处理(因为只知道-neighbour-tile属性),那么无论你想找到全局优化还是局部优化,你都必须使用蛮力找到优化的解决方案。

标签: c# path-finding


【解决方案1】:

我要删除的第一件事是字符串的概念。就视频游戏而言,解析字符串并不快。您想要的是为每个图块(位域)设置标志。最后,你会喜欢旗帜,因为你可以组合它们!

[Flags]
public enum TileDescription
{ 
    Walkable,
    Trap,
    Altar,
    Door
}

它们也可以存储在 int 中,这样占用的空间要少得多。速度和空间,两个惊人的概念。

至于寻路算法,那里有很多。但基本上,你有一个起点,一个终点,你必须在两者之间找到最快的方法。这个想法是检查最近的“节点”,看看你是否更接近你的目标。每次,您都对新节点重复检查。如果你被困住了,你会倒退到仍然有可用路径的节点。

你有一些不错的基本算法:

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

http://en.wikipedia.org/wiki/A*_search_algorithm

但是,远程寻路总是非常昂贵。您必须将寻路限制在原点周围的特定范围内。解析整个 32x32 迷宫可能需要很长时间才能找到最快的路线。在大多数情况下,当您超出特定范围时,您会将您的 NPC 移动到最近的点,然后在到达该点或到达该点时重复寻路。寻路的诀窍是在许多帧上进行,并且永远不要尝试一次处理所有内容。

【讨论】:

  • 好的...那我试试用int!
  • 我还建议您使用专门为创建地牢爬行者而设计的 Grimrock 传说编辑器。它甚至在 LUA 中有一个非常好的脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多