紅警AI教程[多條件觸發(fā)教程]
紅警AI教程
大家好,這里是up主, 半暮南城,今天我來(lái)教大家怎么制作一款整體比較好的紅警AI。
大家都覺(jué)得原版的AI太過(guò)于智障了,因?yàn)樵娴腁I進(jìn)攻方式比較單一,而且也沒(méi)有整體局面的一個(gè)把控程度,最簡(jiǎn)單的就是對(duì)面放空一大堆還在出基洛夫,又或者對(duì)面巨炮陣還在出陸軍進(jìn)攻,最最最智障的地方就是明明知道對(duì)方是尤里還在出坦克白給送錢(qián),關(guān)鍵還是一波又一波。
?????? 那么原版的AI就簡(jiǎn)單的說(shuō)到這里,首先我們要制作一款全新的AI就要從幾個(gè)方面考慮:
1.????? 靈活性
2.????? 適應(yīng)性
3.????? 合理性
首先把這幾樣?xùn)|西弄清楚,后面編寫(xiě)AI的時(shí)候才好下手,我們先來(lái)一一的解說(shuō)一下這些方面有什么用。
?????? 首先是第一點(diǎn),什么是靈活性? 兵種的搭配,偷家的操作,場(chǎng)面的把控都是靈活性的體現(xiàn),AI的靈活程度能決定AI編寫(xiě)的質(zhì)量。
?????? 第二點(diǎn)是適應(yīng)性,適應(yīng)性顧名思義,就是這AI能適應(yīng)在哪些場(chǎng)合,一般優(yōu)質(zhì)的AI補(bǔ)丁作品至少要能在大中型地圖中能使用即穩(wěn)定發(fā)揮,不會(huì)卡兵什么的。
?????? 第三點(diǎn)合理性,合理性是指AI觸發(fā)的作戰(zhàn)小隊(duì)人數(shù)要合理,一般一支作戰(zhàn)小隊(duì)的單位數(shù)控制在12比較合理,步兵的話控制在30左右比較合理,這樣的的話可以防止AI在一些稍微小一點(diǎn)的地圖中出現(xiàn)卡兵的問(wèn)題,另外還有不會(huì)給玩家瘋狂爆兵的感覺(jué),剛好輸出的傷害也不低。
?
?????? 好說(shuō)完了這些,接下來(lái)就可以開(kāi)始簡(jiǎn)單的介紹如何編寫(xiě)AI程序,在這之前呢,我希望看的觀眾能先去了解一下編寫(xiě)AI的基本教程,在這里我推薦大家去看一下” MammamiaMadman”的AI教程下篇,了解一下AI最基本的四模塊: 派遣部隊(duì), 腳本, 作戰(zhàn)小隊(duì), 觸發(fā),在這里我就默認(rèn)大家都會(huì)編寫(xiě)AI。
文章網(wǎng)址: https://www.bilibili.com/read/cv2592061?spm_id_from=333.999.0.0
?????? 首先是讓AI如何變得”靈活”,想讓AI變得像人那么靈活是不可能的,但我們可以讓它相對(duì)的提升靈活度。
?
提升AI靈活度的設(shè)計(jì)思路:
1.????? 設(shè)計(jì)flag變量來(lái)達(dá)到多條件觸發(fā)的邏輯
2.????? 拓展更多偷家套路
?
好,我們開(kāi)始介紹如何來(lái)制作一個(gè)多條件觸發(fā)系統(tǒng),在這之前,大家要知道三個(gè)指令, 5號(hào)指令和31號(hào)指令以及58號(hào)指令,首先5號(hào)指令是原地等待指令。31號(hào)指令是自爆指令,只能用在flag更新上。58號(hào)指令是移動(dòng)指令,移動(dòng)到己方某個(gè)建筑上(需要用到紅警內(nèi)部建筑編號(hào))
尤里的復(fù)仇全建筑編號(hào)表格文件鏈接: https://pan.baidu.com/s/113192ucrD70HFxGtOKFDlw?pwd=QWQI?
提取碼:QWQI?
?????? 為了能夠設(shè)計(jì)出“靈活的AI”多條件觸發(fā)是必不可少的,我們需要認(rèn)識(shí)一下二進(jìn)制。
?????? 二進(jìn)制: 一種只有0和1的進(jìn)制 1011B == 11,【二進(jìn)制1011對(duì)應(yīng)著十進(jìn)制中的11,其中B為二進(jìn)制的后綴】如果對(duì)二進(jìn)制感興趣的話就自己去學(xué)學(xué),在這里我們只需要掌握1,2,4,8就夠用了。
現(xiàn)在我們來(lái)假設(shè)一下條件:
?????? 對(duì)手有盟軍基地 == 1
?????? 我方有高科技 == 2
?????? 對(duì)手有巨炮 == 4
?????? 其他條件 == 8 【因?yàn)閒lag標(biāo)志兵太多了,一般不啟用】
當(dāng)flag標(biāo)志兵 == 1時(shí)表示著對(duì)手為盟軍并且沒(méi)巨炮我方無(wú)高科
當(dāng)flag 標(biāo)志兵 == 3 時(shí) 表示對(duì)手為盟軍并且沒(méi)巨炮我方有高科
當(dāng)flag標(biāo)志兵 == 7 時(shí) 表示對(duì)手為盟軍并且有巨炮我方有高科
當(dāng)flag標(biāo)志兵 == 5 時(shí) 表示對(duì)手為盟軍并且有巨炮我方無(wú)高科 【危!】
?
使用二進(jìn)制當(dāng)多條件觸發(fā)有一點(diǎn)是無(wú)可替代的也是最容易出錯(cuò)的地方,就無(wú)論在什么情況下都記錄都不會(huì)出錯(cuò),但如果是多兵營(yíng)的話記錄分分鐘就出錯(cuò),因?yàn)橹荒苊看?1不能加多了,所以要注意AI多建造廠或多兵營(yíng)的情況,這個(gè)時(shí)候這一套就很容易出錯(cuò)了,但利大于弊,值得用這套。
?
在這里我解釋一下上面的標(biāo)志兵是什么,標(biāo)志兵是一個(gè)假單位,在規(guī)則文件里存在,0元購(gòu),無(wú)聲音,最好選套皮防空兵。
下面來(lái)解說(shuō)一下:
?
;這是盟軍標(biāo)記巨炮的flag標(biāo)志兵,注冊(cè)名為AFG (Allied flag GTGCAN)
[AFG]
Image=GGI
UIName=Name:GuardianGI
Name=Guardian GI
Category=Soldier
Primary=M60
Secondary=MissileLauncher ;GEF New Guardian GI weapon
OpenTransportWeapon=1;defaults to -1 (decide normally)? What weapon should I use in a Battle Fortress
Occupier=no;yes ; I can Occupy UC buildings
Prerequisite=GTGCAN002
CrushSound=InfantrySquish
Strength=100
Pip=white
Armor=none
TechLevel=2
Sight=6
Speed=3
Owner=British,French,Germans,Americans,Alliance
AllowedToStartInMultiplayer=no
Cost=0
Soylent=150
Points=10
IsSelectableCombatant=yes
Locomotor={4A582744-9839-11d1-B709-00A024DDAFD1}
PhysicalSize=1
MovementZone=Infantry
ThreatPosed=10 ; This value MUST be 0 for all building addons
ImmuneToVeins=yes
ImmuneToPsionics=no
Bombable=yes
Deployer=yes
DeployFire=yes
; DeployTime=.022? ; PCG; Unused for now.? Was maybe going to make its way in if we did
; a more explicit state machine for deploying b/c of autodeploy.
VeteranAbilities=STRONGER,FIREPOWER,ROF,SIGHT,FASTER
EliteAbilities=SELF_HEAL,STRONGER,FIREPOWER,ROF
Size=1
Crushable=yes
DeployedCrushable=no
DeploySound=GuardianGIDeploy
UndeploySound=GIUndeploy
ElitePrimary=M60E
EliteSecondary=MissileLauncherE ;GEF New Guardian GI weapon
;EliteSecondary=ParaE
IFVMode=16
PixelSelectionBracketDelta=-6;gs higher number draws lower.? Pixel difference from normal for selection bracket
?
仔細(xì)觀察代碼就會(huì)發(fā)現(xiàn)并沒(méi)有聲音的代碼(因?yàn)楸晃覄h了)
?
注冊(cè)表:
; use binary, 1 friend unit 0 enemy unit
; All flag updata wen N1 != N2? time-flag
; Refresh when the flag is False you can use 0,1 command to refresh every 5,128
66=SFA? ; The flag is SvsA only enemy is A, 1: active, 2:1 NATECH!=0, 4: BFRT > 4, 8: 0 GTGCAN > 2
67=SFY? ; The flag is SvsY only enemy is Y,? 1: active, 2:1 NATECH!=0
68=SFS? ; The flag is SvsS only enemy is S,? 1: active, 2:1 NATECH!=0
69=AFA ;? ······, 2:1 GATECH != 0, 4: 0 BFRT > 4, 8: 0 GTGCAN > 2
70=AFS ;? ······, 2:1 GATECH !=0,
71=AFY ;? ······, 2:1 GATECH != 0,
72=AFAK ;? 72 ~ 74Allied SKY Arm only!
73=AFSK ;
74=AFYK ;
75=SFAG
76=FT??? ; Soviet exclusive check tank attack !
77=SFG?? ; Soviet flag GTGCAN! Hard Attack
78=AFG? ; Allied flag GTGCAN! Hard Attack
?
我們就需要?jiǎng)?chuàng)建很多這樣的假單位然后組織成隊(duì)伍集合自爆循環(huán)達(dá)到實(shí)時(shí)戰(zhàn)場(chǎng)檢測(cè)的目的,flag更新的那段時(shí)段中,AI會(huì)自動(dòng)的忽略那些不滿足的標(biāo)志兵觸發(fā)[最好是連個(gè)條件作為一組觸發(fā)這樣就不容易出錯(cuò)],隨后用一些通用部隊(duì)來(lái)彌補(bǔ)空缺,比如偷家,防守什么的。
?這是AI補(bǔ)丁已經(jīng)寫(xiě)好的部分,如果有興趣的話下載好后可以研究進(jìn)行第二次開(kāi)發(fā)。

