Screeps Builders 不收集能量
Screeps Builders Not Gathering Energy
我修改了一些 role.builders.js 文件,让我的 creep 首先检查 spawn 是否有能量,如果它没有收集能量来建造,否则从 spawn 获取它。这是我拥有的:
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;
有什么关于我遗漏的建议吗?建造者被冻结在原地,即使它说他们正在移动到生成点。
就像您已经注意到的那样,如果您为它使用预设变量,这样的东西效果会更好。
为了完整起见,我将重新发布您的解决方案。但是你不需要 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);
}
但无论如何,我在您的代码中还注意到一件事!你告诉你的建设者去采矿,如果目前有 NO 产卵中的能量。
if(!Game.spawns['MySpawn'].energy) { ... }
问题是,那里几乎总会有一些能量,因为只要你的能量总量低于 300,你的出生点每刻都会产生 1 能量!因此,您的建造者最多会去收获 一个刻度,然后转身从产卵处取回它 - 因为现在那里至少有 1 个能量。
下一个问题是,您将 运行 陷入无法建造新 creep 的问题,因为您的建造者总是在生成之前获取您所有的能量!
为了弥补这两个问题,尝试这样的事情:
var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
var secureEnergy = 300;
if(spwn.energy > secureEnergy) { ... }
将 secureEnergy
设置为高于您需要生成的平均 creep 的数量(至少高于您最重要的收割机 creep 的需要!)。例如,一个基本的 [WORK,CARRY,MOVE]
creep 需要 250 能量,而您的建造者可以携带 50 能量,因此您可能希望您的建造者仅在生成中至少有 300 secureEnergy
时才收回其 50 能量。这样一来,您始终可以生成新的 creep。这对你有意义吗?
希望我能为您提供一些帮助...祝您在 Screeps 中玩得开心! ;)
我修改了一些 role.builders.js 文件,让我的 creep 首先检查 spawn 是否有能量,如果它没有收集能量来建造,否则从 spawn 获取它。这是我拥有的:
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;
有什么关于我遗漏的建议吗?建造者被冻结在原地,即使它说他们正在移动到生成点。
就像您已经注意到的那样,如果您为它使用预设变量,这样的东西效果会更好。
为了完整起见,我将重新发布您的解决方案。但是你不需要 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);
}
但无论如何,我在您的代码中还注意到一件事!你告诉你的建设者去采矿,如果目前有 NO 产卵中的能量。
if(!Game.spawns['MySpawn'].energy) { ... }
问题是,那里几乎总会有一些能量,因为只要你的能量总量低于 300,你的出生点每刻都会产生 1 能量!因此,您的建造者最多会去收获 一个刻度,然后转身从产卵处取回它 - 因为现在那里至少有 1 个能量。
下一个问题是,您将 运行 陷入无法建造新 creep 的问题,因为您的建造者总是在生成之前获取您所有的能量!
为了弥补这两个问题,尝试这样的事情:
var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
var secureEnergy = 300;
if(spwn.energy > secureEnergy) { ... }
将 secureEnergy
设置为高于您需要生成的平均 creep 的数量(至少高于您最重要的收割机 creep 的需要!)。例如,一个基本的 [WORK,CARRY,MOVE]
creep 需要 250 能量,而您的建造者可以携带 50 能量,因此您可能希望您的建造者仅在生成中至少有 300 secureEnergy
时才收回其 50 能量。这样一来,您始终可以生成新的 creep。这对你有意义吗?
希望我能为您提供一些帮助...祝您在 Screeps 中玩得开心! ;)