基礎(chǔ) | 簡(jiǎn)單的智能體----有限狀態(tài)機(jī)(二)

本系列為筆者初學(xué)c/c++和游戲AI開(kāi)發(fā)的學(xué)習(xí)經(jīng)歷,練習(xí)為主,不涉及到具體的游戲開(kāi)發(fā)軟件學(xué)習(xí)(如unity,虛幻4等),適合剛?cè)腴T的小伙伴一起學(xué)習(xí)探討,歡迎在評(píng)論區(qū)留下意見(jiàn)。
?開(kāi)發(fā)語(yǔ)言:c/c++ (11及以上)?
開(kāi)發(fā)平臺(tái):macOS mojave / Linux?
編譯器:vs Code / g++

從一個(gè)項(xiàng)目開(kāi)始
一、虛擬的世界
1.1 Bob的一天
假設(shè)存在一個(gè)虛擬小鎮(zhèn),鎮(zhèn)上生活著一個(gè)人Bob,鎮(zhèn)里有一個(gè)礦場(chǎng)(產(chǎn)出金礦),一家銀行(存儲(chǔ)金礦),一間酒吧(喝酒休息),一間屋子(Bob睡覺(jué)的家)。Bob每天要做的事情就是到礦場(chǎng)里挖金礦,口袋里裝滿金礦后將金子存儲(chǔ)到銀行里;從銀行出來(lái)如果錢夠了Bob便會(huì)回到家里睡覺(jué),若不夠則繼續(xù)到礦場(chǎng)里挖礦;期間只要他渴了就會(huì)停下手上的事到酒吧里喝酒,喝完酒之后則繼續(xù)到礦場(chǎng)里挖礦;Bob睡完覺(jué)后,如果渴了則去酒吧喝酒,否則進(jìn)礦場(chǎng)挖礦。
----《游戲人工智能編程案例精粹》
? 書(shū)中的例子,可憐的Bob一天的生活乏味可陳,但他每一次動(dòng)作都有著極為明顯的變化。Bob不管在哪一種狀態(tài)中,只要發(fā)生了某種動(dòng)作,一定會(huì)改變當(dāng)前狀態(tài),變成另一種狀態(tài)。
? 當(dāng)然,Bob可能還會(huì)存在其他更多的狀態(tài)和動(dòng)作,以及這個(gè)鎮(zhèn)子還會(huì)有其他人。但不論怎么增加復(fù)雜度,其根本構(gòu)成都不會(huì)變。
? 我們將以Bob的一天為基礎(chǔ),在計(jì)算機(jī)中構(gòu)建出一個(gè)虛擬的小世界,來(lái)模擬Bob的生活。
1.2 狀態(tài)轉(zhuǎn)換圖和狀態(tài)轉(zhuǎn)換表
? 首先,我們用狀態(tài)轉(zhuǎn)換圖和狀態(tài)轉(zhuǎn)換表來(lái)建?!癇ob的一天”,這樣可以更清晰的表示出其中的邏輯流動(dòng),有助于梳理邏輯結(jié)構(gòu),也可以很容易的發(fā)現(xiàn)邏輯流上的錯(cuò)誤,并改正過(guò)來(lái)。

? 從圖1里我們可以知道,Bob存在四種狀態(tài),以及幾種改變狀態(tài)的動(dòng)作(條件):

??有了清晰的邏輯流,我們就可以借助c/c++編程語(yǔ)言,在計(jì)算機(jī)中模擬出“Bob的一天”。
1.2 一個(gè)完整的例子

? 當(dāng)然,具體的實(shí)現(xiàn)中,我們有許多其他的工作需要做,比如說(shuō)采用什么樣的設(shè)計(jì)模式,一個(gè)狀態(tài)要持續(xù)多久,轉(zhuǎn)換狀態(tài)的條件要如何達(dá)成,等等。
? 這些我們將留到之后的章節(jié)詳細(xì)的講解。

參考:?
《游戲人工智能編程案例精粹》
?維基百科
相關(guān)代碼下載:https://github.com/linpeijie/GameToy/tree/master/GameAI/FSM