2

我修改了一些我的 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;

关于我所缺少的任何建议?建造者被冻结在原地,即使它说他们正在移动到产卵区。

4

1 回答 1

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

如果你希望你的建造者只使用一个特定的生成,你也可以使用它的 ID:

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

但无论如何,我在您的代码中还注意到一件事!如果当前产卵中没有能量,你告诉你的建造者去采矿。

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

这样做的问题是,那里几乎总是会有一些能量,因为只要你的总能量低于 300,你的生成器每跳一次就会产生 1 能量!所以你的建造者最多只能去收获一次,然后转身从产卵处取回它——因为现在那里至少有 1 能量。
下一个问题是,你会遇到一个无法建造新小兵的问题,因为你的建造者总是在产生一个之前获取你所有的能量!

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

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

将 设置secureEnergy为高于您的平均小兵需要生成的数量(至少高于您最重要的收割机小兵需要的数量!)。例如,一个基本的[WORK,CARRY,MOVE]小兵需要 250 能量,而您的建造者可以携带 50 能量,因此您可能希望您的建造者仅在生成中至少有 300 能量时才提取其 50 能量secureEnergy。这样你总是可以产生一个新的cree。这对你有意义吗?

我希望我能对你有所帮助......并在 Screeps 中玩得开心!;)

于 2016-11-23T10:40:15.113 回答