将广度优先搜索移植到Javascript

将广度优先搜索移植到Javascript,javascript,python,algorithm,Javascript,Python,Algorithm,我用Python为snake创建了AI。这个游戏玩得很好。我最近开始学习Javascript,并尝试编写与游戏类似的Javascript 游戏在x*y网格上进行(如30*20)。在Python中,我使用(x,y)元组作为游戏位置。在JS中,我使用我映射的整数: function map(x, y) { return x + y * size.width; } function unmap(pos) { return {x: pos % size.width, y: Math.fl

我用Python为snake创建了AI。这个游戏玩得很好。我最近开始学习Javascript,并尝试编写与游戏类似的Javascript

游戏在x*y网格上进行(如30*20)。在Python中,我使用(x,y)元组作为游戏位置。在JS中,我使用我映射的整数:

function map(x, y) {
    return x + y * size.width;
}
function unmap(pos) {
    return {x: pos % size.width, y: Math.floor(pos/size.width)};
}
我的问题是搜索不起作用。当我尝试从中创建路径时,它进入无限循环。搜索功能是:

function search(start, goal) {
    var frontier = new PriorityQueue({
        comparator: function(a, b) {
            return a.score - b.score;
        }
    });
    frontier.queue({value: start, score: 0});
    var cameFrom = {};
    cameFrom[start] = null;

    while (frontier.length !== 0) {
        var current = frontier.dequeue().value;
        if (current === goal) {
            break;
        }

        var nbs = neighbors(current);
        for(var i = 0; i < nbs.length; i++) {
            var next = nbs[i];
            if (Object.keys(cameFrom).indexOf(next) === -1) {
                var priority = heuristic(goal, next);
                frontier.queue({value: next, score: priority});
                cameFrom[next] = current;
            }
        }
    }
    return cameFrom;
}

如果还需要什么,请询问。我不擅长JS。

这句话的问题是:

if (Object.keys(cameFrom).indexOf(next) === -1) {
我在搜索整数,但键总是字符串。您可以清楚地看到本例中的行为:

var foo = {0: "fooBar", 1: "bar"};
console.log("keys", Object.keys(foo));
console.log("int", Object.keys(foo).indexOf(0)); // -1
console.log("string", Object.keys(foo).indexOf("0")); // 0
这本书可读性更强,篇幅更短,效果更好:

if (cameFrom[next] === undefined) {

感谢谁指出了这条错误的线。

忘记了我知道的大部分小JS,但是为什么
Object.keys(cameFrom).indexOf(next)==-1
而不是
cameFrom[next]=-1
?@IVlad如果没有键,这条线是真的(我不是在测试值,而是测试是否存在)。但是它可以简化为
cameFrom[next]==undefined
@IVlad我重构了这行代码(到
cameFrom[next]==undefined
),现在就可以了!因此,我宣布你是天才。(我认为我的线路根本不起作用——或者正在做一些不同的事情)将其发布为asnwer。(我自己回答这个问题没有问题,但我想给你一个机会)我很高兴你把它修好了:)。这基本上是一个幸运的猜测,所以请随意回答!
if (cameFrom[next] === undefined) {