Screeps 擴(kuò)張 - 多房間與外礦

screeps 系列教程

簡(jiǎn)介

作為新手玩家在游戲進(jìn)程中遇到的第一個(gè)”BOSS“,很多人會(huì)對(duì)如何拓展自己的疆域感到無(wú)從下手兼贸,那么本文就簡(jiǎn)單介紹一下在殖民地?cái)U(kuò)張的過(guò)程中你可能會(huì)遇到的一些問(wèn)題和該怎么改寫(xiě)自己的代碼吧。

多房間

首先來(lái)簡(jiǎn)單了解一下怎么殖民到新的房間山宾,在游戲中有個(gè)等級(jí)叫做GCL (全局控制等級(jí))烹困。如果你不太了解的話(huà)可以參考 Screeps 概念介紹(下) 中的 等級(jí) 小節(jié)罕伯。每升一級(jí)GCL凰荚,都會(huì)給你解鎖一個(gè)新的房間控制額度燃观。新玩家的GCL1級(jí)。一般會(huì)在你第一個(gè)房間的RCL (房間控制等級(jí)) 達(dá)到5級(jí)半時(shí)升至2級(jí)GCL便瑟,從而解鎖第二個(gè)房間的控制額度缆毁。

建議在閱讀完本文后再開(kāi)始動(dòng)手,以防出現(xiàn)準(zhǔn)備不充分的情況發(fā)生到涂。

第一步:占領(lǐng)新房間脊框!

當(dāng)你達(dá)到 GCL2 之后,你就可以著手開(kāi)始發(fā)展你的第二塊殖民地了践啄。想占領(lǐng)新的房間缚陷,就要占領(lǐng)他的控制器。而占領(lǐng)控制器我們需要調(diào)用creepclaimController 方法往核,并傳入想要占領(lǐng)房間的控制器即可占領(lǐng)該房間,如下:

// 要占領(lǐng)房間的 creep
const creep = Game.creeps['claimer']
// 要占領(lǐng)的房間
// 注意這一句有可能會(huì)獲取不到 room 對(duì)象嚷节,下面會(huì)解釋
const room = Game.rooms['要占領(lǐng)的房間名']
// 移動(dòng)到房間的控制器并占領(lǐng)
if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
    creep.moveTo(room.controller)
}

注意聂儒,執(zhí)行claimController方法要求 creep 擁有CLAIM身體部分。你可以生成一個(gè)最小的身體結(jié)構(gòu)[ CLAIM, MOVE ]來(lái)完成新房間的占領(lǐng)工作硫痰。

但是衩婚!當(dāng)你執(zhí)行上面代碼的時(shí)候,你可能會(huì)發(fā)現(xiàn)下面這行代碼有問(wèn)題:

const room = Game.rooms['要占領(lǐng)的房間名, 如W1N1'] // room 的值為 undefined

這句話(huà)獲取不到room對(duì)象效斑,哪里出問(wèn)題了非春!不用擔(dān)心,你的寫(xiě)法沒(méi)錯(cuò)缓屠。在作怪的是一個(gè)叫做 視野 的游戲機(jī)制奇昙。

你可能會(huì)疑惑,我點(diǎn)進(jìn)房間里什么都可以看得到啊敌完。沒(méi)錯(cuò)储耐,你是能看到,但是代碼看不到滨溉。你可以在 官方 api 文檔 中找到這句話(huà):

Game.rooms 的 api 介紹

注意后面這句什湘,當(dāng)房間中有自己的 creep 或者建筑時(shí),該房間可見(jiàn)晦攒。所以說(shuō)闽撤,如果我們沒(méi)有任何單位在房間中時(shí),我們將無(wú)法獲取那個(gè)房間的對(duì)象「眨現(xiàn)在讓我們來(lái)改寫(xiě)一下上面的代碼:

// 要占領(lǐng)房間的 creep
const creep = Game.creeps['claimer']
// 要占領(lǐng)的房間
const room = Game.rooms['要占領(lǐng)的房間名']
// 如果該房間不存在就先往房間走
if (!room) {
    creep.moveTo(new RoomPosition(25, 25, '要占領(lǐng)的房間'))
}
else {
    // 如果房間存在了就說(shuō)明已經(jīng)進(jìn)入了該房間
    // 移動(dòng)到房間的控制器并占領(lǐng)
    if (creep.claimController(room.controller) == ERR_NOT_IN_RANGE) {
        creep.moveTo(room.controller)
    }
}

