Screeps得到具有特定记忆的所有小兵(角色)

时间:2014-11-21 10:02:48

标签: javascript screeps

我试图弄清楚如何通过变量中的特定记忆或角色来获取每一个蠕变......我似乎无法弄明白。

我已经尝试过:

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

但这显然不会起作用......

3 个答案:

答案 0 :(得分:7)

您可以使用harvester角色来创建另一个数组:

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

答案 1 :(得分:1)

您可以这样做:

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

这里要注意的是索引不是属性,欺骗性的id属性是唯一的,因此不是你要找的东西。此代码会查看当前creep的名称并获取最后一个字符,然后将其转换为数字,并将其与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,它会循环遍历creeps并增加一个计数器,然后当你尝试生成和填充时,它可以检查是否有足够的它们并在必要时添加更多。 / p>

答案 2 :(得分:0)

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

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

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";
}