在JavaScript上解决非循环迷宫
我试图找到一种算法,它总是能够解决随机生成的非循环迷宫,我使用下面的代码,但它总是被卡住。有什么建议吗在JavaScript上解决非循环迷宫,javascript,algorithm,Javascript,Algorithm,我试图找到一种算法,它总是能够解决随机生成的非循环迷宫,我使用下面的代码,但它总是被卡住。有什么建议吗 function makeMove() { if(isWall("Right") == true) { move("Forward"); } else if(isWall("Right") == false) { move("Right"); } else if(isWall("Right") ==
function makeMove()
{
if(isWall("Right") == true)
{
move("Forward");
}
else if(isWall("Right") == false)
{
move("Right");
}
else if(isWall("Right") == true && isWall("Forward") == true)
{
move("Left");
}
}
您可能会陷入困境,因为您的路径查找算法无法回溯。如果你在一个死胡同(即,你前面的墙,你左边的墙,你右边的墙)结束呢?你需要回溯的能力 据我所见,你正在检查去右边的路是否被堵住了。如果是这样,你就前进。但你需要检查一下,看看你是否能继续前进。仅仅因为向右的路被堵住了,并不意味着前进的路是敞开的
此外,您的第三个条件永远不会执行,因为第一个条件将为此报告true,因此
if
块中的代码将被执行 您需要一些条件才能将光标转过来。想象一下,就像你的右手一直放在迷宫的墙上,如果你到达一个点,前面和右边有一堵墙,那么你就会转身(这就是当你把你的手放在右边的墙上时发生的事情)
如此有效
var up = 1;
function makeMove()
{
if(isWall("Right", up) && !isWall("Forward", up))
{
move("Forward", up);
}
else if(!isWall("Right", up))
{
move("Right", up);
}
else
{
up = !up; makeMove();
}
}
对于您的评论,您可以使用一些简单的系统来跟踪方向:
function move( direction, up ) {
if ( ! up ) {
if (direction == "Forward") { direction = "Backward"; }
else if ( direction == "Backward" ) { direction = "Forward"; }
else if ( direction == "Right" ) { direction = "Left"; }
else { direction = "Right"; }
}
… Your current code
}
编辑:添加了一个用于模拟“掉头”的开关。同样的代码也应该放在
isWall()的顶部。
这应该可以解决任何迷宫。。。最终
var direction = ['Left', 'Forward', 'Right', 'Back'];
var isWall = function () {
return Math.floor(Math.random() * 2);
};
function makeMove() {
var dir = Math.floor(Math.random() * 4);
dir = direction[dir];
alert(dir);
if (!isWall(dir)) move(dir);
else makeMove();
}
function move(dir) {
// Go places
if (!confirm('You moved, continue?')) return;
if ("places" === "exit") alert("FREEEEDOOM!");
else makeMove();
}
makeMove();
将其随机化,它最终会解决:)迷宫是用此代码随机生成的。你不应该检查墙的不存在吗?这里的问题是你需要做一些路径跟踪你的第三个案例永远不会解决,因为前两个案例中的一个总是匹配的。。。这就是布尔运算的美妙之处。当你向前走的时候,会发生什么,然后,前面、右边和左边都有一堵墙?如何向后移动?对于最后一个else语句,我尝试使用else-move(“向后”),它使我在迷宫中走得更远,但随后变成光标在相同的两点之间来回移动,之后实际上什么都没有(如果有意义的话)移动(“向后”)不会起作用,因为你仍然会朝着同一个方向前进。想象一下,你向前走,你前面和右边都有一堵墙,如果你后退一步而不转身,那么下次你就会回到同一个地方。我理解用右手触摸墙直到你走到尽头的概念,但我仍然遇到的问题是如何将最后一段信息转换成代码。如果我调用函数来移动(“向后”),我就会像你解释的那样陷入一个循环中;那么,我是否必须调用另一个条件,这将导致光标在向后移动后移动到另一个方向?感谢所有的帮助,它确实帮助我更多地理解了这一点!不用担心,我刚刚做了另一次编辑,你应该在你的
isWall()
函数中也包含if(!up).
块。这对于一个虽然basic不值得这样做的问题来说绝对是无稽之谈。哇,为什么要投否决票?如果你能给我找到一个能解决比这更多迷宫的算法,请投反对票!选择一个,但考虑到迷宫是非循环的,那么壁花是最简单的实现和解释方法。没有一个算法可以解决比这更多的迷宫。你真丢脸。