這樣就可以保證 creep 正確的跑到目標(biāo)房間然后占領(lǐng)控制器哟旗,關(guān)于其中RoomPosition的文檔看 這里,這里不再贅述。

當(dāng) creep 跑到控制器面前然后頂了一下控制器后热幔,你就會(huì)發(fā)現(xiàn)控制器瞬間升到了1級(jí)乐设。沒(méi)錯(cuò),你已經(jīng)占領(lǐng)了這個(gè)房間绎巨。如果你并沒(méi)有看到這一幕近尚,請(qǐng)打印 claimController() 的返回值并查閱文檔。

第二步:建造 Spawn !

當(dāng)你占領(lǐng)了房間之后就會(huì)發(fā)現(xiàn)场勤,什么都沒(méi)有發(fā)生戈锻。是的,占領(lǐng)新房間并不會(huì)送你什么建筑和媳,你需要手動(dòng)建造格遭。首先要建造的就是Spawn建筑。Construct建筑列表中留瞳,你可以在下方找到解鎖的 Spawn(如果你沒(méi)有找到的話(huà)請(qǐng)檢查房間中是否有別人遺留下來(lái)的 Spawn拒迅,可以直接摧毀,其他建筑同理)她倘。

現(xiàn)在璧微,我們需要生產(chǎn)建筑工來(lái)將我們的 spawn 造好,使用如下代碼將建筑工引導(dǎo)至新房間:

// 因?yàn)槲覀兊?claimer 已經(jīng)在房間里了
// 所以我們可以正常的獲取該房間的對(duì)象硬梁。
const target = Game.getObjectById('spawn工地的id')
const creep = Game.creeps['builder']

// 獲取能量的邏輯
// ...

// 建造 spawn
if(target) {
    if(creep.build(target) == ERR_NOT_IN_RANGE) {
        creep.moveTo(target)
    }
}

注意前硫,creep 距離目標(biāo)越遠(yuǎn),moveTo() 所消耗的 cpu 就會(huì)越高荧止,你可以使用如下形式的moveTo來(lái)提高緩存的距離以節(jié)省 cpu:

// reusePath 代表緩存的距離屹电,默認(rèn)為 5
creep.moveTo(target, { reusePath: 50 })

上面的代碼僅為參考,你應(yīng)該結(jié)合你的 creep 數(shù)量控制模塊 以及 角色模塊 來(lái)創(chuàng)建一個(gè)通用性更高的“新房間占領(lǐng)邏輯”跃巡。

建造一個(gè) spawn 要花費(fèi) 1.5k 的能量危号,所以你應(yīng)該在你源房間的能力范圍內(nèi)生成最多身體部件的builder來(lái)加快 spawn 的建造。當(dāng)你的新 spawn 建造完成后瓷炮,一個(gè)嶄新的殖民地就準(zhǔn)備就緒了葱色。你可以像之前一樣挖礦并升級(jí)你的房間控制器了。

小提示:1 級(jí)的房間控制器將在 20,000 ticks 后降級(jí)至 0 級(jí)娘香。屆時(shí)你將失去這個(gè)房間并需要重新占領(lǐng)苍狰。所以請(qǐng)?jiān)谄浣抵?0 級(jí)前建立起可靠的控制器升級(jí)邏輯。

ok烘绽,到目前為止我們已經(jīng)講完了如何控制一個(gè)新的房間淋昭,接下來(lái)我們就來(lái)講一下給殖民地發(fā)展增速的有效手段:外礦。

外礦

在不屬于自己的房間內(nèi)采集并收集能量的行為 被稱(chēng)為開(kāi)外礦安接。例如下圖翔忽,可以看到其只有中間一個(gè)房間有完整的基地,而周?chē)泻芏喾块g的礦(外礦 )通過(guò)道路和基地連接在一起:

overmind 控制下的房間

