一種遊戲機械人的GO語言實現

2022-09-19 09:27:10 字數 3890 閱讀 3626

機械人是進行壓力測試的一把好手,在測試伺服器壓力極限,優化伺服器**,測試**覆蓋率等方面有著不可或缺的作用。

go語言有著優良便捷的併發特性,只需簡單的烹飪即可搭建起乙個機械人。再加上ai樹的加持,機械人如虎添翼,可快速完成各種業務邏輯,如建立登入流程,打怪流程等流程,只需拖拽子樹即可復用,實為居家必備之良品。

每個機械人的建立使用了go語言中的goroutine併發機制.[原理見:【深度知識】go語言的goroutine併發原理和排程機制 - go語言中文網 - golang中文社群].

每個機械人建立後執行行為樹邏輯.機械人的行為全部由行為樹控制.這裡使用使用第三方的go開源庫[magicsea/beh**ior3go]來驅動行為樹邏輯.

行為樹編輯器使用官方編輯器[beh**ior3/beh**ior3editor].

圖1.編輯器介面

編輯器左邊初始有四個資料夾,分別是"trees(樹)","composites(組合)","decorators(裝飾器)","actions(行動)".右側是實現的角色登入及遊戲新手任務流程.

機械人執行行為邏輯以樹為單位,不斷的從根節點從上到下迴圈執行節點邏輯.每個樹可以作為子樹供其他樹呼叫,此舉可以封裝一些常用邏輯,比如登入邏輯,打怪邏輯.

常用的組合節點有四種,sequence,piority,memsequence,mempriority.看完這四個節點的實現原理後,你也可以實現自己的組合節點.

從圖形節點的特徵上看組合節點是1:n,即左側"入"節點為1個節點,右側"出"節點為n個節點,n>=0.

2.1.2.1 sequence

sequence 相當於邏輯與,行為樹會從上到下依次執行sequence的子節點,如果全部成功,則sequence返回成功.如果某個子節點返回失敗,則sequence立即返回失敗,不再執行後續節點.

/**

* tick method.

* @method tick

* @param tick a tick instance.

* @return a state constant.

**/func (this *sequence) ontick(tick *tick) b3.status

}return b3.success

}

2.1.2.2 priority

priority 相當於邏輯或,行為樹會從上到下依次執行priority的子節點,如果某個子節點返回成功,則priority返回成功,不再執行後續子節點。如果子節點全部都返回失敗,則priority返回失敗.

**實現:

/**

* tick method.

* @method tick

* @param tick a tick instance.

* @return a state constant.

**/func (this *priority) ontick(tick *tick) b3.status

}return b3.failure

}

2.1.2.3 memsequence

memsequence 與 sequence 邏輯類似, 不同的是memsequence都從上次返回 running狀態的節點開始執行.

**實現:

/**

* tick method.

* @method tick

* @param tick a tick instance.

* @return a state constant.

**/func (this *memsequence) ontick(tick *tick) b3.status

return status}}

return b3.success

}

2.1.2.4 mempriority

mempriority 與 priority 邏輯類似, 不同的 是mempriority 都從上次返回 running狀態的節點開始執行.

**實現:

/**

* tick method.

* @method tick

* @param tick a tick instance.

* @return a state constant.

**/func (this *mempriority) ontick(tick *tick) b3.status

return status}}

return b3.failure

}

2.1.2.5 自定義組合

除了上述原裝組合節點外,還可以根據自身需求定製組合節點.比如需要隨機執行乙個子節點,**如下:

// 自定義 隨機選擇乙個子節點執行

type randomchooseone struct

func (this *randomchooseone) initialize(setting *btnodecfg)

func (this *randomchooseone) ontick(tick *tick) b3.status

比如需要根據節點上設定的概率執行乙個子節點.

圖2. 根據概率執行節點

**如下:

// 自定義 根據配置概率決定乙個子節點是否執行

type randomexe struct

func (this *randomexe) initialize(setting *btnodecfg)

}func (this *randomexe) ontick(tick *tick) b3.status }}

return b3.success

}

在編輯器上建立上述兩個組合型別的節點,並在機械人上註冊上述兩個組合節點的實現,即可使用.

maps := b3.newregisterstructmaps()

maps.register("randomchooseone", new(randomchooseone))

maps.register("randomexe",new(randomexe))

裝飾器節點是對自己點進行修飾,比如自帶的repeat節點是重複x次子節點,比如inverter是反轉子節點的返回值.

從圖形節點的特徵上看裝飾器節點是1:1,即左側"入"節點為1個節點,右側"出"節點為1個節點.[右側"出"節點雖然為乙個節點,但可以用上述組合節點進行拓展]

節點的實現原理比較簡單,這裡就不繼續展示**了.

動作節點是使用者主要實現的節點。一般情況下,為了節點的復用性,乙個actions節點對應一條協議.當行為樹執行到乙個actions節點時,觸發機械人對伺服器動作,然後下乙個節點等待伺服器回包.一般傳送協議和等待回包協議成對出現.移動包等少數例外.

從圖形節點的特徵上看動作節點是1:0,即為行為樹的頁節點.

條件節點是行為樹中較為常用的需求,編輯器中可以建立條件節點,但是目前採用的這個第三方庫沒有實現條件節點.暫時用的裝飾器節點代替的.[有空了我把這個第三方庫完善一下.]

根據這一套方法實現的機械人(github位址),用來壓測自己寫的網路庫.

另外,還將這款機械人用在公司業務中,用來測試網路庫效能,對登入進行壓測,對伺服器戰鬥效能進行壓測,已經成功運用於兩個專案的壓測與優化.

Go語言實現 劍指offer 機械人的運動範圍

該題目 於牛客網 劍指offer 專題。地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 ...

Go語言實現 劍指offer 機械人的運動範圍

該題目 於牛客網 劍指offer 專題。地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 ...

用Go語言實現乙個簡單的聊天機械人

目的 使用go語言寫乙個簡單的聊天機械人,複習整合go語言的語法和基礎知識。軟體環境 go1.9,goland 2018.1.5。go語言基本構成要素 識別符號 關鍵字 字面量 分隔符 操作符。它們可以組成各種表示式和語句,而後者都無需以分號結尾。陣列 由若干相同型別的元素組成的序列。切片 slic...