本章實現了上一章提到的檢查當前是否只是一手牌函式ins_surcardstype
輸入很簡單,就是乙個狀態陣列。輸出是手牌型別結構/*
檢查剩餘的牌是否只是一手牌
是: 返回手牌型別資料
不是:返回錯誤型別(cgerror)
*/cardgroupdata ins_surcardstype
(int arr)
;
其中 cgtype通過列舉獲取,nvalue計算規則參考第四章權值定義,ncount可以通過引入陣列算出,nmaxcard是用於比大小的那個牌值。//牌型組合資料結構
struct
cardgroupdata
;
首先我們要計算出剩餘手牌個數,因為這樣便於快速篩選分支。
以單牌為例,若該牌型滿足單牌,則ncount==1,然後我們再找出那張牌。int ncount =
0;for (
int i =
3; i <
18; i++)
cardgroupdata retcardgroupdata;
retcardgroupdata.ncount = ncount;
對牌,三牌,炸彈同理。//單牌型別
if (ncount == 1)}
if (prov == 1)}
三帶一的話需要設定兩個驗證變數,例如三帶一單
三帶一對if (ncount ==
4)if (arr[i] == 1)}
if (prov1 ==
1 && prov2 == 1)}
這裡我們看,迴圈改為3~15,因為三牌、對牌是不包括王的。if (ncount ==
5)if (arr[i] == 2)}
四帶二同理,不過四帶二要考慮到帶出去的那兩張牌型是不是相同
判斷順子的話用乙個變數記錄長度,若當前i值等於0並且之前存在i大於0的情況下,即這個長度就是順子的長度if (ncount ==
6)if (arr[i] ==
1|| arr[i] == 2)}
if (prov1 ==
1 && prov2 == 2)}
例如單連:
王炸就更好判斷了,直接判斷arr[17]和arr[16]就好了if (ncount >=
5)else}}
sumvalue = i -
10;if (prov == ncount)
}
下面貼出完整**:
怎麼樣,這麼多牌型列舉是不是很頭疼?放心吧,接下來的主動出牌演算法、被動出牌演算法的列舉會更頭疼!/*
檢查剩餘的牌是否只是一手牌
是: 返回手牌型別資料
不是:返回錯誤型別(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 項集。首先,通過掃瞄資料庫,累計每個項...