【问题标题】:Screeps get all creeps with specific memory (role)Screeps 获取所有具有特定记忆(角色)的小兵
【发布时间】:2015-01-19 10:35:12
【问题描述】:

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

我已经试过了:

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

但这显然行不通……

【问题讨论】:

  • 你想将内存中的角色分配给预先存在的小兵还是生成已分配角色的小兵?
  • 生成的小兵已经分配了角色,因此如果一个人死了,另一个会生成。

标签: javascript screeps


【解决方案1】:

您可以使用 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');
}

【讨论】:

  • 我尝试使用 lodash 方法,得到了ReferenceError: _ is not defined at &lt;main&gt;:6:18。知道出了什么问题吗?
  • 好的,我想通了,在我的主请求时我错过了这个var _ = require('lodash');
【解决方案2】:

你可以这样做:

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 时增加一个计数器,然后当您尝试生成和填充时,它可以检查它们是否足够,并在必要时添加更多。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 你为什么要这样分类你的小兵?排序有什么作用?
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2016-06-18
    • 1970-01-01
    • 2014-08-31
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多