将广度优先搜索移植到Javascript
我用Python为snake创建了AI。这个游戏玩得很好。我最近开始学习Javascript,并尝试编写与游戏类似的Javascript 游戏在x*y网格上进行(如30*20)。在Python中,我使用(x,y)元组作为游戏位置。在JS中,我使用我映射的整数:将广度优先搜索移植到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
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) {