在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不值得这样做的问题来说绝对是无稽之谈。哇,为什么要投否决票?如果你能给我找到一个能解决比这更多迷宫的算法,请投反对票!选择一个,但考虑到迷宫是非循环的,那么壁花是最简单的实现和解释方法。没有一个算法可以解决比这更多的迷宫。你真丢脸。