尖锐的建筑商没有收集能量

时间:2016-11-15 21:03:00

标签: screeps

我已经改变了一些我的role.builders.js文件,让我的小兵首先检查产卵是否有能量,如果没有收获能量来构建,否则从产卵中获取它。这就是我所拥有的:

var roleBuilder = {

    /** @param {Creep} creep **/
    run: function(creep) {

        if(creep.memory.building && creep.carry.energy == 0) {
            creep.memory.building = false;
            creep.say('harvesting');
        }
        if(!creep.memory.building && creep.carry.energy == creep.carryCapacity) {
            creep.memory.building = true;
            creep.say('building');
        }

        if(creep.memory.building) {
            var targets = creep.room.find(FIND_CONSTRUCTION_SITES);
            if(targets.length) {
                if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) {
                    creep.moveTo(targets[0]);
                }
            }
        }
        else 
        {
            if(!Game.spawns['MySpawn'].energy)
            {
               var sources = creep.room.find(FIND_SOURCES);
                if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) 
                {
                    creep.moveTo(sources[0]);
                }
            }
            else
            {
                if(creep.withdraw(Game.spawns['MySpawn'],RESOURCE_ENERGY) == ERR_NOT_IN_RANGE)
                {
                    creep.moveTo(Game.spawns['MySpawn']);
                }
            }
        }
    }
};

module.exports = roleBuilder;

有关我失踪的建议吗?即使它们说它们正在移动到产卵区,建筑商也会冻结在原地。

1 个答案:

答案 0 :(得分:2)

就像你已经注意到的那样,如果你使用预设变量,这样的东西效果会更好 为了完整起见,我会重新发布您的解决方案。但是你不需要else部分:

var spns = creep.room.find(FIND_MY_SPAWNS);
if(creep.withdraw(spns[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
    creep.moveTo(spns[0]);
}

如果您希望构建器仅使用一个特定的spawn,您也可以使用它的ID:

var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
if(creep.withdraw(spwn, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
    creep.moveTo(spwn);
}

但无论如何,我在你的代码中注意到了另外一件事!如果产卵中存在 NO 能量,您可以告诉建筑商去采矿。

if(!Game.spawns['MySpawn'].energy) { ... }

问题在于,那里几乎总会有一些能量,因为只要你总共低于300能量,你的产卵就会产生每一个能量1能量!所以你的建造者最多会收获一次剔> ,然后转身从产卵中取出 - 因为现在至少有一种能量。
下一个问题是,你会遇到一个无法建立新生物的问题,因为你的建造者总是会在生成之前获取所有的能量!

为了弥补这两个问题,请尝试以下方法:

var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
var secureEnergy = 300;
if(spwn.energy > secureEnergy) { ... }

secureEnergy设置为高于平均蠕变需要产生的数量(至少高于您最重要的收割机需要的数量!)。例如,基本的[WORK,CARRY,MOVE]蠕变需要250点能量,而你的建造者可以携带50点能量,所以你可能希望你的建造者只能在生成物中至少有300 secureEnergy时撤回它的50点能量。这样你总能产生新的蠕变。这对你有意义吗?

我希望我能帮助你一点......并且在Screeps中享受乐趣! ;)