首先記錄一下遇見的問題:
1.使不同的小兵分別移動到不同的目的地——已解決,sources數組改下標就好。
每個mode中的代碼中,以roleUpgrader教程代碼為例:
1 var roleUpgrader = { 2 3 /** @param {Creep} creep **/ 4 run: function(creep) { 5 if(creep.store[RESOURCE_ENERGY] == 0) { 6 var sources = creep.room.find(FIND_SOURCES); 7 if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) { 8 creep.moveTo(sources[0]); 9 } 10 } 11 else { 12 if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) { 13 creep.moveTo(creep.room.controller); 14 } 15 } 16 } 17 }; 18 19 module.exports = roleUpgrader;
2.使它們自動補充兵力——已解決,照着教程按着自己兵的名字進行修改
以我修改的教程代碼為例,復制第15~23行,然后根據自己命名修改,后面24~32,33~41,44~51,都是根據這樣的原理修改,會暫用一點CPU,但考慮先跑起來,以后再來提高效率:
1 var roleHarvester = require('role.builder'); 2 var roleUpgrader = require('role.upgrader'); 3 var roleBuilder = require('role.upgrader'); 4 var roleBiger = require('role.biger') 5 6 module.exports.loop = function () { 7 8 for(var name in Memory.creeps) { 9 if(!Game.creeps[name]) { 10 delete Memory.creeps[name]; 11 console.log('Clearing non-existing creep memory:', name); 12 } 13 } 14 15 var harvesters = _.filter(Game.creeps, (creep) => creep.memory.role == 'harvester'); 16 console.log('Harvesters: ' + harvesters.length); 17 18 if(harvesters.length < 2) { 19 var newName = 'Harvester' + Game.time; 20 console.log('Spawning new harvester: ' + newName); 21 Game.spawns['Spawn1'].spawnCreep([WORK,CARRY,MOVE], newName, 22 {memory: {role: 'harvester'}}); 23 }
24 var builders = _.filter(Game.creeps, (creep) => creep.memory.role == 'builder'); 25 console.log('builders: ' + builders.length); 26 27 if(builders.length < 2) { 28 var newName = 'Builder' + Game.time; 29 console.log('Spawning new builder: ' + newName); 30 Game.spawns['Spawn1'].spawnCreep([WORK,CARRY,MOVE], newName, 31 {memory: {role: 'builder'}}); 32 }
33 var upgraders = _.filter(Game.creeps, (creep) => creep.memory.role == 'upgrader'); 34 console.log('upgraders: ' + upgraders.length); 35 36 if(upgraders.length < 6) { 37 var newName = 'Upgrader' + Game.time; 38 console.log('Spawning new upgrader: ' + newName); 39 Game.spawns['Spawn1'].spawnCreep([WORK,CARRY,MOVE], newName, 40 {memory: {role: 'upgrader'}}); 41 }
42 43 var bigers = _.filter(Game.creeps, (creep) => creep.memory.role == 'biger'); 44 console.log('bigers: ' + bigers.length); 45 46 if(bigers.length < 1) { 47 var newName = 'Biger' + Game.time; 48 console.log('Spawning new biger: ' + newName); 49 Game.spawns['Spawn1'].spawnCreep([WORK,CARRY,MOVE], newName, 50 {memory: {role: 'biger'}}); 51 }
52 53 if(Game.spawns['Spawn1'].spawning) { 54 var spawningCreep = Game.creeps[Game.spawns['Spawn1'].spawning.name]; 55 Game.spawns['Spawn1'].room.visual.text( 56 '🛠️' + spawningCreep.memory.role, 57 Game.spawns['Spawn1'].pos.x + 1, 58 Game.spawns['Spawn1'].pos.y, 59 {align: 'left', opacity: 0.8}); 60 } 61 62 for(var name in Game.creeps) { 63 var creep = Game.creeps[name]; 64 if(creep.memory.role == 'harvester') { 65 roleHarvester.run(creep); 66 } 67 if(creep.memory.role == 'upgrader') { 68 roleUpgrader.run(creep); 69 } 70 if(creep.memory.role == 'builder') { 71 roleBuilder.run(creep); 72 } 73 if(creep.memory.role == 'biger') { 74 roleBiger.run(creep); 75 } 76 } 77 }
3.建築物的建造方法找了很久——已解決,照着教程的Game.spawns['Spawn1'].room.createConstructionSite( 23, 22, STRUCTURE_TOWER );
對藍色部分更改成自己想修改的建築,有關建築介紹,看這個網址:https://twodam.net/Tutorial-for-Screeps-3
當時教程直接就建造好了5個擴容器,到我自己入手時,一直找怎么建擴容器EXTENSION,找的十分久。
Game.spawns['Spawn1'].room.createConstructionSite( X, Y, STRUCTURE_EXTENSION );
4.小兵工作內容同步——已解決
每個小兵的工作內容,是根據模塊來控制的。
在主函數中,開頭要接入這些模塊
同時在主函數中,讓小兵工作時,調用模塊
我記得我當時修改的時候,直接復制,忘記修改紅字,使得兩種小兵干同一個工作,我愣了很久,以為它們太相親相愛,放着沒管,下圖是當時誤認為它們相親相愛的代碼,可以比對上面:
for(var name in Game.creeps) { var creep = Game.creeps[name]; if(creep.memory.role == 'harvester') { roleHarvester.run(creep); } if(creep.memory.role == 'upgrader') { roleUpgrader.run(creep); } if(creep.memory.role == 'builder') { roleBuilder.run(creep); } if(creep.memory.role == 'biger') { roleHarvester.run(creep); } }
5.小兵對建築工作的優先級——已解決
以我修改的教程代碼為例:
var roleBiger = { /** @param {Creep} creep **/ run: function(creep) { if(creep.store.getFreeCapacity() > 0) { var sources = creep.room.find(FIND_SOURCES); if(creep.harvest(sources[1]) == ERR_NOT_IN_RANGE) { creep.moveTo(sources[1], {visualizePathStyle: {stroke: '#ffaa00'}}); } } else { var targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_EXTENSION || structure.structureType == STRUCTURE_SPAWN || structure.structureType == STRUCTURE_CONTAINER|| structure.structureType == STRUCTURE_TOWER) && structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0; } }); if(targets.length > 0) { if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}}); } } } } }; module.exports = roleBiger;
紅色的區域就是要讓小兵去補充資源的代碼,放在第一行,為targets[0],放在第二行,為targets[1],按照自己覺得的優先級,照着格式,把建築名稱加上就好,有關建築的名稱記得大寫,有關建築介紹,看這個網址:https://twodam.net/Tutorial-for-Screeps-3
6.給控制器送資源的小兵,一次只給它一個能量——未解決
我看了下判斷條件,第五行
當他有資源的時候,它就會送貨,等於0時才會補貨。
我想讓它和其他小兵一樣補充完再去送,所以更改了條件,然后它變成補充50,送1個,再去補充。。。我傻眼了。后續再來更改這個地方的條件。
只能周末玩一會。
7.建不了人工牆,塔,大兵,等等。——未解決。
我猜想,可能2級控制器不能建吧。可能要升級控制器才行。
8.安排目標不合理,浪費了很多時間。——正在改進每個小兵的計划安排
9.只有周末能玩,比不過其他玩家,可能被侵占。——復盤重來