鬥地主AI演算法 第七章 被動出牌 1

2021-09-18 07:37:41 字數 3479 閱讀 8499

哎,之前扯了那麼多蛋,終於講出牌了!

本章開始講被動出牌的邏輯演算法。首先我們先把架子搭起來,被動出牌我們肯定是要知道場上目前打出的是什麼牌型。

在第二章資料結構裡我們定義過,遊戲全域性類裡面有乙個存放當前牌型結構的成員,即

//當前打出牌的型別資料,被動出牌時玩家根據這裡做出篩選

cardgroupdata uctnowcardgroup;

我們即將通過他進行型別的篩選,所以肯定是要列舉各類牌型的,也就是這個樣子的。

是的不要質疑!就是這個樣子的~~

當然了,雖然是2.0初級版,我們還是要給予一定的靈性的,比如說當最後只剩兩手牌且存在王炸的話,王炸優先出。

/*王炸——當前策略只處理王炸作為倒數第二手的優先出牌邏輯,後續版本會在此基礎上優化*/

if (clshandcarddata.value_ahandcardlist[

17] >

0 && clshandcarddata.value_ahandcardlist[

16] > 0)}

演算法思路:若存在手牌17(大王)和16(小王),那麼先去除這兩張牌

然後通過get_handcardvalue獲取剩餘輪次。

再回溯到原有狀態。若只剩一手,則打出王炸。

出牌的操作也很簡單,將需要打出的牌進入clshandcarddata.value_nputcardlist陣列,且通過第四章提到的get_groupdata函式獲取型別結構再賦值給手牌類以及遊戲全域性類相應的成員變數。當確定好出牌策略後,直接return。因為被動出牌的分支只會走乙個,為了節約時間,所以每個分支裡都有return,若沒有走入任何分支則視為錯誤資料。

我們先把最簡單的型別寫出來,就是別人出王炸時的策略。

//王炸型別 人都王炸了你還出個毛

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgking_card)

怎麼樣,是不是很簡單?

若不出牌,我們只更新自己手牌型別就好了。若出牌時,不但要更新自己手牌資訊,也要更新遊戲全域性類裡面的當前出牌資訊。不過我更推薦後期嵌入的時候通過伺服器來獲取當前出牌的資訊。比如我的測試函式裡會加上:

if (arrhandcarddata[indexid].uctputcardtype.cgtype != cgzero)

另外,出牌前記得清空一下出牌序列,就是在一開始加:

clshandcarddata.clearputcardlist();

所以,整個函式的架子是這樣的,假設我們啥都管不上。

/*

2.0版本策略 根據場上形勢決定當前預打出的手牌——被動出牌

*/void

get_putcardlist_2_limit

(gamesituation &clsgamesituation, handcarddata &clshandcarddata)

}//錯誤牌型 不出

if (clsgamesituation.uctnowcardgroup.cgtype == cgerror)

//不出牌型,在被動出牌策略裡也是錯誤資料 不出

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgzero)

//單牌型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgsingle)

//對牌型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgdouble)

//三牌型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree)

//單連型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgsingle_line)

//對連型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgdouble_line)

//三連型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree_line)

//三帶一單

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree_take_one)

//三帶一對

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree_take_two)

//三帶一單連

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree_take_one_line)

//三帶一對連

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgthree_take_two_line)

//四帶兩單

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgfour_take_one)

//四帶兩對

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgfour_take_two)

//炸彈型別

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgbomb_card)

//王炸型別 人都王炸了你還出個毛

else

if (clsgamesituation.uctnowcardgroup.cgtype == cgking_card)

//異常處理 不出

else

return;

}

當然,啥都管不上肯定是不行的,所以接下來我們會填充各種牌型的策略演算法。

鬥地主AI演算法 第七章 被動出牌 1

哎,之前扯了那麼多蛋,終於講出牌了!本章開始講被動出牌的邏輯演算法。首先我們先把架子搭起來,被動出牌我們肯定是要知道場上目前打出的是什麼牌型。在第二章資料結構裡我們定義過,遊戲全域性類裡面有乙個存放當前牌型結構的成員,即 當前打出牌的型別資料,被動出牌時玩家根據這裡做出篩選 cardgroupdat...

鬥地主AI演算法 第八章 被動出牌 2

上一章我們已經搭好了被動出牌的基本架子,本章我們主要說明一下被動出牌演算法的基本步驟。我把出牌邏輯分為四個階段,也就是策略的優先順序。分別是 直接打光手牌 同型別牌壓制 炸彈王炸壓制 不出 第一階段 直接打光手牌 就是說如果我們可以一次性把手牌打出,那就不用考慮接下來價值之類的問題了,因為已經贏了。...

鬥地主AI演算法 第八章 被動出牌 2

上一章我們已經搭好了被動出牌的基本架子,本章我們主要說明一下被動出牌演算法的基本步驟。我把出牌邏輯分為四個階段,也就是策略的優先順序。分別是 直接打光手牌 同型別牌壓制 炸彈王炸壓制 不出 第一階段 直接打光手牌 就是說如果我們可以一次性把手牌打出,那就不用考慮接下來價值之類的問題了,因為已經贏了。...