代碼下載地址: http://download.csdn.net/source/1047937
SLG或者說戰棋游戲,在大多數英文站點是歸類到Simulation Game的(包括模擬城市之類的純SIM),并沒有進行SRPG(Strategies Role Play Games)、RTS(Real-Time Strategy Game)乃至RSLG(Role play Simulation Game)種種的細分。歸結原因,想必還是因為近似因素太多,在大多數時候已經難以區分其本來面貌,只能一概而論,所以本文也可以理解為SRPG或 RSLG開發的入門示例。
前言:
這是一篇孤立的博文,精簡了示例代碼效果及行數,僅保留最基礎功能,與以前寫過的[Java版SLG游戲開發入門]沒有直接聯系,但可以互相參看。
關于AI:
AI(Artificial Intelligence),即人工智能,有時也稱作機器智能或人工腦,是指那些由人類制造出來的系統,在面對具體事務時,所表現出的類人反應。通常情況下人工智能多指以人類思維模式為準繩,通過計算機模擬實現的智能。
人工智能的定義可以分為兩部分,即“人工”和“智能”。“人工”比較好理解,爭議性也不大。有時我們會要考慮什么是人力所能及制造的,或著人自身的智能程度有沒有高到可以創造人工智能的地步,等等。但總的來說,“人工系統”就是通常意義下的人工系統。
舉凡涉及到什么是“智能”的話題,就問題多多……人唯一了解的智能是人本身的智能,這是普遍認同的觀點。但我們對自身智能的理解也都非常有限,對構成人的智能的必要元素也知之甚少,所以很難真正定義什么是“人工”制造的“智能”。
據此,我同樣很怕寫涉及到AI題材的博文,首先AI處理本就是個有待研究的領域,因為甚至連[智能]究竟是什么都是個很難解釋的問題,這其中還涉及到其它諸如意識(consciousness)、自我(self)、心靈(mind)(包括無意識的精神(unconscious_mind)等等,存在相當大程度的爭議。
而評判AI的標準也不盡相同,拋開還很遙遠的人工生命(“強人工智能”或“弱人工智能”),似乎要成為標準的“機器人三定律”,圖靈測試等等不說,單從游戲AI引擎的設計角度講,這已經是個很嚴肅的話題,并非一兩行代碼就能構建完成的,負責任的說,如果要嚴謹的寫出一個中等規模戰棋游戲的AI處理代碼,并配合圖文解釋且標注上參考文獻,加上關鍵字摘要等等,差不多就是篇碩士論文|||,總之水很深。考慮到篇幅及鄙人水平因素,故此文中并沒有深入探究,僅僅給出一個“入門示例”,供看客參考而已。
正文:
事實上我們之所以喜歡游戲,很大程度上是基于“與天斗,與地斗,與人斗,其樂無窮”的理由,相信極少有玩家會喜歡戰場上的敵人永遠一動不動任你蹂躪,更不會有人喜歡僅僅出現You win again字樣的游戲。應該說,游戲中的AI很大程度上講是體現在電腦與玩家的對抗中,一款好的游戲AI應該能足夠刺激玩家,“蹂躪”玩家,吸引玩家參與對抗。
不妨這樣講,制作游戲的目的相較于體現玩家的“聰明”,倒不如說是更希望看見他們的“愚蠢”,看見他們被游戲玩弄得驚慌失措,叫苦連天,還樂此不疲的“憨佬”形象,這才是我們作為游戲開發者的最大快樂(^^)~
根據具體事件的不同,游戲AI可具體體現在以下兩個方面:
一、單元活動AI(Unit Behavioral AI)
游戲AI并不總是標準含義上的AI。而單元(也可理解為角色或者基本對象,以下同)游戲AI正是為設計出具有提供某種挑戰或某種真實體現的生命特征的一次真正的嘗試。
譬如在玩家與游戲的互動中,只站在一處、從不移動的警衛會顯得非常不真實。不過,如果你創建一個例行程序(routine),使他不時的朝四周張望,或變換他的姿勢,他會看起來更具活力。通過創建一個在預設的路徑上行走的警衛偶然停在站崗的警衛前,并好像與他談話這樣的情景,真實的體現能被極大地提高。單元活動AI,正是出于這種目的制作的“擬人性”而非“擬人”AI。
在單元AI中,動作模式可分為被動式(Passive)與自發式(Spontaneous)兩大類。
1、被動式
:現實生活中,如果有人打了你的左臉,要不然就伸出右臉讓他再打,要不然就伸出右手還他一巴掌,總之,你會有相應的“反應”。而被動式AI,正是這種情況的體現。
在被動模式下,單元(角色)隨時會對自身環境中的變化做出響應。如果一個敵人發現了你,開始向你跑來,并朝你射擊,那么他們已經做出了看到你的反應。
2、自發式
:在自發模式下,單元做出行動時并不依賴于自身環境中的任何變化。一個單元決定從其所站立的崗哨移向基地周圍的某個游動崗哨,則這個單元已經做出了一次自發性的行動。
通過在你的游戲中加入不同的單元活動元素,就能夠制造出單元的“聰明”假象,令玩家產生對手如同真人的錯覺。
二、單元行動AI(Unit Actions AI)
好比人類的智商是體現在行為及對世情的準確判斷上,真正讓一個游戲單元看起來聰明或者愚蠢的,同樣是他們的行動。
簡單的說,如果游戲單元依照玩家認為可行的方式移動,或者在玩家認知范圍合理的情景下做如閃避這樣的動作,那么單元看起來會很聰明,相反則會給人愚蠢的印象。但是,實際開發中這種現象都并非真實存在,而是看起來聰明或愚蠢的假象,因為程序僅僅與玩家面對的基本情景相關聯,而并非游戲中角色真的聰明抑或愚蠢。
如果你處理恰當,且這一應用包含的范圍廣泛,你的玩家就會相信你的單元足夠“聰明”。為了實現這一目的,你需要把自己放在你所構建單元的位置上思考,如果把你丟到游戲中,在他們的情景下你會怎么做?你將怎樣回應各種各樣的攻擊或遭遇敵人?如果什么事都根本沒發生,你又將會做些什么?
如果你回答了這些問題,并針對你的單元將遇到的每種情景正確的實施了它們,你擁有“看似聰明”單元的機會就會最大化,這也是創建一個優秀的、穩健的游戲AI的第一步。
談過了單元行為,我們再來說說單元運行中的事件分類。
根據處理事件采取的不同技術,游戲AI又可分為確定性(deterministic)AI與非確定性(Non-deterministic)AI兩大類別:
1、確定性AI:
確定性AI的單元(角色)行為或者說表現是特定的,可預測,沒有任何不確定因素。其具體實現如同我在博文[Java偽尋徑追蹤實現]中展示的單元追逐演算,一個非玩家單元緊隨玩家單元X,Y坐標前進,直至與玩家單元或目標點重疊為止。
2、非確定性AI:
與確定性AI相反,非確定性AI在行為模式上存在著很大程度上的不可預測性,理論上講甚至能夠令單元(角色)做出很多超出程序員構想的突現行為。簡單實現可見隨本博文發布的程序示例(單元隨機動作),但其復雜實現則需要應用到神經網路、貝斯葉概率模式、乃至基因演算法等相關知識支撐。故此鄙人對嚴謹意義上的非確定性AI也不敢置喙太多,深入研究有待看客自行探索。
3、[隱藏類別] AI處理結果欺詐(流氓手段、、賴招,隨便叫(-_-|||)):
這種方式事實上是程序員心智肚明,卻又諱莫如深的一種編程技巧,我讀書時老師戲稱其為“流氓手段”。還記得在當時課堂上,老師曾舉過這樣一個例子,讓我們寫出一段能夠得到1-100相累加結果的最簡代碼,同學們發言很踴躍,但是卻沒人有正確答案。而當我們質疑老師的評判標準時,老師卻給出了絕對最簡的答案——直接顯示5050。
應該說,在處理絕對可知結果時,這種方式確實非常有效,對于頻繁運算來講更能體現其價值所在;而對于游戲中某些運算復雜,但結果卻單一的事件,確實可以采用“流氓手段”進行編程,即可提高效率,又減少了代碼量,但卻決不能輕易被用戶知道,尤其是在網游的轉、精煉等結果中……
總結:
就我目前所知的游戲AI實現中,確定性AI可謂絕對主流,因為它的結果固定有窮,所以相對于非確定AI占用程序資源更小,效率更高,實現也更簡單。但有利必有弊,對一個聰明的玩家而言,找出一個確定性AI的規律是再簡單不過的事情,有限的行動模式,也必然決定游戲可玩性同樣有限。
而非確定性AI,則毫無疑問是塊雷區,無論對我這種業余玩票性質抑或專業游戲開發者盡都如此,它已經無限延伸入“人工生命”這塊“神之領域”,并非短時間就能夠學習甚至使用的技術。但如果能在程序中成功利用,則無疑會極大增強游戲可玩性。
至于我提到的“流氓手段”,則只能意會,不可言傳,大家心照不宣。
總體來講,游戲AI無論是確定性或非確定性,單元(角色)都難免如同巴浦洛夫狗流哈喇子中的dog那樣,僅僅會對特定事件做出“條件反射”,依據制作者設定好的行為模式而并非角色的自主思維運作,行為可能性是“有窮”的,并沒有如人類般擁有“無限可能性”,故此可以看作一種“偽智能”,而非嚴格意義上的“人工智能”。當然,我相信隨著技術的發展,這種“偽智能”技術最終將進化為真正意義上的“人工智能”。
對于具體處理流程,則可作如下分類:
1、有限狀態機(Finite State Machin,FSM):
最廉價、同時也是最實用的技術。在游戲實現(非游戲實現有出入)中的基本運作方式是采用窮舉方式,羅列出單元所有可能的動作或狀態,再利用switch、if等方式判定各種事件關系及滿足條件,據此變更單元的動作或狀態,由于我們所能做的僅是編輯從一狀態到另一狀態的轉換,完成這系列一行為的算法,就可歸屬于分層有限狀態機。
2、模糊狀態機(Fuzzy State Machine,FuSM):
當利用隨機數等方式觸發模糊邏輯(fuzzy logic)時,會令單元的動作較難預計,產生大量新的分支判斷,這時處理多個有限狀態機情況的技術實現,就是模糊狀態機,它以看“不精準”的響應來進行不確定性結果的處理。
3、分層有限狀態機(Hierarchical Finite State Machines,HFSM)及擴展分層有限狀態機(Extended Hierarchical Finite State Machines,EHFSM):
這兩項技術可視同有限狀態機與模糊狀態機的融合體,他們嘗試以一種樹狀結構分別處理有限及模糊狀態,是一系列由同一個支點擴展開的行為模式樹,不同的是擴展分層有限狀態機有更為嚴密的控制流及數據流,當然代價是對于游戲系統的資源損耗也更多。
以上是AI引擎開發中常用的一些基礎概念,如果想深入了解相關細節,還需看客自行深入研究。
關于單元(角色)尋徑:
如果單元擁有AI,那么他理所應當的能夠自主行動。但是,我們都知道游戲中角色是不存在或者說很難實現真正意義上AI的,所以與AI處理同樣,尋徑同樣是我們這些程序員的一種“欺詐手段”,用以“蒙蔽”用戶,讓他們產生單元擁有自主思維的錯覺。
關于常見的幾種尋徑方式,可見參本人博文[Java中的A*(A star)尋徑實現]以及[Java偽尋徑追蹤實現],不再贅述。
簡單的說,平面圖是由x、y兩點構成的,而所謂尋徑就是在網格化的地圖上連接出點到點間的路線交集;如果我們以二維數組mapList表示地圖數據,moveList表示地圖上可移動點的話,那么復合mapList地圖數據及moveList上可移動點所構成的交集,就是尋徑后得到的單元行走路線,即尋徑結果。
相較于AI部分,尋徑可以看作AI實現中的一項分支技術,個人認為沒有太過深入探究理論的必要,唯一需要關心的,僅在于多對象尋徑時的效率或準確性取舍問題,同樣請參考相關技術文獻,否則本文隨時超出文章最大字數……
具體到游戲實現流程:
SLG離不開戰場及角色與各種事件判斷,而具體到其構建過程,大多遵循如下順序:
1、地圖(背景戰場圖)構建
2、獲得對應地圖基本單元的對象集合(2D游戲中多為二維數組)
3、獲得可移動點的對象集合
4、創建地圖上角色(針對于地圖基本單元放置)
5、激活鍵盤或者鼠標事件(處理如光標移動等)
6、根據選擇的不同在地圖單元上繪制相光事件觸發物(菜單等),以供事件觸發
7、當選擇事件時,事件處理開始,各單元(角色)根據預先設定響應事件反饋給玩家(比如移動、攻擊等事件)
8、當我方全部行動結束或者選擇結束后,敵軍開始由AI自行處理事件
9、判定是否滿足戰斗結束條件
10、如果未滿足步驟9,則循環回步驟1,同時回合數+1,游戲繼續
在這一過程中,還可以加入如兵種、物品、特殊人物加成等影響性數據,但基本流程不受影響。
具體到演示代碼:
本博文附帶的演示代碼有核心基本類如下,具體請參見代碼注釋:
Role.java(角色處理,包含敵我雙方)
Map.java(地圖處理)
GameCanvas.java(戰場繪制及各種事件處理)
示例程序截圖如下:
回合開始:
角色狀態:
移動尋徑:
菜單交互:
目標選擇:
活動單元轉移:
代碼下載地址: http://download.csdn.net/source/1047937
————華麗的分割線——— —
本來上周就說寫的東西,卻由于某個事件的刺激,導致上周某幾天中回家就跑去各個論壇跟水軍打嘴仗,拖到本周才動手壘碼……對于這種“嘴勤屁股懶”的行徑,在此強烈鄙視自己(-_-|||)……
PS:實際上示例代碼周二晚已完成,計劃中昨晚就該發博文,結果中途忍不住又點了某個論壇,又和水軍對噴半天,所以耗到今天這篇博文才得以面世,寫的不夠周全,這兩天會慢慢補齊,還望各位大人見諒^^。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
