0%

萌新尝试screeps——2、最最基础的运行逻辑

那我们就算正式开始尝试了,为了有一个开头,我翻了一下youtube发现还是有相关教程的,所以前期的几篇大概会通过看教程模仿再加入一些自己的改进

有用的资源

这里建议在看教程模仿的时候调用的方法都去api文档里查一查,一是能够更加熟悉函数,二是教程不可避免地有些老了,有的方法已经被更换建议按照api中的新接口来使用。比如查看携带的资源现在统一为一个store对象了

写下这篇文章的时候我看完了教程的前六段,首先类似地,我们将creep分成了几类,harvester,upgrader,builder,repairer,它们分别做的事情也非常显然

  • harvester是最基本的收获能量填给spawn(以及建造了extension之后填给所有需要energy的地方)
  • upgrader负责收集能量后升级房间的controller
  • builder负责收集能量后填向需要建设的工地
  • repairer负责收集能量后维修建筑

目前的逻辑有的几个问题

  • 当前最基本的逻辑并没有实现自动建设工地,所以目前还需要我们手动指定工地
  • 所有的creep都是从房间的能源生成地获取能量后去做自己的事情,在RCL高了之后我们可以建设storge、link等让harvester填给存储设施而其他的creep从存储设施获取
  • repairer目前的逻辑是先维修不是WALL的建筑之后如果有WALL再维修,这里有一个坑WALL是不能被FIND_MY_STRUCTURE搜索到的,必须是FIND_STRUCTURE才能找到WALL

与教程不同的是,由于存在creep发现自己的事情已经做完的情况下可以去做其他creep的工作,但是直接引用会导致很大的重复代码运行,所以我加入了rolehandle模块负责统一处理各种creep共同的问题而将每种creep的role精简了许多

rolehandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var roleharvester=require('./roleharvester');
var roleupgrader=require('./roleupgrader');
var rolebuilder=require('./rolebuilder');
var rolerepairer=require('./rolerepairer');
module.exports ={
run:function(creep){
if(creep.memory.working == true && creep.store.getFreeCapacity(RESOURCE_ENERGY) == 0){
creep.memory.working = false;
}
else if(creep.memory.working == false && creep.store[RESOURCE_ENERGY] == 0){
creep.memory.working = true;
}
var isworking = creep.memory.working;
if(creep.memory.role == 'harvester'){
if(isworking){
roleharvester.prepare(creep);
}
else{
roleharvester.run(creep);
}
}
else if (creep.memory.role == 'upgrader'){
if(isworking){
roleupgrader.prepare(creep);
}
else{
roleupgrader.run(creep);
}
}
else if (creep.memory.role == 'builder'){
if(isworking){
rolebuilder.prepare(creep);
}
else{
rolebuilder.run(creep);
}
}
else if (creep.memory.role == 'repairer'){
if(isworking){
rolerepairer.prepare(creep);
}
else{
rolerepairer.run(creep);
}
}
}
};
rolerepairer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var rolebuilder=require('./rolebuilder');
module.exports = {
run:function(creep){
var structure=creep.pos.findClosestByPath(FIND_MY_STRUCTURES,{
filter:(s)=>s.hits<s.hitsMax && s.structureType != STRUCTURE_WALL
});
if(structure!=undefined){
if(creep.repair(structure)==ERR_NOT_IN_RANGE){
creep.moveTo(structure);
}
}
else{
structure=creep.pos.findClosestByPath(FIND_STRUCTURES,{
filter:(s)=> s.structureType == STRUCTURE_WALL && s.hits<s.hitsMax
});
if(structure!=undefined){
if(creep.repair(structure)==ERR_NOT_IN_RANGE){
creep.moveTo(structure);
}
}
else{
rolebuilder.run(creep);
}
}
},
prepare:function(creep){
var source=creep.pos.findClosestByPath(FIND_SOURCES);
if(creep.harvest(source)==ERR_NOT_IN_RANGE)
{
creep.moveTo(source);
}
}
};

另外一段处理就是spwan的处理了,当前的处理很简单,当spawn能量够时看缺乏哪种creep按需生产即可

下一步的计划首先是根据RCL以及当前拥有的能量生产适当的creep,尽量做到能够根据RCL情况以及实际能量来生产,而后可能的话开始尝试实现一些简单的自动建筑?