地主演算法之判斷牌型

2021-06-06 13:37:05 字數 4156 閱讀 6251

地主演算法之判斷牌型

每個遊戲都有屬於自己的規則,當然地主也不例外,常鬥地主的朋友可能知道在鬥地主裡面一共有13種牌型,你所出的牌必須符合13種的一種才能夠出得了牌,這個就叫地主的規則。那麼我們下面可以通過乙個列舉結構來表示每一種的牌型,在這裡我們把錯誤的牌型也當成是一種牌型。

enum  card_type

;

那麼在程式設計中我們該怎麼來判斷一組牌到底該屬於哪一種牌型了??

首先我們可以根據窮舉的方式來羅列一下。在我以前寫鬥地主的時候我是根據出牌的張數來羅列牌型的,下面我也將使用這種方法,因為沒有找到什麼更好的方法,嘿嘿!!那就讓我們開始吧!

牌的張數   可能的牌型

1張牌         單牌

2張牌         對子(排除對鬼,因為這個在出牌中出現的次數比較少)

3張牌        3不帶

4張牌       3帶一  炸彈

5張牌       連牌,3帶1對

6,7,8,9.........

這裡我們可以用出牌張數5作為分界線,因為5剛好是連牌的起始數並且出牌張數大於5之後就比較的複雜了。

我們首先定義乙個陣列來存放即將出牌的牌值。

在判斷牌型之前將陣列排序,排序規則:如果每張牌出現的次數一樣,由小到大,如果不一樣就將出現次數比較多的牌放在前面。比如(7,7,3,7)排序之後就變為(7,7,7,3),這樣便於我們後面的判斷。

出牌張數<5

我們只需判斷第一張和最後一張牌的牌值時候相等(因為我們陣列已經按照我們事先的規則排序了),如果相等則直接返回牌的張數,這裡牌的張數剛好對應我們前面定義的列舉結構值。如果不相等這裡要分情況,當出牌的張數等於4時,判斷第一張的牌值是否等於倒數第2張,如果相等我們可以直接返回three_one_card牌型,其餘的情況可以直接返回error_card 。

card_type   judgecardtpye(int * parray,int lenght)

if (intarray[0]==intarray[lengh-2]&&lengh==4)

}

出牌張數》=5當出牌張數大於5張時,所組成的牌型就比較的複雜了,可以有連牌,連對,飛機,4帶2等一系列牌型。

我們先來分析一下每種牌型組成的情況

連牌:由所有的單牌組成 

連隊:由所有的對子組成

飛機:由3個+對子,或者3個,或者3個+單張

4帶2:4個+2張單牌,4個+2對牌,4個+1對牌

寫乙個計算陣列中所有值是否為連續的方法。我們假設這個函式名叫做checkcontinuous,如果全連續返回true,否則返回false

下面是沒種牌型的具體檢查方法。

連牌牌型:if(checkcontinuous(出牌陣列)==true)出牌陣列中所有牌的牌值必須小於2

連隊牌型:將出牌陣列中的對子,挨個抽出,看是否還有剩餘的牌,如果有剩餘的牌就說明不能組成連隊,則進行下面牌型的判斷。如果沒有剩餘的牌,再根據判斷連牌的方法來判斷。(篩選條件:張數》=6張&&張數%2==0)

飛機和4帶2就比較的複雜了,因為這2種牌型不像上面2種那樣組成的牌比較單一,這2種牌型可以由很多種牌來組成。

接下來我們就可以定義乙個結構體,來記錄每種牌(單個,對子,3個,4個)出現的次數。最後我們只要根據結構體中每種牌出現的數量就很容易判斷出到底是什麼牌了。

struct  crad_index

vector single_index;//記錄單張的牌

vectordoble_index; //記錄對子的牌

vectorthree_index;//記錄3張

vectorfour_index;//記錄張

飛機牌型:

我們把能組成飛機的所有牌型列舉出來: 333444,33344456,3334445566,

通過乙個遍歷記錄方法,上面結構體的值就變成這樣了。

333444                     

single_index              空

doble_index               空

three_index               3,4

four_index                  空

33344456                       

single_index             5,6

doble_index              空

three_index               3,4

four_index                 空

3334445566                       

single_index              空

doble_index              5,6

three_index               3,4

four_index                 空

這3種飛機牌型都有乙個共同點,three_index 中的資料必須為連續的並且four_index 必須為空。這個也是最開始篩選的條件之一,如果這個條件都不滿足則直接返回。

如果上面個條件滿足,接下來計算一下牌的數量就ok了

飛機不帶:three_index .sziz()*3==出牌的數量&&single_index+doble_index  ==0

飛機帶1張 :three_index .sziz()*3+single_index.size()==出牌的數量&&doble_index.size()==0

飛機帶1對:three_index .sziz()*3+doble_index.size()*2==出牌的數量&&single_index.size()==0

同樣4帶2也可以這樣來分析

4帶2牌型(牌張數%2==0)

還是像上面一樣來列舉出具體的牌型來判斷

444423  444422 44442233

4個帶單張

444423

single_index              2,3

doble_index             空

three_index               空

four_index                 4

444422

single_index             空

doble_index             2

three_index               空

four_index                 4

4個帶2對

single_index             空

doble_index             2,3

three_index               空

four_index                 4

首先找出必須滿足的條件:four_index .size()必須等於1,並且出牌張數%2==0,並且three_index.size()==0

如果這個條件不滿足則直接進行下面牌型的判斷

如果滿足就計算牌的張數

4帶1第一種情況: 帶2張單牌

((four_index.size()==1&&single_index.size()==2)||(four_index.size()+single_index.size()*4==出牌的張數))

第二種情況 :帶2對牌

((four_index.size()==1&&doble_index.size()==1)||(four_index.size()*2+single_index.size()*4==出牌的張數))

4帶2對

((four_index.size()==1&&doble_index.size()==2)||(four_index.size()*2+single_index.size()*4==出牌的張數))

鬥地主演算法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...

鬥地主含賴子的牌型判斷演算法

打出n張牌 可能含有賴子 需要判斷這n張牌能組成什麼牌型 對子 順子 飛機 整體思路 假設我們已經提前那種牌作為癩子。1 找出n張牌中的賴子,假設有m個賴子 2 計算出這剩餘n m張牌的牌值,存到和牌值一一對應的陣列,並記錄對應數量。3 計算剩餘牌能組成對應牌型所需要的賴子是否滿足需要。定義撲克陣列...

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

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