鬥地主AI演算法 第六章 牌型判斷

2021-09-18 07:34:26 字數 3628 閱讀 7679

本章實現了上一章提到的檢查當前是否只是一手牌函式ins_surcardstype

/*

檢查剩餘的牌是否只是一手牌

是: 返回手牌型別資料

不是:返回錯誤型別(cgerror)

*/cardgroupdata ins_surcardstype

(int arr)

;

輸入很簡單,就是乙個狀態陣列。輸出是手牌型別結構

//牌型組合資料結構

struct

cardgroupdata

;

其中  cgtype通過列舉獲取,nvalue計算規則參考第四章權值定義,ncount可以通過引入陣列算出,nmaxcard是用於比大小的那個牌值。

首先我們要計算出剩餘手牌個數,因為這樣便於快速篩選分支。

int ncount = 

0;for (

int i =

3; i <

18; i++)

cardgroupdata retcardgroupdata;

retcardgroupdata.ncount = ncount;

以單牌為例,若該牌型滿足單牌,則ncount==1,然後我們再找出那張牌。

//單牌型別

if (ncount == 1)}

if (prov == 1)}

對牌,三牌,炸彈同理。

三帶一的話需要設定兩個驗證變數,例如三帶一單

if (ncount == 

4)if (arr[i] == 1)}

if (prov1 ==

1 && prov2 == 1)}

三帶一對

if (ncount == 

5)if (arr[i] == 2)}

這裡我們看,迴圈改為3~15,因為三牌、對牌是不包括王的。

四帶二同理,不過四帶二要考慮到帶出去的那兩張牌型是不是相同

if (ncount == 

6)if (arr[i] ==

1|| arr[i] == 2)}

if (prov1 ==

1 && prov2 == 2)}

判斷順子的話用乙個變數記錄長度,若當前i值等於0並且之前存在i大於0的情況下,即這個長度就是順子的長度

例如單連:

if (ncount >= 

5)else}}

sumvalue = i -

10;if (prov == ncount)

}

王炸就更好判斷了,直接判斷arr[17]和arr[16]就好了

下面貼出完整**:

/*

檢查剩餘的牌是否只是一手牌

是: 返回手牌型別資料

不是:返回錯誤型別(cgerror)

*/cardgroupdata ins_surcardstype

(int arr)

cardgroupdata retcardgroupdata;

retcardgroupdata.ncount = ncount;

//單牌型別

if (ncount == 1)}

if (prov == 1)}

//對牌型別

if (ncount == 2)}

if (prov == 1)}

//三條型別

if (ncount == 3)}

if (prov == 1)}

//三帶一單

if (ncount ==

4)if (arr[i] == 1)}

if (prov1 ==

1 && prov2 == 1)}

//三帶一對

if (ncount ==

5)if (arr[i] == 2)}

if (prov1 ==

1 && prov2 == 1)}

//四帶兩單

if (ncount ==

6)if (arr[i] ==

1|| arr[i] == 2)}

if (prov1 ==

1 && prov2 == 2)}

//四帶兩對

if (ncount ==

8)if (arr[i] ==

2|| arr[i] == 4)}

//注意這裡prov2==4因為四牌也是兩個對

if (prov1 ==

1 && prov2 == 4)}

//炸彈型別

if (ncount == 4)}

if (prov == 1)}

//王炸型別

if (ncount == 2)}

//單連型別

if (ncount >=

5)else}}

sumvalue = i -

10;if (prov == ncount)

}//對連型別

if (ncount >=

6)else}}

sumvalue = i -

10;if (prov *

2 == ncount)

}//三連型別

if (ncount >=

6)else}}

sumvalue = (i -

3) /

2;if (prov *

3 == ncount)

}//三帶一連型別

if (ncount >=

8)else}}

sumvalue = (i -

3)/2;

if (prov1 *

4 == ncount)

}//三帶二連型別

if (ncount >=

10)else}}

for (j =

3; j <

16; j++)

}sumvalue = (i -

3) /

2;if (prov1 == prov2&&prov1 *

5 == ncount)

}retcardgroupdata.cgtype = cgerror;

return retcardgroupdata;}/*

檢查剩餘的牌是否只是一手牌(vector過載)

是: 返回手牌型別資料

不是:返回錯誤型別(cgerror)

*/cardgroupdata ins_surcardstype

(vector

list)

return ins_surcardstype(arr);

}

怎麼樣,這麼多牌型列舉是不是很頭疼?放心吧,接下來的主動出牌演算法、被動出牌演算法的列舉會更頭疼!

所以~從下一章開始我們就要講出牌的策略了,首先是被動出牌。

鬥地主AI演算法 第六章 牌型判斷

本章實現了上一章提到的檢查當前是否只是一手牌函式ins surcardstype 檢查剩餘的牌是否只是一手牌 是 返回手牌型別資料 不是 返回錯誤型別 cgerror cardgroupdata ins surcardstype int arr 輸入很簡單,就是乙個狀態陣列。輸出是手牌型別結構 牌型...

鬥地主演算法1判斷牌型

using unityengine using system.collections.generic 牌型 3 4 5 6 7 8 9 10 11 j 12 q 13 k 14 a 15 2 16 小王 17 大王 public class ddz cardtype 是否是單張 public sta...

第六章 Apriori演算法

apriori演算法是agrawal和r.srikant於1994年提出的,為布林關聯規則挖掘頻繁項集的原創性演算法。演算法的名字基於這樣的事實 演算法使用頻繁項集性質的先驗知識。apriori演算法使用一種稱為逐層搜尋的迭代演算法,其中k項集用於探索 k 1 項集。首先,通過掃瞄資料庫,累計每個項...