如何检查是否存在可能的路径?

时间:2013-12-23 18:17:07

标签: javascript algorithm path-finding maze

我正在开发一款基于JavaScript的实验游戏。玩家必须前往二维平铺地图上退出。

Feel free to check this fiddle and play

我只是随意设置障碍物,但有时候障碍阻挡了玩家和退出之间的距离,等级变得无法击败。

下面的代码展示了如何将障碍放置在地图中不是实际代码的一部分,我只是将这部分简化并翻译成英文以提高可懂度:

var arrayCoordinates;
var targetSquare;
var obstacleAmount = 30;
for (var i = 1; i <= obstacleAmount; i++) {
    arrayCoordinates= randomCoordinates();
    targetSquare = document.getElementById(arrayCoordinates[0] + '-' + arrayCoordinates[1]);
    targetSquare.className = 'obstacle';
}  

我只是在寻找路径寻找算法,或者让我写一个想法。

4 个答案:

答案 0 :(得分:1)

前几天的采访中有这样的问题。

你的问题归结为找到从A点到B点的最短路径,因为它们之间的所有步骤都是有效的(根据你的规则集)。

所以我们假设我们有一个X乘Y空间的网格。如果我们从太空(x,y)开始,那么我们需要在板上找到下一步的位置。这涉及计算我们可以从当前位置移动的所有潜在方格。

首先想象一下,这个问题是一个蜘蛛网,我们的起始广场在它的震中。如果我们从蜘蛛网的中间开始,我们不希望选择随机方向并开始行走,直到我们到达边缘 - 我们可能完全朝错误的方向行走。这是计算路径的天真方法,花费的时间远远超过它的替代方案。最好的是在网上横向行走,只有在我们达到目标时才停止探索。

即将使用代码进行更新。

编辑:使用javascript代码,只需查找-1即可检测不可能的游戏。 LINK

答案 1 :(得分:1)

你在这里所拥有的实际上是一张图。图形顶点是自由正方形,并且当两个单元格之间存在边缘时,并且仅当它们都不是黑色并且它们共享公共边时。既然您已将任务转换为图形问题,那么您需要做的就是从绿色方块执行任何BFS的搜索。当且仅当搜索完成时访问目的地时,该级别才是可解决的。

答案 2 :(得分:1)

DBS在对你的问题的评论中有正确的想法。

您可以使用BFSDFS在放置障碍物之前生成路径。 (BFS会给你一条你可能不想要的最短路径,而DFS会给你一条路径,这可能会更有趣。)然后当你放置障碍物时,确保它不会落在路径上。如果是,请更换障碍物,直到障碍物不在路径上。

或者,如果您愿意,可以在使用Dijkstra's algorithm放置障碍物之后生成路径,它会告诉您从您到达目的地的最短路径。具有障碍物的正方形的边缘将具有非常高的重量,并且没有障碍物的正方形边缘将具有非常低的非负重量(可能是1或0)。这将使迷宫中有更多有趣的路径,但如果Dijkstra无法成功完成,你可能需要更频繁地更换障碍物。

答案 3 :(得分:0)

制作此类地图的最佳方法不是在地图中添加障碍物,而是从中移除障碍物。首先你的地图将包含所有障碍物,只有起点和目的地没有障碍。然后你开始从网格中随机逐个移除障碍物。使用union和查找数据结构来检查源和目标是否在任何点连接。你可以继续,直到他们连接或进一步你可以继续消除障碍,这样你也可以定义地图的复杂性。

Union and Find