本章實現了上一章提到的檢查當前是否只是一手牌函式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(vectorlist)
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 項集。首先,通過掃瞄資料庫,累計每個項...