|
談到人工智能(AI),這個(gè)話題就太大了;大學(xué)里有《人工智能教程》專門講這方面的知識(shí),什么大名鼎鼎的人工神經(jīng)網(wǎng)絡(luò)、遺傳算法等等均可一窺究竟,這里如贅述似乎有些班門弄斧,我們暫且丟它一邊去吧。
本節(jié),我的主要目的是與大家共同探討AI在RPG游戲中的應(yīng)用。看過之前教程的朋友一定不會(huì)陌生,A*算法就是其中的一個(gè)重要組成部分;而本系列Demo中則使用了更為高級(jí)的改進(jìn)型A*算法,不僅優(yōu)化了性能,同時(shí)也大幅提升了玩家的操控體驗(yàn)。除此之外,AI更常見于RPG游戲中的角色,接下來我將引領(lǐng)大家循著AI的足跡,逐步探尋Silverlight網(wǎng)頁游戲中的AI系統(tǒng)設(shè)計(jì)與Demo實(shí)現(xiàn)。
以一份網(wǎng)上見到的AI系統(tǒng)設(shè)計(jì)文檔作為開始,我們不妨首先分析下它的主體思路,大可斷定其為直觀的解析當(dāng)前國內(nèi)即時(shí)類MMORPG主流角色AI設(shè)計(jì):以古老而傳統(tǒng)的有限狀態(tài)機(jī)FSM(Finite State Machine)固定決策樹AI為原型,簡單而直接。當(dāng)然,為了讓游戲體驗(yàn)更加有趣且不至于顯得一成不變,我會(huì)考慮引入基于Random的各類概率機(jī)制,即使用隨機(jī)性和靈活性更強(qiáng)一些的模糊狀態(tài)機(jī)FuSM(Fuzzy State Machine)。所有非控角色的行為完全無規(guī)律可循難道不會(huì)更吸引人嗎?
有了大體思路后,接下來我們要做的就是將復(fù)雜而龐大的AI系統(tǒng)簡化,使之更好理解并最終轉(zhuǎn)化成Silverlight游戲程序代碼。縱橫剖析,我更青睞于按照策略AI (tactic)與行為AI (action)兩部分予以劃分。所謂“策略AI”即角色何時(shí)采取何種決策,而“行為AI”則為角色按決策執(zhí)行何種行動(dòng)。
基于以上方案,我首先在角色控件的內(nèi)部添加一個(gè)計(jì)時(shí)器用于AI邏輯循環(huán),其中策略AI間隔3秒執(zhí)行一次,用于敵對(duì)角色的搜捕(索敵);行為AI與角色動(dòng)作切幀率同步,根據(jù)實(shí)時(shí)情判斷應(yīng)該執(zhí)行警戒/追擊/攻擊/轉(zhuǎn)向/逃逸/或其他等行動(dòng);而這兩種AI在角色控件中分別對(duì)應(yīng)兩個(gè)事件,對(duì)于主角來說,玩家的操作已相當(dāng)于主角的策略,因此主角只需注冊(cè)行為AI事件,而其他非控角色則需要同時(shí)兼具兩者以具備完整的AI能力:
/// <summary>
/// 動(dòng)作(幀)切換時(shí)觸發(fā)
/// </summary>
public event EventHandler ActionTrigger;
/// <summary>
/// 以1秒為基礎(chǔ)單位的時(shí)間間隔觸發(fā)器
/// </summary>
public event EventHandler<IntervalTriggerArgs> IntervalTrigger;
/// <summary>
/// 間隔觸發(fā)器參數(shù)
/// </summary>
public class IntervalTriggerArgs : EventArgs {
public int Count { get; set; }
}
int tickCount = 0;
IntervalTriggerArgs intervalTriggerArgs = new IntervalTriggerArgs();
void intervalTrigger_Tick(object sender, EventArgs e) {
intervalTriggerArgs.Count = tickCount;
if (IntervalTrigger != null) { IntervalTrigger(this, intervalTriggerArgs); }
tickCount = tickCount == Int32.MaxValue ? 0 : tickCount + 1;
}
NET技術(shù):Silverlight 2.5D RPG游戲技巧與特效處理:(十一)AI系統(tǒng),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。