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

2021-07-31 05:34:55 字數 3423 閱讀 4269

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