我們點(diǎn)開(kāi)基地下方的房間就可以更清楚的了解到這個(gè)概念:

一個(gè)外礦房間

可以看到房間內(nèi)只有兩個(gè) creep。一個(gè)在采集能量歇式,另一個(gè)對(duì)著房間控制器不知道在做著什么驶悟,在做什么我們稍后再來(lái)討論

很多新手玩家再?zèng)]接觸過(guò)這個(gè)玩法之前很難想象到可以這么做材失。實(shí)際上痕鳍,官方并沒(méi)有禁止甚至推薦這么做。你可以發(fā)現(xiàn)龙巨,roadcontainer這兩種建筑實(shí)際上是可以在不屬于自己的房間內(nèi)建造的笼呆。所以你可以借此讓你的外礦運(yùn)作效率更高。

外礦的好處與壞處旨别?

開(kāi)外礦可以使得你基地的能量獲取更加充沛從而提高殖民地運(yùn)轉(zhuǎn)效率诗赌,或許你已經(jīng)注意到了,采礦需要時(shí)間一點(diǎn)一點(diǎn)的開(kāi)采秸弛,而從存儲(chǔ)中獲取能量在一個(gè) tick 中就可以完成铭若。所以在建立了 開(kāi)采 > 存儲(chǔ) > 使用 體系后,你會(huì)發(fā)現(xiàn)递览,開(kāi)采的很容易跟不上消耗的速度奥喻,而開(kāi)外礦則可以很好的緩解甚至解決這個(gè)問(wèn)題。

那么古爾丹非迹,代價(jià)是什么呢?

代價(jià)就是纯趋,你的 cpu 消耗可能會(huì)因此增加很多憎兽。creep 尋路會(huì)消耗 cpu。路程越長(zhǎng) cpu 消耗量越大吵冒。當(dāng)你的外礦距離比較遠(yuǎn)時(shí)纯命,使用一般的moveTo進(jìn)行尋路可能會(huì)導(dǎo)致你的 cpu 飆升。這時(shí)候你就需要一些額外手段了痹栖,例如使用PathFinder亿汞、room.findPath手動(dòng)尋路并緩存路徑等。所以開(kāi)外礦實(shí)際是在 cpu 使用量和能量開(kāi)采速率之間做權(quán)衡揪阿。

提高外礦的效率

當(dāng)你隨便點(diǎn)開(kāi)一個(gè)無(wú)主房間的能量礦后疗我,你會(huì)發(fā)現(xiàn)這個(gè)礦的容量上限居然只有可憐的1500。什么情況南捂?

容量只有 1500 的能量礦

我們可以在 官方 api 文檔 中找到為什么吴裤,注意紅框中最后一行,未預(yù)定的房間中容量上限為 1500溺健。:

source 的官方介紹

1500 也太少了點(diǎn)麦牺,那么能不能...能!我們只需要把這個(gè)房間 預(yù)定 了即可。什么是預(yù)定呢剖膳?實(shí)際上魏颓,creep 擁有三種針對(duì)控制器的行為,預(yù)定就是其中的一種吱晒,下面我們來(lái)簡(jiǎn)單介紹一下:

  • 占領(lǐng)claimController:將該房間占領(lǐng)甸饱,房間的所有者owner會(huì)變成自己,同時(shí)可以對(duì)房間控制器升級(jí)枕荞,從而解鎖更高級(jí)和更多的建筑柜候,要求自己有空余的房間控制額度。占領(lǐng)房間的 creep 必須擁有CLAIM身體躏精。
  • 預(yù)定reserveController:強(qiáng)度稍弱一點(diǎn)的宣稱(chēng)渣刷,房間的所有者依舊為空,但是房間中能量礦的上限恢復(fù)至正常的3000矗烛。預(yù)定時(shí)間會(huì)不斷衰減辅柴,衰減至 0 時(shí)能量礦上限重新變成 1500。預(yù)定房間的 creep 必須擁有CLAIM身體瞭吃。
  • 簽名signController:最弱(沒(méi)用)的宣稱(chēng)碌嘀,你可以使用任意身體部件的 creep 給任意房間 (包括敵對(duì)房間 ) 控制器簽名。簽名可以在世界地圖中看到并且不會(huì)自動(dòng)衰減消失歪架。但是不會(huì)對(duì)房間造成任何影響股冗。
