哎,之前扯了那麼多蛋,終於講出牌了!
本章開始講被動出牌的邏輯演算法。首先我們先把架子搭起來,被動出牌我們肯定是要知道場上目前打出的是什麼牌型。
在第二章資料結構裡我們定義過,遊戲全域性類裡面有乙個存放當前牌型結構的成員,即
//當前打出牌的型別資料,被動出牌時玩家根據這裡做出篩選
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
上一章我們已經搭好了被動出牌的基本架子,本章我們主要說明一下被動出牌演算法的基本步驟。我把出牌邏輯分為四個階段,也就是策略的優先順序。分別是 直接打光手牌 同型別牌壓制 炸彈王炸壓制 不出 第一階段 直接打光手牌 就是說如果我們可以一次性把手牌打出,那就不用考慮接下來價值之類的問題了,因為已經贏了。...