狀態(tài)模擬技術(shù)-詳解Screeps

寫這篇文章的目的是為了在之后會(huì)講到的關(guān)于Screeps中如何跨Tick執(zhí)行代碼這篇文章做鋪墊。

本章內(nèi)容也許對(duì)目前的你沒(méi)有任何啟發(fā)或者是作用,但他的的確確成為了跨Tick執(zhí)行技術(shù)的基礎(chǔ)。

狀態(tài)模擬技術(shù)

概念:修改Screeps中的對(duì)象屬性,讓其擁有未來(lái)某個(gè)或任意Tick的狀態(tài)或?qū)傩浴?/p>

作用:這使得你可以在本tick中,計(jì)算下一個(gè)tick或任意一個(gè)可能的情況下,某個(gè)對(duì)象的操作。

這么說(shuō)可能比較模糊,下面我們來(lái)到Screeps來(lái)實(shí)際運(yùn)用一下狀態(tài)模擬技術(shù)。

準(zhǔn)備工作

  • 1只Creep
  • 1個(gè)SOURCE對(duì)象

請(qǐng)看下面的代碼
(抽象代碼,請(qǐng)勿直接使用)

RoomSources = Game.rooms[roomName].find(FIND_SOURCES)[0];
console.log(RoomSources.pos)

這段代碼我們獲得了一個(gè)Sources對(duì)象,并輸出了它的pos位置對(duì)象。結(jié)果如下

{
roomName:"E10N10",
x:16
y:25
}

這表明這個(gè)Sources對(duì)象位于房間E10N10中16,25坐標(biāo)上。

接下來(lái)我們來(lái)看看Creep

console.log(mycreep.pos)

得到輸出

{
roomName:"E10N10",
x:22
y:16
}

同理也可見這個(gè)creep所在的房間和位置,很明顯這個(gè)Creep和目標(biāo)的Sources還有一段距離。

那么現(xiàn)在我們讓這個(gè)Creep在當(dāng)前位置嘗試Harvest,下面是我們得到的結(jié)果

//某個(gè)tick內(nèi)
RoomSources = Game.rooms[roomName].find(FIND_SOURCES)[0];
console.log(mycreep.harvest(RoomSources));

//返回
"ERR_NOT_IN_RANGE"

可見此時(shí)我們的creep嘗試采集操作是提示距離不夠的。

重點(diǎn)來(lái)了,如果我們嘗試修改這個(gè)Creep的pos對(duì)象讓他就在目標(biāo)sources旁邊呢?

//某個(gè)tick內(nèi)
RoomSources = Game.rooms[roomName].find(FIND_SOURCES)[0];
mycreep.pos.x = 16;
mycreep.pos.y = 26;
console.log(mycreep.harvest(RoomSources));

//返回
"OK"

可見,即使我們的creep在當(dāng)前tick并不在16,26這個(gè)坐標(biāo)上,但通過(guò)我們強(qiáng)行修改,這個(gè)坐標(biāo)不僅生效了,還成功讓harvest方法返回了OK。

這就是狀態(tài)模擬技術(shù)。

我們可以模擬這個(gè)creep的任意屬性,再配合api,我們可以在第一個(gè)tick內(nèi)計(jì)算第二個(gè),第三個(gè)tick甚至第N個(gè)tick時(shí),這個(gè)creep的預(yù)期行為。

了解了狀態(tài)模擬概念,也許你應(yīng)該零星明白了跨tick技術(shù)的基本原理。我們可以通過(guò)原型拓展(詳見hoho大佬的文章,這里不詳訴)以及鏈表技術(shù),緩存creep未來(lái)幾個(gè)tick的操作和行為。即使某個(gè)tick不對(duì)creep進(jìn)行任何api操作,這個(gè)creep也能執(zhí)行預(yù)期的任務(wù)。并且跨tick技術(shù)同時(shí)實(shí)現(xiàn)了運(yùn)算和調(diào)用的完全分離,同時(shí)也讓cpu的運(yùn)行更加高效。

同理,狀態(tài)模擬技術(shù)可以用于任何Screeps對(duì)象,下一篇文章我會(huì)細(xì)談如何給這些對(duì)象進(jìn)行高效的原型拓展以便于跨tick技術(shù)的應(yīng)用。

不久將會(huì)更新關(guān)于跨tick技術(shù)的詳解文章,敬請(qǐng)關(guān)注。

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

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

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