[英]Porting breadth-first search to Javascript
我在Python中為蛇創建了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;
}
我使用這個優先級隊列 。
Python中的搜索更多是OOP,但我不想包含更多代碼 - 問題已經很長了。 但我會包括搜索:
def search(self, grid, start, goal):
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
came_from[start] = None
while not frontier.empty():
current = frontier.get()
if current == goal:
break
for next in grid.neighbors(current):
if next not in came_from:
priority = self.heuristic(goal, next)
frontier.put(next, priority)
came_from[next] = current
return came_from
如果需要更多,請詢問。 我不擅長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) {
感謝IVlad指出了不好的路線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.