7

我试图弄清楚如何让每个小兵都具有特定的记忆或角色,例如变量中的收割机......我似乎无法弄清楚。

我已经尝试过:

module.exports = function(){

    for(var i in Game.creeps){
        if(i.memory == 'Harvester'){
            var Harvesters = Game.creeps[i];

            if(Harvesters.index < 3){
                Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE],'Harvester'+ Harvesters.length, 'Harvester');
            }
        }
    }
}

但这显然行不通...

4

3 回答 3

9

harvester您可以从具有角色的creep中创建另一个数组:

var harvesters = [];
for(var i in Game.creeps) {
    if(Game.creeps[i].memory== 'harvester') {
    harvesters.push(Game.creeps[i]);
}

if(harvesters.length < 3){
    Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE], null, 'Harvester');
}

或使用 lodash:

var harvesters = _.filter(Game.creeps, {memory: 'harvester'});

if(_.size(harvesters) < 3){
    Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE], null, 'Harvester');
}
于 2014-11-21T11:38:39.650 回答
1

你可以这样做:

if(Number(Harvesters.name.slice(-1)) < 3)
    Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE],'Harvester'+ Harvesters.length, 'Harvester');

这里要注意的是 index 不是属性,具有欺骗性的 id 属性是唯一的,因此不是您要查找的。这段代码查看当前cree的名字并获取最后一个字符,然后将其转换为一个数字,并将其与3进行比较。

不过,您分配给内存的方式很好。如果你真的想要,你可以在那里做一个对象,但你现在如何设置它似乎没有必要。它看起来像这样:

Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE],'Harvester'+ Harvesters.length, {role: 'Harvester'});

而且您必须确保将memory支票更改为memory.role.

重读,我认为我所做的并不是你所要求的。如果我理解正确,这应该会更好(虽然不漂亮)

module.exports = function() {

    var totalHarv = 0;
    for(var q in Game.creeps)
        if (Game.creeps[q].memory == 'Harvester')
            totalHarv++;

    for(var i in Game.creeps) {
        if(Game.creeps[i].memory == 'Harvester') {
            while(totalHarv < 3) {
                Game.spawns.Spawn1.createCreep([Game.WORK, Game.CARRY, Game.MOVE], 'Harvester'+ totalHarv, 'Harvester');
                totalHarv++;
            }
        }
    }
}

如果它找到一个 Harvester,它会循环遍历小兵并增加一个计数器,然后当你尝试生成和填充时,它可以检查它们是否足够,并在必要时添加更多。

于 2014-11-21T10:50:43.577 回答
0

room.find 和 position.findNearest 方法都采用可选参数,其中之一是过滤器。我用它来查找所有特定类型。

首先,我确保为我生成的每个cree分配一个类型:

var new_creep = spawn.createCreep(creepTypes[requirement.Type].Spec);
Memory.creeps[new_creep].Type = requirement.Type;

然后稍后我可以使用过滤器:

function gatherHarvesters(creep) {
    var harvesters = creep.room.find(Game.MY_CREEPS, { "filter": selectHarvesters });
    _.sortBy(harvesters, function(harvester) {
        return (harvester.energy * harvester.energy) - creep.room.findPath(creep.pos, harvester.pos).length;
    });
    return harvesters;
}

function selectHarvesters(creep) {
    return creep.memory.Type == "Harvester";
}
于 2014-11-22T01:13:24.823 回答