鬥地主機器人智能算法深度研究

        我從事棋牌開發工作已經6年了,我一直喜歡玩鬥地主,騰訊上面的我經常玩,別人的也經常玩,對於鬥地主機器人智能效果,一直都未發現那個平臺做得比較令我滿意,所謂的好,我覺得機器人常見牌要打得有點水準,拆牌,頂牌必須要有,還要比較接近人的出牌邏輯,這樣玩家的體驗感會好很多,我內心其實一直都有一個好的想法去實現更加智能鬥地主機器人,趁着最近工作也比較空閒,爲此對鬥地主機器人算法進行深度研究,算是略有成效,效果當然遠比現在公司的鬥地主機器人要好。

    第一步:

          如何判斷一手牌的好壞,那就必須要對牌型進行計算分數這樣你才能計算出來,這是一個基礎定義。牌型的總數有如下這麼多種

如果每種的牌型得分如下:const int CARD_TYPE_SCORE[CT_TYPE_COUNT] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 100, 110, 140, 150 };

牌型裏面牌有大小之分,這樣其實還可以針對牌值進行加分,這樣牌的分數就比較細膩,牌值的分數就是加上他的牌的邏輯值就可以了

,還有一點要注意,牌的手數少的話,也應該適當加分,何爲手數?就是以最快的出牌方法,手上的牌可以多少次出完,一般情況下手牌數少,牌應該要適當加分,加分策略如下:

第二步:

       鬥地主有叫分過程,這個也是有講究,我的定義是這樣

可分數低於370分時,不會進行第二次叫分,這個也是保守叫分法,如下

第三步:

      出牌總共分爲6個大的策略分支:

比較重要的出牌策略,是地主壓牌和地主上家出牌,和地主上家壓牌策略,

先說地主壓牌策略:

上面是所有出牌的基本策略就是只剩下火箭帶一手牌,或者炸彈帶一手牌,或者是最後一手牌,那是必須要出的,這是6種出牌策略裏面都要有的,下面是細分

地主下家出牌時,如果最快的速度出牌策略(CommonTypeTrunCard裏面是不包含火箭壓牌,火箭壓牌必須是特別處理的)裏面沒有牌能壓下家牌時,可下家手牌只有一張了,那麼這時必須啓動搜索牌面最大炸彈(手上的炸彈是否是最大炸彈),或者是火箭去攔截,

當上面的小策略失效時,那麼必須啓動拆牌策略(一般只有在單牌,雙牌時纔會拆牌):

上面的策略都失效了,那麼後面還有一條非常體現智能效果的策略,就是前面的策略都失效了,那麼要嘗試一下最後一條策略

那就是其他兩家有人只剩下兩個牌時,一般這時地主要考慮拆牌了,

vecMinTypeCardResult這個結果裏面包含的是最快出牌的牌型數據,CardTypeResult這個結果裏面包含的是所有可組成的牌型數據,前者是提供常用策略來使用的,後者是借硬性策略使用的。常見策略失效了,那麼就不能那麼死板按照最快出牌策略那樣按兵不動了。這個舉個例子你就明白了,地主手上有2,AAA,99,88,66,5,有人出了一對KK,他手上剩下10張牌,這時按照最快出牌策略的話,是不應該拆AAA去打的,因爲出牌者手上還有可能有其他牌型,可以守株待兔,可要是出牌者手上牌只剩下2張以後了,那麼AAA就必須拆了。

地主上家出牌相當重要,優先出不是單牌的牌。(當然有人會說出自己能收得回來的牌不更加好嗎?這個就是更加高一級的策略了,更加精細的做法了,這個可以留到以後來優化)

地主上家壓牌,就要看是壓隊友的牌還是地主的牌,地主的牌一般是能壓都會壓,隊友牌一般情況下小於K跟牌就行了,大於k不要跟了

當然大策略就是基本上是上面這些了,小策略就不再去詳細說了,,詳細說1萬字都說不完。

這些是根據我自己的打牌經驗的策略來寫的,當然鬥地主高手還會有更加好的策略可以加進去,這樣效果會更加好。

上面這個FindCardKindMinNum搜索算法也相當關鍵,纔是核心,如果要從20張牌裏面所有的組合算出來,然後進行牌型分比較,進行篩選出牌最快,牌型的最好的牌,那麼最複雜的情況有5000萬種組合,現在普通的計算機是頂不住的,就算是1000萬種組合的我在

這個處理器下跑出來也要40多秒,所以我對很多牌型進行了剪枝,這樣一般最差的情況是30秒就算出來了,效果算是打了個折扣吧,但也不至於出牌效果很差,這個真正要運營的話,得用阿里雲計算型的服務器來跑,這樣效果會好很多。

現在我的剪枝過後的算法,一般情況下不會超時,出牌效果如下

如果你的鬥地主按照這種牌,能以這樣的方式出完,那麼效果也是不錯的了,

這個是我利用工作空閒時間,研究了20天的效果,過程非常辛苦。

如果有朋友有更加好的想法,歡迎一起留言交流,敬請踢教。Q:460000713

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章