Javascript 尖叫-如何使路径计算一致?

Javascript 尖叫-如何使路径计算一致?,javascript,screeps,Javascript,Screeps,我有一个原型来创建房间布局。我试图将放置容器的位置计算为: 繁殖和控制器之间距离控制器一个单位的最近点 出于某种原因,它似乎给了我多个值(可能是由于路径算法),这是跳转点。我怎么能每次都得到相同的结果,而不是三个不同的点 Room.prototype.layoutRoom=function(){ var s:Spawn=this.spawns()[0] var c:Controller=this.controller; //get path from spawn to

我有一个原型来创建房间布局。我试图将放置容器的位置计算为:

繁殖和控制器之间距离控制器一个单位的最近点

出于某种原因,它似乎给了我多个值(可能是由于路径算法),这是跳转点。我怎么能每次都得到相同的结果,而不是三个不同的点

Room.prototype.layoutRoom=function(){
    var s:Spawn=this.spawns()[0]
    var c:Controller=this.controller;

    //get path from spawn to controller
    var path = this.findPath(s.pos, c.pos, {ignoreDestructibleStructures: true});

    //place container on last part of path -3 to stay 1 away from controller, and closest to spawn
    //length-1= on endpoint, -2 is one step away, -3 is two steps away 
    var loc=path[path.length-3]
    console.log('layout room, put container: '+loc.x+' '+loc.y)
    this.createConstructionSite(loc.x, loc.y, STRUCTURE_CONTAINER);
}
多次运行上述代码(这是必需的)会导致多个施工现场:


默认情况下,路径查找会将爬行视为无法通过的平铺。 要解决此问题,请将其添加到选项中:

无知者:真的


因此,另一个答案涵盖了这一点,如果您将
findPath
更改为类似
var path=this.findPath(s.pos,c.pos,{ignoreDestructibleStructures:true,ignorecroves:true})

然而,因为游戏的名字是为了节省CPU,所以你真的不想每次都计算这个路径

您可以将容器位置保存在内存中,或者首先检查容器是否已构建在控制器的一个磁贴中


选项A-将位置保存在内存中 这将是我个人的首选,因为我经常使用记忆。 请记住,在这个解决方案中,我添加了许多您不需要使其工作的额外代码,但在这种情况下,它们将使您的代码更安全,更不容易出错

Room.prototype.layoutRoom=function(forceUpdate: boolean){
    var s: Spawn = this.spawns()[0];
    var c: Controller = this.controller;
    
    // Adding this to check that this spawn/controller exists (or code will error out if one doesn't exist)
    if(!s || !c){
        return;
    }
    // Check if a memory value has been set for this container already, and we aren't forcing the location to update via parameter; we can end early otherwise
    if(this.memory.controllerContainer && !forceUpdate){
        // you could uncomment this out to have it place a site on the same location if we find the location is saved in memory already
        // var loc = this.memory.controllerContainer;
        // this.createConstructionSite(controllerContainer.x, controllerContainer.y, STRUCTURE_CONTAINER);
        return;
    }

    //get path from spawn to controller
    var path = this.findPath(s.pos, c.pos, {
        ignoreDestructibleStructures: true, ignoreCreeps: true
    });

    //place container on last part of path -3 to stay 1 away from controller, and closest to spawn
    //length-1= on endpoint, -2 is one step away, -3 is two steps away 
    var loc=path[path.length-3];
    console.log('layout room, put container: '+loc.x+' '+loc.y);
    
    // Note that I am not saving the RoomPosition object into memory, when the JSON parses 
    // your memory back out you won't be able to use it as a RoomPosition object, so its safer 
    // to save as a custom object that mimics Room position and have a function available to convert 
    // it to one if you need to use it as one for the purpose of passing as a parameter to something
    this.memory.controllerContainer = {x: loc.x, y: lox.y};
    this.createConstructionSite(loc.x, loc.y, STRUCTURE_CONTAINER);
}

选项B-不使用内存 此选项将具有相同的影响,就像控制器已经存在容器站点或容器一样,它不会尝试构建另一个站点

Room.prototype.layoutRoom=function(){
    var s: Spawn = this.spawns()[0];
    var c: Controller = this.controller;
    
    // Adding this to check that this spawn/controller exists (or code will error out if one doesn't exist)
    if(!s || !c){
        return;
    }

    // Check if a construction site or container exists near the controller, exit if so
    // For brevity, i will include here, but normally I would pull this into its own function
    var numConstructionSites = room.find(FIND_CONSTRUCTION_SITES, { filter: (site) => 
        site.isNearTo(c) && site.structureType === STRUCTURE_CONTAINER
    }).length;
    var numExistingContainers = room.find(FIND_STRUCTURES, { filter: (struct) => 
        struct.isNearTo(c) && struct.structureType === STRUCTURE_CONTAINER
    }).length;
    if(numConstructionSites > 0 || numExistingContainers > 0) {
        return;
    }

    //get path from spawn to controller
    var path = this.findPath(s.pos, c.pos, {
        ignoreDestructibleStructures: true, ignoreCreeps: true
    });

    //place container on last part of path -3 to stay 1 away from controller, and closest to spawn
    //length-1= on endpoint, -2 is one step away, -3 is two steps away 
    var loc=path[path.length-3];
    console.log('layout room, put container: '+loc.x+' '+loc.y);
    this.createConstructionSite(loc.x, loc.y, STRUCTURE_CONTAINER);
}

选项
ignorecrews
的默认值为
false
。也许这种差异来自于爬行动物的存在?我也不太确定寻路是否完全确定。