从0开始搭建一个战棋游戏的AI(初级教程)
戰(zhàn)棋類游戲一直以高策略性著稱,其中不乏經(jīng)典之作如“三國(guó)志英杰傳”、“三國(guó)曹操傳”、“炎龍騎士團(tuán)”、“金庸群俠傳”等等。
今天,我們就如何一步步從0開(kāi)始實(shí)現(xiàn)一個(gè)簡(jiǎn)單的戰(zhàn)棋類游戲AI,概述一下此類游戲AI的設(shè)計(jì)思路和算法。(什么?AI是啥?——人工智能,通俗來(lái)說(shuō)就是電腦的自動(dòng)策略。)
?
戰(zhàn)棋類游戲的關(guān)卡設(shè)計(jì)思想
經(jīng)典戰(zhàn)棋類游戲一般來(lái)說(shuō)AI都比較簡(jiǎn)單,豐富高可玩性的關(guān)卡和極限挑戰(zhàn)難度,還是要靠關(guān)卡設(shè)計(jì)來(lái)做:比如什么時(shí)候敵方出援軍、敵方某個(gè)據(jù)點(diǎn)什么時(shí)候出兵之類的驅(qū)動(dòng)整個(gè)戰(zhàn)局變化的。
這個(gè)由于是關(guān)卡設(shè)計(jì)者(一般是游戲策劃)考慮的范疇,我們今天不討論這個(gè)。光討論一個(gè)NPC,每回合在正常情況下應(yīng)該如何決策。
模型分解
我們分析幾款經(jīng)典的戰(zhàn)棋類游戲
1、曹操傳
分?jǐn)澄一睾?#xff0c;每回合自由選擇角色先后行動(dòng)順序。
每回合一個(gè)角色可以做兩件事——(移動(dòng)+行為)
其中行為又可以細(xì)分為攻擊、技能、休息、使用物品(可以給自己或身邊的人使用)
?
2、炎龍騎士團(tuán)
也分?jǐn)澄一睾?#xff0c;每回合玩家自由選擇角色先后行動(dòng)順序。
還是一樣,決策=移動(dòng)+行為
行為細(xì)分為攻擊、休息、魔法、物品(可以給自己或身邊的人使用)
和曹操傳不一樣的地方是移動(dòng)后不可以使用魔法(必須本回合停留原地才可以使用魔法)
?
3、金庸群俠傳
無(wú)敵我回合,每回合按照角色的身法決定先后行動(dòng)順序。
決策=移動(dòng)+行為
行為細(xì)分為攻擊、用毒、解毒、醫(yī)療、物品、等待、休息……
其中等待可以將行動(dòng)延后
?
……
不難發(fā)現(xiàn),大部分戰(zhàn)棋類游戲都遵循這個(gè)規(guī)則:單個(gè)回合內(nèi)角色決策 = 移動(dòng) + 行動(dòng)。
AI框架設(shè)計(jì)思路
我們本文并不想針對(duì)某個(gè)特定的游戲模式來(lái)做設(shè)計(jì),而是想教大家一個(gè)簡(jiǎn)單的買QQ號(hào)通用AI如何搭建——
因?yàn)榇蠹覙?gòu)思和想做的游戲系統(tǒng)設(shè)定各異,(比如上面幾款游戲,就分別有自己的各項(xiàng)特殊規(guī)則)
在此種情況下,我們其實(shí)可以搭建一個(gè)通用的計(jì)算模型,來(lái)“海納百川”,實(shí)現(xiàn)一個(gè)與具體游戲業(yè)務(wù)邏輯無(wú)關(guān)的AI框架。
我們不妨先把技術(shù)的東東放一邊,以一個(gè)玩家的角度來(lái)重現(xiàn),每一個(gè)回合我們?nèi)祟愂侨绾嗡伎嫉哪?#xff1f;
“我走到這里,下回合對(duì)方是不是可以走過(guò)來(lái)打到我?”
“我這一擊剛好可以把對(duì)方秒殺,這樣對(duì)方就不能反擊我了!”
“我移動(dòng)速度比對(duì)方快,我先跑回去補(bǔ)給完,然后再回來(lái)打”
“調(diào)整一下陣型!用防御力高的人在這個(gè)關(guān)卡上卡位,弓箭手在后方射。”
總之,決策基準(zhǔn)就是如何行動(dòng)對(duì)自己是最有利的。
數(shù)學(xué)模型
我們可以給每一個(gè)行為決策,算出一個(gè)“得分”來(lái),最后負(fù)分是有害、正分是有利。最終AI的結(jié)果就是選擇得分最高的行為。
初級(jí)AI的本質(zhì)是一個(gè)貪心算法
貪心算法(又稱貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解。
貪心算法不是對(duì)所有問(wèn)題都能得到整體最優(yōu)解,關(guān)鍵是貪心策略的選擇,選擇的貪心策略必須具備無(wú)后效性,即某個(gè)狀態(tài)以前的過(guò)程不會(huì)影響以后的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。
通俗來(lái)說(shuō),貪心算法就是只看眼前,不看之后的情況。
所以如果我們只看眼前一步,那么問(wèn)題就變得很簡(jiǎn)單:我如何下這一步棋獲得當(dāng)前的最高收益?
搭建框架
這樣我們只需要將所有的行為結(jié)果都有一個(gè)評(píng)估的分?jǐn)?shù),然后遍歷所有的行為可能,取得分最高的評(píng)估結(jié)果來(lái)決策即可。
1、分?jǐn)?shù)評(píng)估體系搭建
如何來(lái)做這個(gè)分?jǐn)?shù)評(píng)估體系?——不同的游戲可以有各自的設(shè)定:舉個(gè)例子,比如如果某次行動(dòng)擊中3個(gè)敵人,每個(gè)人評(píng)估扣血100,那么總共算得300分。比如某次給隊(duì)友加血,預(yù)估恢復(fù)技能能加150血,就算得150分……
所以某次行動(dòng)的得分應(yīng)該是本次行動(dòng)所有影響的結(jié)果分?jǐn)?shù)之和。(也可以根據(jù)具體需要,調(diào)整一些加權(quán)系數(shù),后文說(shuō)明)對(duì)自己有利則加分,對(duì)自己有害則減分(同理,對(duì)敵人有利減分,有害加分)
2、如何遍歷?
很簡(jiǎn)單,戰(zhàn)棋類游戲無(wú)非移動(dòng)+行動(dòng),把所有可能走的點(diǎn)全部走一遍,走到了那兒后把所有可能的行動(dòng)全部做一遍。如果有些行動(dòng)設(shè)計(jì)到施展位置,把所有的施展位置全部算一遍即可。
這里如果效率太低,可以盡情對(duì)搜索算法剪枝,此處不贅述。
3、擴(kuò)展和調(diào)優(yōu)
有了以上兩步,AI應(yīng)該就可以跑起來(lái)了。我們接下來(lái)可以根據(jù)具體咱們游戲的設(shè)定來(lái)調(diào)優(yōu),讓AI更加聰明。
拿剛才的例子,比如擊中的3個(gè)敵人里有一個(gè)可以導(dǎo)致死亡(HP=0),那么額外再加200分(得分就是500了)。比如加血的隊(duì)友血越少得分越高(優(yōu)先給瀕死的隊(duì)友加血),那么當(dāng)AI可以選擇兩個(gè)隊(duì)友加血的時(shí)候,自然就會(huì)選擇那個(gè)更加瀕死的角色。
這里的設(shè)計(jì)就跟具體每個(gè)游戲相關(guān),甚至更加復(fù)雜的話,還可以考慮地形、站位、AOE覆蓋范圍、加BUFF/DEBUFF、使用道具等各種情況。
這里還可以賦予不同的角色不同的使命,也只需要在最終的得分上體現(xiàn)即可(比如一個(gè)偏輸出的攻擊者,比一個(gè)偏防御的防御者在“減少敵方HP”的得分上有額外加權(quán))
總之基于這個(gè)分?jǐn)?shù),可以做出一切有想象力的AI來(lái),此處仁者見(jiàn)仁。
結(jié)語(yǔ)
我們基于這個(gè)思路開(kāi)發(fā)了《金庸群俠傳X》和《江湖X》以及即將發(fā)布的《江湖X:漢家江湖》,基本AI是可用的(雖然由于游戲?qū)傩杂悬c(diǎn)復(fù)雜,AI也經(jīng)常被玩家吐槽)。
很多戰(zhàn)斗變成了玩家的攔路虎
?
也會(huì)有一些由于AI給力被津津樂(lè)道的情況
最后祝大家開(kāi)發(fā)愉快,有問(wèn)題可以與我交流。
總結(jié)
以上是生活随笔為你收集整理的从0开始搭建一个战棋游戏的AI(初级教程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏的数值系统的实现和演化
- 下一篇: 游戏编程中的数学——随机数字生成(RNG