一個(gè)被同時(shí)預(yù)定和簽名的房間

這里主要介紹一下預(yù)定reserveController,預(yù)定并不像占領(lǐng)一樣和蚪,一下就可以完成止状,而是需要有 creep 進(jìn)行持續(xù)的預(yù)定,其原因在于:每一個(gè)CLAIM身體每次只能增加1tick 的預(yù)定時(shí)間攒霹。也就是說(shuō)怯疤,如果你有一個(gè)[ CLAIM, MOVE ]的 creep 每 tick 對(duì)房間控制器執(zhí)行一次reserveController的話(huà),當(dāng) creep 死掉的時(shí)候催束,你對(duì)房間的預(yù)定會(huì)立馬結(jié)束集峦。所以為了獲得更加充裕的預(yù)定時(shí)間,請(qǐng)確保你的 creep 擁有最少兩個(gè)CLAIM身體部件抠刺。

預(yù)定時(shí)間最長(zhǎng)為5000ticks塔淤,可以通過(guò)controller面板中的Reserved屬性看到,見(jiàn)上圖速妖。

有一點(diǎn)需要注意的是凯沪,即使不對(duì)房間進(jìn)行預(yù)定,也不影響你正常開(kāi)外礦买优,只是外礦效率只有預(yù)定后的一半妨马,所以推薦先完成外礦的邏輯代碼挺举,再來(lái)考慮預(yù)定者的邏輯。

開(kāi)外礦會(huì)遇到的問(wèn)題

入侵者

只要房間內(nèi)的能量礦被開(kāi)采烘跺,那么這個(gè)房間就有會(huì)產(chǎn)生 npc 入侵者湘纵,所以在外礦中面臨的最大問(wèn)題可能就是來(lái)自入侵者的威脅了。由于無(wú)法建造 tower 進(jìn)行防御滤淳,所以你需要給外礦房間內(nèi)派遣一些守衛(wèi)(常駐或檢測(cè)到入侵者后再生成)梧喷。或者你可以采取更猥瑣一點(diǎn)的方法脖咐,例如有入侵者的話(huà)就直接撤退至安全房間直到入侵者老死铺敌。

在更新了 4.0 版本以后游戲新增了 NPC 要塞的機(jī)制,這個(gè)機(jī)制對(duì)于外礦的開(kāi)發(fā)來(lái)說(shuō)有不小的影響屁擅。NPC 會(huì)不斷的在沒(méi)有claim的房間內(nèi)生成一個(gè)小型的核心來(lái)預(yù)定房間偿凭。所以你可能要在外礦維護(hù)的模塊中添加一些額外邏輯來(lái)清除這些惹人厭的 NPC 核心(當(dāng)然如果你懶的打的話(huà),core 一般也會(huì)在幾萬(wàn) tick 內(nèi)消失 )派歌。

需要注意的是弯囊,Creep.dismantle() 是對(duì)小型核心沒(méi)有效果的,不要想著讓外礦采集單位順手拆掉胶果。

一個(gè)正在預(yù)定控制器的小型核心

你可以從 NPC 入侵者 - 要塞原型介紹 - InvaderCore 了解到更多信息匾嘱。

基建維護(hù)

因?yàn)?road 和 container 可以在RCL 0的房間內(nèi)建造,所以很多人都會(huì)在外礦中建造這兩者來(lái)提高效率早抠,但是這兩者都會(huì)磨損霎烙,所以對(duì)房間內(nèi)基礎(chǔ)設(shè)施的維護(hù)就成為了一個(gè)重要的問(wèn)題。你可以讓你的開(kāi)采者或運(yùn)輸者在運(yùn)能量回來(lái)時(shí)順路檢查其生命值并維修蕊连,或者其他你能想到的更好辦法吼过。

視野問(wèn)題

由于外礦房間內(nèi)屬于自己的單位并不多,所以有的時(shí)候可能會(huì)出現(xiàn)該房間沒(méi)有視野的問(wèn)題咪奖,所以請(qǐng)確保你的外礦房間有可靠的視野,或者你的代碼足夠健壯酱床,當(dāng)房間沒(méi)有視野時(shí)也不影響正常的工作羊赵。

