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

screeps 系列教程

簡介

作為新手玩家在游戲進(jìn)程中遇到的第一個”BOSS“,很多人會對如何拓展自己的疆域感到無從下手,那么本文就簡單介紹一下在殖民地擴(kuò)張的過程中你可能會遇到的一些問題和該怎么改寫自己的代碼吧。

多房間

首先來簡單了解一下怎么殖民到新的房間,在游戲中有個等級叫做GCL (全局控制等級)。如果你不太了解的話可以參考 Screeps 概念介紹(下) 中的 等級 小節(jié)。每升一級GCL,都會給你解鎖一個新的房間控制額度。新玩家的GCL1級。一般會在你第一個房間的RCL (房間控制等級) 達(dá)到5級半時升至2GCL,從而解鎖第二個房間的控制額度。

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

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

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

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

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

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

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

這句話獲取不到room對象,哪里出問題了!不用擔(dān)心,你的寫法沒錯。在作怪的是一個叫做 視野 的游戲機(jī)制。

你可能會疑惑,我點(diǎn)進(jìn)房間里什么都可以看得到啊。沒錯,你是能看到,但是代碼看不到。你可以在 官方 api 文檔 中找到這句話:

Game.rooms 的 api 介紹

注意后面這句,當(dāng)房間中有自己的 creep 或者建筑時,該房間可見。所以說,如果我們沒有任何單位在房間中時,我們將無法獲取那個房間的對象?,F(xiàn)在讓我們來改寫一下上面的代碼:

// 要占領(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 {
    // 如果房間存在了就說明已經(jīng)進(jìn)入了該房間
    // 移動到房間的控制器并占領(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 跑到控制器面前然后頂了一下控制器后,你就會發(fā)現(xiàn)控制器瞬間升到了1級。沒錯,你已經(jīng)占領(lǐng)了這個房間。如果你并沒有看到這一幕,請打印 claimController() 的返回值并查閱文檔。

第二步:建造 Spawn !

當(dāng)你占領(lǐng)了房間之后就會發(fā)現(xiàn),什么都沒有發(fā)生。是的,占領(lǐng)新房間并不會送你什么建筑,你需要手動建造。首先要建造的就是Spawn建筑。Construct建筑列表中,你可以在下方找到解鎖的 Spawn(如果你沒有找到的話請檢查房間中是否有別人遺留下來的 Spawn,可以直接摧毀,其他建筑同理)。

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

// 因為我們的 claimer 已經(jīng)在房間里了
// 所以我們可以正常的獲取該房間的對象。
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 就會越高,你可以使用如下形式的moveTo來提高緩存的距離以節(jié)省 cpu:

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

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

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

小提示:1 級的房間控制器將在 20,000 ticks 后降級至 0 級。屆時你將失去這個房間并需要重新占領(lǐng)。所以請在其降至 0 級前建立起可靠的控制器升級邏輯。

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

外礦

在不屬于自己的房間內(nèi)采集并收集能量的行為 被稱為開外礦。例如下圖,可以看到其只有中間一個房間有完整的基地,而周圍有很多房間的礦(外礦 )通過道路和基地連接在一起:

overmind 控制下的房間

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

一個外礦房間

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

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

外礦的好處與壞處?

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

那么古爾丹,代價是什么呢?

代價就是,你的 cpu 消耗可能會因此增加很多。creep 尋路會消耗 cpu。路程越長 cpu 消耗量越大。當(dāng)你的外礦距離比較遠(yuǎn)時,使用一般的moveTo進(jìn)行尋路可能會導(dǎo)致你的 cpu 飆升。這時候你就需要一些額外手段了,例如使用PathFinderroom.findPath手動尋路并緩存路徑等。所以開外礦實際是在 cpu 使用量和能量開采速率之間做權(quán)衡。

提高外礦的效率

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

容量只有 1500 的能量礦

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

source 的官方介紹

1500 也太少了點(diǎn),那么能不能...能!我們只需要把這個房間 預(yù)定 了即可。什么是預(yù)定呢?實際上,creep 擁有三種針對控制器的行為,預(yù)定就是其中的一種,下面我們來簡單介紹一下:

  • 占領(lǐng)claimController:將該房間占領(lǐng),房間的所有者owner會變成自己,同時可以對房間控制器升級,從而解鎖更高級和更多的建筑,要求自己有空余的房間控制額度。占領(lǐng)房間的 creep 必須擁有CLAIM身體。
  • 預(yù)定reserveController:強(qiáng)度稍弱一點(diǎn)的宣稱,房間的所有者依舊為空,但是房間中能量礦的上限恢復(fù)至正常的3000。預(yù)定時間會不斷衰減,衰減至 0 時能量礦上限重新變成 1500。預(yù)定房間的 creep 必須擁有CLAIM身體。
  • 簽名signController:最弱(沒用)的宣稱,你可以使用任意身體部件的 creep 給任意房間 (包括敵對房間 ) 控制器簽名。簽名可以在世界地圖中看到并且不會自動衰減消失。但是不會對房間造成任何影響。
一個被同時預(yù)定和簽名的房間

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

預(yù)定時間最長為5000ticks,可以通過controller面板中的Reserved屬性看到,見上圖。

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

開外礦會遇到的問題

入侵者

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

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

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

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

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

基建維護(hù)

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

視野問題

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

總結(jié)

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容