C# 通过多维数组查找路径

C# 通过多维数组查找路径,c#,path-finding,C#,Path Finding,我开始在C#中使用地牢爬虫,并且我已经编写了等级生成代码 然而,我遇到了一个问题。我的关卡地图存储在一个32x32多维数组中,每个磁贴都存储为一个字符串。除了以下瓷砖(所有这些名称都是代表该瓷砖的变量名称)(mongroveplant、tree、hjalaplant、vnosplant、barraplant、weedplant、naroplant、deathweedplant、venustrap、strangulator、雕像、空虚和石墙)外,所有瓷砖都不能被人走过 这些瓷砖(可以走过去)构成了

我开始在C#中使用地牢爬虫,并且我已经编写了等级生成代码

然而,我遇到了一个问题。我的关卡地图存储在一个32x32多维数组中,每个磁贴都存储为一个字符串。除了以下瓷砖(所有这些名称都是代表该瓷砖的变量名称)(mongroveplant、tree、hjalaplant、vnosplant、barraplant、weedplant、naroplant、deathweedplant、venustrap、strangulator、雕像、空虚和石墙)外,所有瓷砖都不能被人走过

这些瓷砖(可以走过去)构成了一个更长的列表,可在以下位置找到:。在32x32多维数组中的每个条目中,每个条目都是一个字符串


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

首先要删除的是字符串的概念。就视频游戏而言,解析字符串并不快。您想要的是为每个分幅(位字段)设置标志。最后,你会喜欢旗帜,因为你可以把它们组合起来

[Flags]
public enum TileDescription
{ 
    Walkable,
    Trap,
    Altar,
    Door
}
它们也可以存储在int上,占用的空间要少得多。速度和空间,两个惊人的概念

至于路径搜索算法,有很多。但基本上,你有一个起点,一个终点,你必须在两者之间找到最快的方法。这个想法是检查最近的“节点”,看看你是否离目标更近了。每次使用新节点重复检查。如果您被困,您将返回到仍然有可用路径的节点

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


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

我所做的只是计算最短路径。我尝试过A*算法,但仅此而已。我不太明白如何使它适合我的需要。不同的瓷砖有不同的旅行成本,还是所有瓷砖都有相同的成本?如果从一块地砖到另一块地砖的旅行成本对所有地砖来说都是一样的,那么A*可能会有点过头,我在这里的回答可能会有所帮助,如果地砖不能行走,那么它就是一堵“墙”,不是吗?因此,您可以对迷宫进行预处理,用墙替换不可行走的瓷砖,然后使用算法找到最短路径。如果你不能预处理(因为你只知道相邻的瓷砖属性),那么你将不得不使用蛮力来找到优化的解决方案,无论你想找到一个全局优化还是局部优化。好吧……我会尝试使用int!我还建议您使用Grimrock编辑器的图例,它是专门用来创建地下城爬虫的。它甚至有一个非常好的LUA脚本。