總結(jié)

本文簡(jiǎn)單介紹了如何拓展自己的殖民地,你可以控制的房間數(shù)量和你的GCL等級(jí)是相等的扇谣,在擁有空余的房間控制額度時(shí)昧捷,你可以通過(guò) creep 的claimController來(lái)占領(lǐng)一個(gè)新的房間,但是要記得在占領(lǐng)新房間后及時(shí)建造spawn罐寨。

除了占領(lǐng)新房間靡挥,你還可以通過(guò)開(kāi)外礦的形式來(lái)利用其他房間的能量礦。使用reserveController可以預(yù)定房間鸯绿,從而使該房間的能量礦上限恢復(fù)至3000跋破。另外還要注意 npc 入侵者簸淀、基建維護(hù)、視野以及尋路成本帶來(lái)的影響毒返。

如果你想要了解更多關(guān)于 screeps 的內(nèi)容租幕,歡迎訪(fǎng)問(wèn)我的文集《Screeps》~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拧簸,隨后出現(xiàn)的幾起案子劲绪,更是在濱河造成了極大的恐慌,老刑警劉巖盆赤,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贾富,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牺六,警方通過(guò)查閱死者的電腦和手機(jī)颤枪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兔乞,“玉大人汇鞭,你說(shuō)我怎么就攤上這事∮棺罚” “怎么了霍骄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)淡溯。 經(jīng)常有香客問(wèn)我读整,道長(zhǎng),這世上最難降的妖魔是什么咱娶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任米间,我火速辦了婚禮,結(jié)果婚禮上膘侮,老公的妹妹穿的比我還像新娘屈糊。我一直安慰自己,他們只是感情好琼了,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布逻锐。 她就那樣靜靜地躺著,像睡著了一般雕薪。 火紅的嫁衣襯著肌膚如雪昧诱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天所袁,我揣著相機(jī)與錄音盏档,去河邊找鬼。 笑死燥爷,一個(gè)胖子當(dāng)著我的面吹牛蜈亩,可吹牛的內(nèi)容都是我干的懦窘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勺拣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奶赠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起药有,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毅戈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后愤惰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苇经,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年宦言,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扇单。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奠旺,死狀恐怖蜘澜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情响疚,我是刑警寧澤鄙信,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站忿晕,受9級(jí)特大地震影響装诡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜践盼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一鸦采、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咕幻,春花似錦渔伯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绷耍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲜侥,已是汗流浹背褂始。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留描函,地道東北人崎苗。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓狐粱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胆数。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肌蜻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • screeps 里會(huì)時(shí)不時(shí)的給你一個(gè)提示,平時(shí)也沒(méi)怎么看過(guò)必尼,今天特地點(diǎn)了一遍蒋搜,把常見(jiàn)的 tip 都記錄一下供大家參...
    HoPGoldy閱讀 4,376評(píng)論 1 7
  • 這個(gè)問(wèn)題可能是困擾所有萌新玩家的第一個(gè)問(wèn)題了。當(dāng)你打開(kāi)screeps之后判莉,看到地圖上花花綠綠一大片的玩家豆挽,相信有很...
    HoPGoldy閱讀 14,573評(píng)論 6 17
  • abandon, desert, forsake, leave, give up abandon :強(qiáng)調(diào)永遠(yuǎn)或完全...
    sunxiaohang閱讀 2,306評(píng)論 0 3
  • 金田公司于2001年12月從WMC資源有限公司購(gòu)買(mǎi)了圣伊維斯礦山。在購(gòu)買(mǎi)后券盅,他們立刻開(kāi)始著手提高現(xiàn)有選礦廠(chǎng)的處理能...
    四方談閱讀 1,950評(píng)論 0 0
  • 我終于失去你了 還在人前裝作快樂(lè) 可其實(shí)沒(méi)人看我笑著 或是眼淚落了幾顆 但你曾經(jīng)為什么 短暫停留卻讓人深刻 你終于...
    夏小溪_閱讀 230評(píng)論 6 3