爬行-如何使路径计算保持一致?

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


生成器与控制器之间的最近点,与控制器相距一个单位


由于某种原因,它似乎给了我多个值(可能是由于使用了路径算法),该值是根据API的“跳转点”。每次如何获得相同的结果,而不是三个不同的点?


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);

}

多次运行上述代码(这是必需的)会导致多个建筑工地:

http://img4.mukewang.com/6093a8cd0001878501440231.jpg

SMILET
浏览 148回答 2
2回答

Smart猫小萌

所以另一个答案涵盖了这一点,如果您将其更改findPath为更类似的 内容,那将是一致的var path = this.findPath(s.pos, c.pos, {ignoreDestructibleStructures: true, ignoreCreeps: 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);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript