[screeps]room孵化队列的设计

在房间Coltroller等级达到7级和8级的时候,每个房间将解锁第二个/第三个Spawn,这时候就要考虑代码怎么能多兵营(spawn)同时造兵,而不是让spawn成为一个巨大的Extension

image.png

孵化任务列表

设想有一个孵化任务列表,来让spawn们自己来认领自己的孵化任务,当spawn可以孵化时,那我就领下这个任务。当spawn正在孵化时,那就不领。
现在要考虑的问题就是:

  1. 生成孵化任务列表
  2. spawn认领任务

生成孵化任务列表

在教程中,教给我们的是,使用数量来判断是否需要孵化更多的role,我也没有研究出更好的方法,也是用数量判断。
设定一个limit值表示房间内规划的数量,例如limit = 2,那当我在房间内数creep数小于limit值时,就要向孵化列表中push孵化任务了。
接下来的问题时那这个房间内数量的值,怎么获取呢?
使用memory存储,在孵化creep时除了role还定义了1个额外的值room 来标识这个creep出生的房间。
循环Game.creeps时,就能从memory中获得各个room中的role数量了
但这样还不够,有可能出现这种情况无法完成全部孵化任务
1.energy不够,spawn无法完成孵化任务
2.spawn在孵化中无法完成孵化任务
那在本tick结束后,队列中的指标还是没有完成,下一tick就会继续push孵化任务。
所以在计算数量的时候,还要算上queue中预孵化的这一部分creep

spawn认领任务

在创建好孵化任务列表后,认领任务就简单多了,只要循环Game.spawns判断spawnCreep的返回值,如果成功,那就删除第一个任务就好了。
有一点要注意的是,教程里为creep命名时,用的时Game.time,但实际上,有可能是同一tick时多个spawn一起孵化,而creep的名字不能重复,就要给creep一个绝对不能重复的名字。
我翻了下lodash文档,还真有_.uniqueId([prefix=''])

多兵营出兵

这样设计,spawn孵化资源就能利用上了,附几个代码参考

  • 数量检测Env.js
module.exports = function () {
  // 清除死去creep的memory
  const creepsName = Object.keys(Game.creeps)
  Object.keys(Memory.creeps).forEach(name => {
    if (!creepsName.includes(name)) {
      delete Memory.creeps[name]
    }
  })
  // 统计每个房间creeps数
  global.roomCreeps = {}
  Object.values(Game.creeps).forEach(creep => {
    const { room, role } = creep.memory
    if (!global.roomCreeps[room]) {
      global.roomCreeps[room] = {
        [role]: 1
      }
    } else if (!global.roomCreeps[room][role]) {
      global.roomCreeps[room][role] = 1
    } else {
      global.roomCreeps[room][role]++
    }
  })
}
  • room控制器
module.exports = function (room) {
  roomSpawnCreeps(room)
}

/**
 * 检查creep数量 room数+queue数
 */
function roomSpawnCreeps(room) {
  const { harvester = 0 } = global.roomCreeps[room.name] || {}
  const queue = room.memory.queue || []
  const queueNum = {}

  queue.forEach(role => {
    queueNum[role]
      ? queueNum[role]++
      : queueNum[role] = 1
  })

  if (harvester + (queueNum['harvester'] || 0) < 2) {
    queue.push('harvester')
  }
  room.memory.queue = queue
}
  • spawn控制器
module.exports = function (spawn) {
  getSpawnFromQueue(spawn)
}

// 从队列种选取孵化任务,领取后,shift掉
function getSpawnFromQueue(spawn) {
  const queue = spawn.room.memory.queue
  // 是否可以孵化?
  if (queue.length > 0 && !spawn.spawning) {
    const role = queue[0] // 孵化队列第一位
    const bodys = getBodys(role)
    const result = bodys && spawn.spawnCreep(bodys, _.uniqueId('harvester_'), {
      memory: {
        role: 'harvester',
        room: spawn.room.name
      }
    })
    if (result === OK) {
      queue.shift()
      spawn.room.memory.queue = queue
    }
  }
}

function getBodys(role) {
  if (role === 'harvester') {
    return [WORK, MOVE, CARRY]
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 为了不让自己下线时出现 creep 都凉了的情况,你的代码里或多或少都有一个用于控制他们数量的模块。在教程中,官方...
    HoPGoldy阅读 8,660评论 9 28
  • 前言 本文来讨论一下 Screeps 中最重要的 角色系统 的设计方案以及一些基本原则。注意,本文中讨论的内容可能...
    HoPGoldy阅读 13,629评论 3 13
  • 简介 在设计自己的角色系统的时候,很多人都会被角色越来越多的问题所困扰,本文不讨论如何去削减角色的数量,而是从“发...
    HoPGoldy阅读 9,918评论 7 21
  • 简介 作为新手玩家在游戏进程中遇到的第一个”BOSS“,很多人会对如何拓展自己的疆域感到无从下手,那么本文就简单介...
    HoPGoldy阅读 10,821评论 4 12
  • 作为一个多人在线沙盒游戏,和别的玩家发生冲突可以说是不可避免的事情。本文简单介绍一下在 Screeps 中的防御方...
    HoPGoldy阅读 5,595评论 0 7