星球基地 AI代碼解析 全角色執(zhí)行任務(wù)優(yōu)先級匯總
- 來源: 最后的幽靈騎兵
- 作者:售夢者
- 編輯:售夢者

星球基地 AI代碼解析 全角色執(zhí)行任務(wù)優(yōu)先級匯總
首先,請?jiān)试S我向大家隆重介紹下面這一段代碼,就是它葬送了無數(shù)大好局勢和無數(shù)賤民的生命!
它就是整個(gè)AI算法的核心:當(dāng)你的角色狀態(tài)處于空閑時(shí),自動(dòng)進(jìn)入相應(yīng)的任務(wù)優(yōu)先級列表的判定,簡單點(diǎn)來說就是一個(gè)觸發(fā)機(jī)制,并且一但這個(gè)機(jī)制被觸發(fā),這個(gè)角色就會進(jìn)入相應(yīng)的任務(wù)狀態(tài),不會被打斷,不!會!被!打!斷!
首先,我將要向大家介紹的是一個(gè)物種:保安
有人肯定要問,為什么說是個(gè)物種?因?yàn)橛螒蚪巧腁I類型劃分是這樣的:

搬運(yùn)機(jī)器人
建筑機(jī)器人
挖礦機(jī)器人
保安
人類(其它殖民者)
入侵者
游客
所以說,這個(gè)故事告訴我們千萬不要把保安當(dāng)做正常的人類來看。
以下便是保安這個(gè)物種的優(yōu)先級:

所有的優(yōu)先級依次是:
拿武器后消滅入侵者
生存需求
去看有優(yōu)先級的監(jiān)控
去看監(jiān)控
去喝飲料
去放松(鍛煉)
回到室內(nèi)建筑
在室內(nèi)看風(fēng)景
你木有看錯(cuò),對于所有的保安(其實(shí)包括人類),消滅入侵者比滿足生存需求的優(yōu)先級更高。滿足survivalrule這是一個(gè)子項(xiàng),里面包含的是各種屬性低了就去補(bǔ)的觸發(fā)機(jī)制,具體結(jié)構(gòu)可以參考我在樓頂介紹的那個(gè)邏輯算法。
早上看見一位小伙伴的悲慘遭遇,保安到死都在看監(jiān)控沒去反擊入侵者。所以,現(xiàn)在你明白了么?
沒錯(cuò),我去打入侵者的優(yōu)先級是比看監(jiān)控(Go Operate)要高,但問題是我已經(jīng)在看監(jiān)控了呀,你在我看完監(jiān)控之前休想讓我進(jìn)入這個(gè)空閑判定機(jī)制。
耿直的保安,卒。
接下來便是賤民們的優(yōu)先級列表,制作組總算是展現(xiàn)了點(diǎn)誠意,先不說合不合理,至少是非常用心的:

首先說明,制作組把所有職業(yè)的任務(wù)混在了一起,請自行對應(yīng)相應(yīng)職業(yè)。賤民的任務(wù)優(yōu)先級從高到低分別是:
拿武器攻擊入侵者(這里指的不是保安,保安不算人類?。?/p>
攻擊完入侵者后扔掉武器
去修被隕石砸的室內(nèi)建筑(這個(gè)我看了下代碼,沒有室外也是醉)
生存需求(吃飯 ,睡覺 ,blablabla)
去維持緊急的食物需求,造食物(生物學(xué)家專屬技能)
去搬交易需要的貨物到飛船
去建造
去休閑(注意,這里限制了是當(dāng)狀態(tài)非常不開心的時(shí)候)
去拿零件之后維修
去拿醫(yī)療包救人
去高優(yōu)先級的礦場挖礦
去制作各種東西
去拿建筑材料之后運(yùn)送建筑材料(知道為什么要多造機(jī)器人了吧,工人如果有礦挖優(yōu)先級絕不搬這些 )
去找那些制作臺所需的資源然后存放到制作臺
去找喝的
去休閑(當(dāng)狀態(tài)有點(diǎn)不開心的時(shí)候)
去挖礦(無優(yōu)先級,事實(shí)證明如果么有優(yōu)先級人類非常不想去挖礦)
去搬東西到倉庫
進(jìn)到室內(nèi)
讓路(給其它優(yōu)先級高的角色)
在室內(nèi)閑逛接下來就是星際海盜們的世界觀了:

排序從高到低:
攻擊殖民者(理所當(dāng)然)
進(jìn)入室內(nèi)
在室內(nèi)閑逛
沒了。
有人可能會說,怎么這么簡單?還有,你要去攻擊殖民者不就包含進(jìn)入室內(nèi)了么,怎么下面還有個(gè)進(jìn)入室內(nèi)?由于入侵者這個(gè)項(xiàng)比較少,我決定展開來解釋嵌套關(guān)系,來讓大家更好的理解這套AI邏輯的運(yùn)行方法 。
首先讓我們進(jìn)入第一個(gè)優(yōu)先級的函數(shù):去攻擊殖民者,讓我們?nèi)タ匆幌滤窃鯓颖欢x的:

第一個(gè)if的地方判定的是角色的身份,我就不再一一贅述statusflag12代表的內(nèi)容了。然后這個(gè)函數(shù)會去尋找離強(qiáng)盜們最近的站著的角色。
讓我們再來到findneareststanding函數(shù)被定義的地方:

這里就很明了了,該函數(shù)會枚舉所有你的殖民者們,并且如果它們當(dāng)前狀態(tài)不是死亡,或者被打倒的狀態(tài)時(shí),函數(shù)會計(jì)算一個(gè)限制距離內(nèi)所有殖民者中離你最近的一個(gè),并把結(jié)果返回上一級。
讓我們回到這里:

現(xiàn)在,我們得到了findnearsetstanding函數(shù)傳回的離你最近并且可用的殖民者了,我們的下一個(gè)目標(biāo)便是要接近她,這個(gè)目標(biāo)則由goTarget實(shí)現(xiàn)。
我們來詳細(xì)看一看gotarget:

我們真正輸入的參數(shù)其實(shí)是當(dāng)前處理的這個(gè)強(qiáng)盜和這個(gè)強(qiáng)盜將要選定目標(biāo)的被害人,而這個(gè)函數(shù)的作用就是使強(qiáng)盜走向被害人,而其中就包含了goToBestAirlock(走向選定的最佳氣閘)。至于這個(gè)函數(shù)是如何定義的就不再解釋,太過復(fù)雜,也考慮到了其它正在執(zhí)行的任務(wù)對流量造成的影響。

至此,強(qiáng)盜開始了自己入侵的過程,補(bǔ)充下前面setradius參數(shù)指的是當(dāng)強(qiáng)盜離目標(biāo)8個(gè)單位時(shí),強(qiáng)盜會開始開火。
而我們看到,如果在findneareststanding(查找最近的目標(biāo))函數(shù)階段,所有的目標(biāo)都在范圍之外,那么這個(gè)函數(shù)將會返回一個(gè)空值,下面一階段的if條件不會被 滿足,然后整個(gè)大函數(shù)會返回一個(gè)false的值,這也就代表了在任務(wù)優(yōu)先級列表中,第一個(gè)優(yōu)先級的任務(wù)(攻擊殖民者)的條件不滿足,開始按順序進(jìn)行優(yōu)先級列表中的下一個(gè)任務(wù)。
所以說了那么多,我想表達(dá)的就是,其實(shí)在攻擊殖民者這個(gè)任務(wù)里包括了許許多多邏輯AI,其中就包括進(jìn)入氣閘這一項(xiàng)。至于第二個(gè)優(yōu)先級任務(wù)安排進(jìn)入室內(nèi)的原因是,如果強(qiáng)盜周邊在規(guī)定范圍內(nèi)沒有符合要求的目標(biāo),那么強(qiáng)盜就會進(jìn)入室內(nèi)。
在此之后,強(qiáng)盜滿足了處于室內(nèi)的狀態(tài),優(yōu)先級順位中第二位的進(jìn)入室內(nèi)的條件返回也會變成false,這時(shí)候,強(qiáng)盜會執(zhí)行第三順位的任務(wù):在室內(nèi)隨機(jī)游蕩,直到在下一次判定的時(shí)候第一順位任務(wù)的條件被觸發(fā),那么強(qiáng)盜就會去攻擊那個(gè)被選中的倒霉蛋了。
點(diǎn)擊進(jìn)入3DM《星球基地》游戲論壇專區(qū)

玩家點(diǎn)評 (0人參與,0條評論)
熱門評論
全部評論