2 回答

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
所以另一個(gè)答案涵蓋了這一點(diǎn),如果您將其更改findPath為更類似的 內(nèi)容,那將是一致的var path = this.findPath(s.pos, c.pos, {ignoreDestructibleStructures: true, ignoreCreeps: true});
但是,由于游戲的名稱是為了節(jié)省CPU,因此您真的不想每次都計(jì)算此路徑。
您可以將容器位置保存在內(nèi)存中,或者首先檢查在控制器的一個(gè)磁貼中是否已構(gòu)建容器。
選項(xiàng)A-將位置保存在內(nèi)存中
這將是我個(gè)人首選的選擇,因?yàn)槲医?jīng)常使用內(nèi)存。請記住,在此解決方案中,我添加了許多其他代碼,這些代碼無需使其正常工作,但可以在這種情況下使您的代碼更安全,更不易出錯(cuò)。
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);
}
選項(xiàng)B-不使用內(nèi)存
該選項(xiàng)將產(chǎn)生相同的影響,就像控制器已經(jīng)在容器站點(diǎn)或容器已經(jīng)存在一樣,它不會嘗試構(gòu)建另一個(gè)站點(diǎn)。
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);
}
添加回答
舉報(bào)