這樣小隊(duì)的通用腳本為:
[flag-nop]
Name=標(biāo)志兵站位防卡
0=58,131145
1=58,131137
2=5,512
3=49,0
4=31,0
?
[A-k-flag]
Name=偷襲環(huán)境監(jiān)測(cè)集合
0=58,196608
1=58,9
2=5,256
3=31,0
?
[flag-tech]
Name=flag集結(jié)
0=58,6
1=58,10
2=5,512
3=31,0
?
他們最大的區(qū)別就是部隊(duì)集合的地點(diǎn)不一樣.。
?
至于怎么編寫(xiě)一個(gè)完整的觸發(fā)就去看一下我的補(bǔ)丁文件中aimd.ini文件的內(nèi)容吧,在這里我只提供思路,而且那段代碼太長(zhǎng)了不適合展示,能看到這里,相信你們也一定能看得懂。
最新版AI補(bǔ)丁鏈接:https://pan.baidu.com/s/19F0JOp6fTzfClcBApEzDgA?pwd=QWQI?
提取碼:QWQI?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
簡(jiǎn)單展示一下內(nèi)容。
?
好,有了多條件觸發(fā)思路后,剩下的就是對(duì)戰(zhàn)時(shí)的方案了,首先就是不講武德的偷家,這個(gè)只要直接判斷對(duì)手有沒(méi)有要偷的目標(biāo)就好了。再然后就是對(duì)戰(zhàn)時(shí)的細(xì)節(jié)以及AI的聯(lián)動(dòng),首先我們用檢測(cè)好的戰(zhàn)場(chǎng)條件然后讓AI自己去使用對(duì)應(yīng)作戰(zhàn)方案,如果敵人打進(jìn)來(lái)了那我們想想會(huì)發(fā)生什么,首先會(huì)因?yàn)闃?biāo)志兵會(huì)被擊殺而失效,這個(gè)時(shí)候AI會(huì)自動(dòng)偏重那些直接判斷的觸發(fā)比如防御部隊(duì),或偷家什么的,或者其他什么情況下都能用的方案。顯得AI做好了放手一搏的準(zhǔn)備了。
?????? 接下來(lái)就是AI細(xì)節(jié)處理了,建議大家直接用我的規(guī)則文件,畢竟這里我全部設(shè)置好了,無(wú)需再動(dòng)手設(shè)置,我在規(guī)則文件(Rulesms.ini)里做了一些中文注釋,大家去文件里看看。
?????? 首先是CloseEnough=8192??????
這本是接近命令,但如果被賦予了一個(gè)很大的值A(chǔ)I就會(huì)認(rèn)為自己時(shí)時(shí)刻刻都接近了,在aimd.ini中的有Suicide=yes的小隊(duì)會(huì)無(wú)視此語(yǔ)句并貼臉目標(biāo)位置 no則受到攻擊或遇到敵人時(shí)移動(dòng)指令會(huì)被中斷進(jìn)而執(zhí)行接下來(lái)的指令。
?
一般接5、9,0、47、0 號(hào)指令等或者與6號(hào)指令形成一個(gè)閉環(huán)。
?
?????? 其次是Aggressive 與 Suicide這兩個(gè)屬性, 決定了部隊(duì)能否進(jìn)行走A(非鎖定式)
在CloseEnough=8192下效果會(huì)非常顯著,最顯著的就是AI輻射遇到敵人會(huì)蹲下來(lái),當(dāng)然是要寫(xiě)到腳本進(jìn)行循環(huán)的。
?
[S-deso-nahand]
Name=輻射蹲蘇軍兵營(yíng)
0=58,9
1=14,0
2=43,0
3=53,0
4=47,131083
5=8,2
6=9,0
7=5,32
8=47,131083
9=9,0
10=5,32
11=6,9
?
這個(gè)是非絕對(duì)性蹲下腳本
?
[S-deso-nahand]
Name=輻射蹲蘇軍兵營(yíng)
0=58,9
1=14,0
2=43,0
3=53,0
4=47,131083
5=8,2
6=9,0
7=5,32
8=47,131083
9=9,0
10=5,32
11=6,9
?
這個(gè)是絕對(duì)性蹲下腳本
?
他們的區(qū)別就是一個(gè)5,2命令(集合并原地等待2幀)可以理解為集體集合延時(shí)。這樣的話可以絲毫執(zhí)行下一條指令,如果沒(méi)有的話,輻射不一定會(huì)蹲下來(lái),那個(gè)時(shí)候就是計(jì)算對(duì)手的威脅值了,大的話就會(huì)蹲,小的話就會(huì)原地罰站32幀。配合履帶車,就可以實(shí)現(xiàn)履帶車遇到敵人就立馬下輻射原地蹲了,其中一定要有延遲不然剛蹲下就起來(lái)了。
?
本教程到此結(jié)束,感謝大家的觀看,如果遇到什么不明白的不要問(wèn)我,我是不會(huì)回答的,因?yàn)楸続I的更新到此結(jié)束,在這里我只是把我的AI設(shè)計(jì)思路分享一下,更多的還是與其他的教程結(jié)合吧。
最后的最后補(bǔ)一下我與測(cè)試員之間的問(wèn)答(精簡(jiǎn)過(guò),不是自夸!):
最主觀的感受: 被盟軍飛機(jī)卡科技,發(fā)育不起來(lái),慢慢的守不住了。其他的不足為懼。如果玩蘇軍或尤里還有戲。
靈活度: 比大多AI補(bǔ)丁好多了,確實(shí)是這樣。
電腦進(jìn)攻的猛烈程度: 能接受 1v2輕松, 1v3困難,剛剛好。
電腦整體作戰(zhàn)方案觸發(fā)合不合理: 合理,沒(méi)啥不明顯不對(duì)的地方,挺流暢的。
電腦在劣勢(shì)的情況下白給的多不多: 電腦畢竟是電腦,期望不能和人一樣,不太多。還行。
電腦有沒(méi)有反復(fù)用同一個(gè)戰(zhàn)術(shù)白給: 基本不會(huì)有。
電腦盟軍給不給力: 可以,和對(duì)面一樣的猛烈。
電腦基地內(nèi)堵塞的情況嚴(yán)不嚴(yán)重: 中、大地圖不嚴(yán)重,小地圖沒(méi)辦法。
注: 電腦是作戰(zhàn)型AI,其他型AI不計(jì)在內(nèi)。