麻將游戲算法深入解析及實現代碼。本站提示廣大學習愛好者:(麻將游戲算法深入解析及實現代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是麻將游戲算法深入解析及實現代碼正文
麻將游戲算法深入解析及實現代碼
這兩天為了工具箱的完善,整理了這些年引擎開發的一些資料,無意中發現06年寫的一個麻將算法,編譯運行了一下,還是有點意思的,拿出來整理一下分享給大家。
麻將是一種大家最喜愛的娛樂活動之一,相信所有人都有接觸過。我寫的這版算法,是可以吃,碰,槓,還有把牌摸完沒有人胡時的皇莊和包聽。是用控制台方式來表現的,什麼?控制台?
對,因為是算法的設計,所以用控制台來表現當然最簡單了。
當然,在交互時要用文字輸入會有少許不便,不過這種形式的游戲可是圖形游戲的鼻祖哦~
好,廢話不多說了,來說一下設計思路:
對於麻將的一個玩家,都有一個牌牆的管理,這裡封裝了一副牌牆的各種算法,這個類我命名為CMJ。
另外還有一個洗牌類,負責洗牌和發牌。這個類為CMJManage。
我們先來看一下CMJ類。
CMJ.h:
#ifndef _CMJ_H #define _CMJ_H //============================================ //Author:Honghaier //Date:2006-12-20 //QQ:285421210 //============================================ #include <windows.h> #include <iostream> #include <vector> #include <algorithm> using namespace std; #define MJPAI_ZFB 0 //中,發,白 #define MJPAI_FENG 1 //東西南北風 #define MJPAI_WAN 2 //萬 #define MJPAI_TIAO 3 //條 #define MJPAI_BING 4 //餅 #define MJPAI_HUA 5 //花 #define MJPAI_GETPAI true //起牌 #define MJPAI_PUTPAI false //打牌 //節點信息 struct stPAI { int m_Type; //牌類型 int m_Value; //牌字 } ; //吃牌順 struct stCHI { int m_Type; //牌類型 int m_Value1; //牌字 int m_Value2; //牌字 int m_Value3; //牌字 } ; // m_Type m_Value //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// // 0 | 中 1 發2 白 // | // 1 | 東 1 西2 南 北 // | // 2 | 一萬 二萬 …… 九萬 // | // 3 | 一條 二條 …… 九條 // | // 4 | 一餅 二餅 …… 九餅 // | // 5 | 春 夏 秋 東 竹 蘭 梅 菊 // | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// //胡牌信息 struct stGoodInfo { char m_GoodName[100]; //胡牌術語 int m_GoodValue; //胡牌番數 } ; //牌 class CMJ { vector< int > m_MyPAIVec[6]; //起的種牌型 vector< int > m_ChiPAIVec[6]; //吃的種牌型 vector< int > m_PengPAIVec[6]; //碰的種牌型 vector< int > m_GangPAIVec[6]; //槓的種牌型 stPAI m_LastPAI; //最後起的牌 stGoodInfo m_GoodInfo; //胡牌信息 bool m_9LBD; //是否聽連寶燈牌型 bool m_13Y; //是否聽十三幺 int m_MKNum; //明刻數 int m_AKNum; //暗刻數 bool m_4AK; //是否是聽四暗刻 vector< stCHI > m_TempChiPAIVec; //吃的可選組合 vector< stPAI > m_TempPengPAIVec; //碰的可選組合 vector< stPAI > m_TempGangPAIVec; //槓的可選組合 public: //構造 CMJ(); //析構 ~CMJ(); //初始化 void Init(); //起牌 bool AddPai(int p_Type,int p_Value); //取得對應的牌在牌牆的索引 int GetPaiIndex(int p_Type,int p_Value); //打牌(參數為對應的牌在牌牆的索引) bool DelPai(int PaiIndex); //刪除牌 bool DelPai(int p_Type,int p_Value); //清空牌 void CleanUp(); //取得胡牌信息 stGoodInfo *GetInfo(); //檢測是否胡牌 bool CheckAllPai(bool GetOrPut); //對所有的牌進行輸出 void PrintAllPai(); //對一張牌進行輸出 void PrintPai(int p_Type,int p_Value); //吃牌 bool CheckChiPai(int p_Type,int p_Value); //吃牌 bool DoChiPai(int p_iIndex,int p_Type,int p_Value); //碰牌 bool CheckPengPai(int p_Type,int p_Value); //碰牌 bool DoPengPai(int p_Type,int p_Value); //槓牌 bool CheckGangPai(int p_Type,int p_Value); //槓牌 bool DoGangPai(int p_Type,int p_Value); //對可吃的組合進行輸出 void PrintChiChosePai(); //對可碰的組合進行輸出 void PrintPengChosePai(); //對可槓的組合進行輸出 void PrintGangChosePai(); //取得吃牌組合數 UINT GetChiChoseNum(); private: //檢測是否胡牌(張) bool CheckAAPai(int iValue1,int iValue2); //檢測是否三連張 bool CheckABCPai(int iValue1,int iValue2,int iValu3); //檢測是否三重張 bool CheckAAAPai(int iValue1,int iValue2,int iValu3); //檢測是否四重張 bool CheckAAAAPai(int iValue1,int iValue2,int iValu3,int iValue4); //檢測是否三連對 bool CheckAABBCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6); //檢測是否三連高壓 bool CheckAAABBBCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9); //檢測是否三連刻 bool CheckAAAABBBBCCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); //檢測是否六連對 bool CheckAABBCCDDEEFFPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); //帶將牌檢測=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //檢測是否胡牌(張) bool Check5Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5); //檢測是否胡牌(張) bool Check8Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8); //檢測是否胡牌(張) bool Check11Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11); //檢測是否胡牌(張) bool Check14Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12,int iValue13,int iValue14); //不帶將牌檢測-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //檢測是否胡牌(張) bool Check3Pai(int iValue1,int iValue2,int iValue3); //檢測是否胡牌(張) bool Check6Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6); //檢測是否胡牌(張) bool Check9Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9); //檢測是否胡牌(張) bool Check12Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); private: //胡牌判斷 //檢測是否胡大四喜 bool CheckD4X_HU(); //檢則是否胡大三元 bool CheckD3Y_HU(); //檢測是否胡綠一色 bool CheckL1S_HU(); //檢測是否胡九蓮寶燈 bool Check9LBD_HU(); //檢測是否胡四槓 bool Check4Gang_HU(); //檢測是否胡連七對 bool CheckL7D_HU(); //檢測是否胡十三幺 bool Chekc13Y_HU(); //檢測是否胡清幺九 bool CheckQY9_HU(); //檢測是否胡小四喜 bool CheckX4X_HU(); //檢測是否胡小三元 bool CheckX3Y_HU(); //檢測是否胡字一色 bool CheckZ1S_HU(); //檢測是否四暗刻 bool Check4AK_HU(); //檢測是否一色雙龍會 bool Check1S2LH_HU(); //檢測是否一色四同順 bool Check1S4TS_HU(); //檢測是否一色四節高? bool Check1S4JG_HU(); //檢測是否一色四步高? bool Check1S4BG_HU(); //檢測是否三槓 bool Check3Gang_HU(); //檢測是否混幺九 bool CheckHY9_HU(); //檢測是否七對 bool Check7D_HU(); //檢測是否七星不靠 bool Check7XBK_HU(); //檢測是否全雙刻? bool CheckQSK_HU(); //清一色 bool CheckQ1S_HU(); //檢測是否一色三同順 bool Check1S3TS_HU(); //檢測是否一色三節高 bool Check1S3JG_HU(); //檢測是否全大 bool CheckQD_HU(); //檢測是否全中 bool CheckQZ_HU(); //檢測是否全小 bool CheckQX_HU(); //檢測是否青龍 bool CheckQL_HU(); //檢測是否三色雙龍會 bool Check3S2LH_HU(); //檢測是否一色三步高 bool Check1S3BG_HU(); //全帶五 bool CheckQD5_HU(); //三同刻 bool Check3TK_HU(); //三暗刻 bool Check3AK_HU(); //單釣將 bool CheckDDJ_HU(); //檢測胡 bool CheckHU(); private: //聽牌判斷 //檢測是否聽九蓮寶燈 bool Check9LBD_TING(); //檢測是否聽十三幺 bool Check13Y_TING(); //檢測是否聽四暗刻 bool Check4AK_TING(); //檢測是否聽牌 bool CheckTING(); } ; #endif
其對應的CPP :
#include "CMJ.h" //構造 CMJ::CMJ() { m_9LBD = false; m_13Y = false; m_4AK = false; m_AKNum = 0; m_MKNum = 0; } //析構 CMJ::~CMJ() { } //初始化 void CMJ::Init() { m_9LBD = false; m_13Y = false; m_4AK = false; m_AKNum = 0; m_MKNum = 0; } //加入新牌,並排序 bool CMJ::AddPai(int p_Type,int p_Value) { int iSize = m_MyPAIVec[p_Type].size(); bool t_Find = false; vector< int >::iterator Iter; for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++) { if((*Iter)>p_Value) { m_MyPAIVec[p_Type].insert(Iter,p_Value); t_Find = true; break; } } if(t_Find==false) { m_MyPAIVec[p_Type].push_back(p_Value); } m_LastPAI.m_Type = p_Type; m_LastPAI.m_Value = p_Value; return true; } //取得對應的牌在牌牆的索引 int CMJ::GetPaiIndex(int p_Type,int p_Value) { int count = 0; for(UINT i = 0 ; i < 6 ; i++ ) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++) { if(p_Type==i&&(*Iter)==p_Value) { return count; } count++; } } return -1; } //打牌 bool CMJ::DelPai(int PaiIndex) { int count = 0; for(UINT i = 0 ; i < 6 ; i++ ) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++) { if(count==PaiIndex) { m_MyPAIVec[i].erase(Iter); return true; } count++; } } return false; } //刪除牌 bool CMJ::DelPai(int p_Type,int p_Value) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++) { if((*Iter)==p_Value) { m_MyPAIVec[p_Type].erase(Iter); return true; } } return false; } //清空牌 void CMJ::CleanUp() { for(UINT i = 0 ; i < 6 ; i++ ) { m_MyPAIVec[i].clear(); m_ChiPAIVec[i].clear(); m_PengPAIVec[i].clear(); m_GangPAIVec[i].clear(); } } //取得胡牌信息 stGoodInfo *CMJ::GetInfo() { return &m_GoodInfo; } //對所有的牌進行函數調用 void CMJ::PrintAllPai() { cout<<" "; for(UINT i = 0 ; i < 13 ; i++ ) { cout<<i<<" - "; } cout<<endl; int icount = 0; //箭牌 if(m_MyPAIVec[0].empty()==false) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[0].begin();Iter !=m_MyPAIVec[0].end(); Iter++) { switch(*Iter) { case 1: cout<<"[ 中]"; break; case 2: cout<<"[ 發]"; break; case 3: cout<<"[ 白]"; break; } icount++; } } cout<<endl; for(UINT i =0 ; i < icount; i++ ) { cout<<" "; } //風牌 if(m_MyPAIVec[1].empty()==false) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[1].begin();Iter !=m_MyPAIVec[1].end(); Iter++) { switch(*Iter) { case 1: cout<<"[ 東]"; break; case 2: cout<<"[ 南]"; break; case 3: cout<<"[ 西]"; break; case 4: cout<<"[ 北]"; break; } icount++; } } cout<<endl; for(UINT i =0 ; i < icount; i++ ) { cout<<" "; } //萬 if(m_MyPAIVec[2].empty()==false) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[2].begin();Iter !=m_MyPAIVec[2].end(); Iter++) { cout<<"["<<(*Iter)<<"萬]"; icount++; } } cout<<endl; for(UINT i =0 ; i < icount; i++ ) { cout<<" "; } //條 if(m_MyPAIVec[3].empty()==false) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[3].begin();Iter !=m_MyPAIVec[3].end(); Iter++) { cout<<"["<<(*Iter)<<"條]"; icount++; } } cout<<endl; for(UINT i =0 ; i < icount; i++ ) { cout<<" "; } //餅 if(m_MyPAIVec[4].empty()==false) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[4].begin();Iter !=m_MyPAIVec[4].end(); Iter++) { cout<<"["<<(*Iter)<<"餅]"; icount++; } } cout<<endl; for(UINT i =0 ; i < icount; i++ ) { cout<<" "; } } //對一張牌進行輸出 void CMJ::PrintPai(int p_Type,int p_Value) { //箭牌 if(p_Type==0) { switch(p_Value) { case 1: cout<<"[中]"; break; case 2: cout<<"[發]"; break; case 3: cout<<"[白]"; break; } } //風牌 if(p_Type==1) { switch(p_Value) { case 1: cout<<"[東]"; break; case 2: cout<<"[南]"; break; case 3: cout<<"[西]"; break; case 4: cout<<"[北]"; break; } } //萬 if(p_Type==2) { cout<<"["<<p_Value<<"萬]"; } //條 if(p_Type==3) { cout<<"["<<p_Value<<"條]"; } //餅 if(p_Type==4) { cout<<"["<<p_Value<<"餅]"; } } //吃牌 bool CMJ::CheckChiPai(int p_Type,int p_Value) { m_TempChiPAIVec.clear(); //餅 if(m_MyPAIVec[p_Type].empty()==false) { int iSize = m_MyPAIVec[p_Type].size(); if( iSize >= 2) { for(UINT i = 0 ; i < iSize-1 ; i++ ) { if((m_MyPAIVec[p_Type][i]==(p_Value-2))&&(m_MyPAIVec[p_Type][i+1]==(p_Value-1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-2; t_Chi.m_Value2 = p_Value-1; t_Chi.m_Value3 = p_Value; m_TempChiPAIVec.push_back(t_Chi); } if((m_MyPAIVec[p_Type][i]==(p_Value-1))&&(m_MyPAIVec[p_Type][i+1]==(p_Value+1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-1; t_Chi.m_Value2 = p_Value; t_Chi.m_Value3 = p_Value+1; m_TempChiPAIVec.push_back(t_Chi); } if((m_MyPAIVec[p_Type][i]==(p_Value+1))&&(m_MyPAIVec[p_Type][i+1]==(p_Value+2))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value; t_Chi.m_Value2 = p_Value+1; t_Chi.m_Value3 = p_Value+2; m_TempChiPAIVec.push_back(t_Chi); } } } //假設吃B,已有ABC if( iSize >= 3) { for(UINT i = 1 ; i < iSize-1 ; i++ ) { if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==(p_Value+1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-1; t_Chi.m_Value2 = p_Value; t_Chi.m_Value3 = p_Value+1; m_TempChiPAIVec.push_back(t_Chi); } } } //假設吃B,已有ABBC if( iSize >= 4) { for(UINT i = 1 ; i < iSize-2 ; i++ ) { if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+2]==(p_Value+1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-1; t_Chi.m_Value2 = p_Value; t_Chi.m_Value3 = p_Value+1; m_TempChiPAIVec.push_back(t_Chi); } } } //假設吃B,已有ABBBC if( iSize >= 5) { for(UINT i = 1 ; i < iSize-3 ; i++ ) { if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+3]==(p_Value+1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-1; t_Chi.m_Value2 = p_Value; t_Chi.m_Value3 = p_Value+1; m_TempChiPAIVec.push_back(t_Chi); } } } //假設吃B,已有ABBBBC if( iSize >= 6) { for(UINT i = 1 ; i < iSize-4 ; i++ ) { if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+4]==(p_Value+1))) { stCHI t_Chi; t_Chi.m_Type = p_Type; t_Chi.m_Value1 = p_Value-1; t_Chi.m_Value2 = p_Value; t_Chi.m_Value3 = p_Value+1; m_TempChiPAIVec.push_back(t_Chi); } } } if(m_TempChiPAIVec.size() > 0) { return true; } } return false; } //吃牌 bool CMJ::DoChiPai(int p_iIndex,int p_Type,int p_Value) { AddPai(p_Type,p_Value); vector<stCHI>::iterator Iter; int icount = 0; for(Iter = m_TempChiPAIVec.begin(); Iter != m_TempChiPAIVec.end(); Iter++ ) { if(icount == p_iIndex) { DelPai((*Iter).m_Type,(*Iter).m_Value1); DelPai((*Iter).m_Type,(*Iter).m_Value2); DelPai((*Iter).m_Type,(*Iter).m_Value3); m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value1); m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value2); m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value3); return true; } icount++; } return false; } //對可吃的組合進行輸出 void CMJ::PrintChiChosePai() { cout<<"================吃牌組合======================="<<endl; vector<stCHI>::iterator Iter; for(Iter = m_TempChiPAIVec.begin(); Iter != m_TempChiPAIVec.end();Iter++) { //萬 if((*Iter).m_Type==2) { cout<<"["<<(*Iter).m_Value1<<"萬"; cout<<""<<(*Iter).m_Value2<<"萬"; cout<<""<<(*Iter).m_Value3<<"萬]"; } //條 if((*Iter).m_Type==3) { cout<<"["<<(*Iter).m_Value1<<"條"; cout<<""<<(*Iter).m_Value2<<"條"; cout<<""<<(*Iter).m_Value3<<"條]"; } //餅 if((*Iter).m_Type==4) { cout<<"["<<(*Iter).m_Value1<<"餅"; cout<<""<<(*Iter).m_Value2<<"餅"; cout<<""<<(*Iter).m_Value3<<"餅]"; } } cout<<endl<<"========================================="<<endl; } //對可碰的組合進行輸出 void CMJ::PrintPengChosePai() { cout<<"=====================碰牌=================="<<endl; vector<stPAI>::iterator Iter; for(Iter = m_TempPengPAIVec.begin(); Iter != m_TempPengPAIVec.end();Iter++) { //萬 if((*Iter).m_Type==2) { cout<<"["<<(*Iter).m_Value<<"萬"; cout<<""<<(*Iter).m_Value<<"萬"; cout<<""<<(*Iter).m_Value<<"萬]"; } //條 if((*Iter).m_Type==3) { cout<<"["<<(*Iter).m_Value<<"條"; cout<<""<<(*Iter).m_Value<<"條"; cout<<""<<(*Iter).m_Value<<"條]"; } //餅 if((*Iter).m_Type==4) { cout<<"["<<(*Iter).m_Value<<"餅"; cout<<""<<(*Iter).m_Value<<"餅"; cout<<""<<(*Iter).m_Value<<"餅]"; } } cout<<endl<<"========================================="<<endl; } //對可槓的組合進行輸出 void CMJ::PrintGangChosePai() { cout<<"====================槓牌==================="<<endl; vector<stPAI>::iterator Iter; for(Iter = m_TempGangPAIVec.begin(); Iter != m_TempGangPAIVec.end();Iter++) { //萬 if((*Iter).m_Type==2) { cout<<"["<<(*Iter).m_Value<<"萬"; cout<<""<<(*Iter).m_Value<<"萬"; cout<<""<<(*Iter).m_Value<<"萬"; cout<<""<<(*Iter).m_Value<<"萬]"; } //條 if((*Iter).m_Type==3) { cout<<"["<<(*Iter).m_Value<<"條"; cout<<""<<(*Iter).m_Value<<"條"; cout<<""<<(*Iter).m_Value<<"條"; cout<<""<<(*Iter).m_Value<<"條]"; } //餅 if((*Iter).m_Type==4) { cout<<"["<<(*Iter).m_Value<<"餅"; cout<<""<<(*Iter).m_Value<<"餅"; cout<<""<<(*Iter).m_Value<<"餅"; cout<<""<<(*Iter).m_Value<<"餅]"; } } cout<<endl<<"========================================="<<endl; } //取得吃牌組合數 UINT CMJ::GetChiChoseNum() { return m_TempChiPAIVec.size(); } //碰牌 bool CMJ::CheckPengPai(int p_Type,int p_Value) { m_TempPengPAIVec.clear(); //餅 if(m_MyPAIVec[p_Type].empty()==false) { int iSize = m_MyPAIVec[p_Type].size(); if( iSize >= 2) { for(UINT i = 0 ; i < iSize-1 ; i++ ) { if((m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==p_Value)) { stPAI t_Peng; t_Peng.m_Type = p_Type; t_Peng.m_Value = p_Value; m_TempPengPAIVec.push_back(t_Peng); break; } } } if(m_TempPengPAIVec.size() > 0) { return true; } } return false; } //碰牌 bool CMJ::DoPengPai(int p_Type,int p_Value) { AddPai(p_Type,p_Value); vector<stPAI>::iterator Iter; for(Iter = m_TempPengPAIVec.begin(); Iter != m_TempPengPAIVec.end(); Iter++ ) { DelPai((*Iter).m_Type,(*Iter).m_Value); DelPai((*Iter).m_Type,(*Iter).m_Value); DelPai((*Iter).m_Type,(*Iter).m_Value); m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); return true; } return false; } //槓牌 bool CMJ::CheckGangPai(int p_Type,int p_Value) { m_TempGangPAIVec.clear(); //餅 if(m_MyPAIVec[p_Type].empty()==false) { int iSize = m_MyPAIVec[p_Type].size(); if( iSize >= 3) { for(UINT i = 0 ; i < iSize-2 ; i++ ) { if((m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==p_Value)&&(m_MyPAIVec[p_Type][i+2]==p_Value)) { stPAI t_Gang; t_Gang.m_Type = p_Type; t_Gang.m_Value = p_Value; m_TempGangPAIVec.push_back(t_Gang); break; } } } if(m_TempGangPAIVec.size() > 0) { return true; } } return false; } //槓牌 bool CMJ::DoGangPai(int p_Type,int p_Value) { AddPai(p_Type,p_Value); vector<stPAI>::iterator Iter; for(Iter = m_TempGangPAIVec.begin(); Iter != m_TempGangPAIVec.end(); Iter++ ) { DelPai((*Iter).m_Type,(*Iter).m_Value); DelPai((*Iter).m_Type,(*Iter).m_Value); DelPai((*Iter).m_Type,(*Iter).m_Value); DelPai((*Iter).m_Type,(*Iter).m_Value); //排序放入 if(m_GangPAIVec[(*Iter).m_Type].empty()) { m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value); } else { vector<int>::iterator Iter2; for(Iter2 = m_GangPAIVec[(*Iter).m_Type].begin(); Iter2 != m_GangPAIVec[(*Iter).m_Type].end(); Iter2++ ) { if((*Iter2)>(*Iter).m_Value) { m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value); m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value); break; } } } return true; } return false; } //檢測是否胡牌 bool CMJ::CheckAllPai(bool GetOrPut) { if(GetOrPut == MJPAI_GETPAI) { //檢查大四喜 if(CheckD4X_HU()) { strcpy(m_GoodInfo.m_GoodName,"大四喜"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查大三元 if(CheckD3Y_HU()) { strcpy(m_GoodInfo.m_GoodName,"大三元"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查綠一色 if(CheckL1S_HU()) { strcpy(m_GoodInfo.m_GoodName,"綠一色"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查九蓮寶燈 if(Check9LBD_HU()) { strcpy(m_GoodInfo.m_GoodName,"九蓮寶燈"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查四槓 if(Check4Gang_HU()) { strcpy(m_GoodInfo.m_GoodName,"四槓"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查連七對 if(CheckL7D_HU()) { strcpy(m_GoodInfo.m_GoodName,"連七對"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查十三幺 if(Chekc13Y_HU()) { strcpy(m_GoodInfo.m_GoodName,"十三幺"); m_GoodInfo.m_GoodValue = 88; return true; } //檢查清幺九 if(CheckQY9_HU()) { strcpy(m_GoodInfo.m_GoodName,"清幺九"); m_GoodInfo.m_GoodValue = 64; return true; } //檢查小四喜 if(CheckX4X_HU()) { strcpy(m_GoodInfo.m_GoodName,"小四喜"); m_GoodInfo.m_GoodValue = 64; return true; } //檢查小三元 if(CheckX3Y_HU()) { strcpy(m_GoodInfo.m_GoodName,"小三元"); m_GoodInfo.m_GoodValue = 64; return true; } //檢測是否四暗刻 if(Check4AK_HU()) { strcpy(m_GoodInfo.m_GoodName,"四暗刻"); m_GoodInfo.m_GoodValue = 64; return true; } //檢測是否一色雙龍會 if(Check1S2LH_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色雙龍會"); m_GoodInfo.m_GoodValue = 64; return true; } //檢測是否一色四同順 if(Check1S4TS_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色四同順"); m_GoodInfo.m_GoodValue = 48; return true; } //檢測是否一色四節高 if(Check1S4JG_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色四節高"); m_GoodInfo.m_GoodValue = 48; return true; } //檢測是否一色四步高 if(Check1S4BG_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色四步高"); m_GoodInfo.m_GoodValue = 32; return true; } //檢測是否三槓 if(Check3Gang_HU()) { strcpy(m_GoodInfo.m_GoodName,"三槓"); m_GoodInfo.m_GoodValue = 32; return true; } //檢測是否七對 if(Check7D_HU()) { strcpy(m_GoodInfo.m_GoodName,"七對"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否七星不靠 if(Check7XBK_HU()) { strcpy(m_GoodInfo.m_GoodName,"七星不靠"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否全雙刻 if(CheckQSK_HU()) { strcpy(m_GoodInfo.m_GoodName,"全雙刻"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否清一色 if(CheckQ1S_HU()) { strcpy(m_GoodInfo.m_GoodName,"清一色"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否一色三同順 if(Check1S3TS_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色三同順"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否一色三節高 if(Check1S3JG_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色三節高"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否全大 if(CheckQD_HU()) { strcpy(m_GoodInfo.m_GoodName,"全大"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否全中 if(CheckQZ_HU()) { strcpy(m_GoodInfo.m_GoodName,"全中"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否全小 if(CheckQX_HU()) { strcpy(m_GoodInfo.m_GoodName,"全小"); m_GoodInfo.m_GoodValue = 24; return true; } //檢測是否青龍 if(CheckQL_HU()) { strcpy(m_GoodInfo.m_GoodName,"青龍"); m_GoodInfo.m_GoodValue = 16; return true; } //檢測是否三色雙龍會 if(Check3S2LH_HU()) { strcpy(m_GoodInfo.m_GoodName,"三色雙龍會"); m_GoodInfo.m_GoodValue = 16; return true; } //檢測是否一色三步高 if(Check1S3BG_HU()) { strcpy(m_GoodInfo.m_GoodName,"一色三步高"); m_GoodInfo.m_GoodValue = 16; return true; } //檢測是否單調將 if(CheckDDJ_HU()) { strcpy(m_GoodInfo.m_GoodName,"單調將"); m_GoodInfo.m_GoodValue = 1; return true; } //檢測是否平胡 if(CheckHU()) { strcpy(m_GoodInfo.m_GoodName,"平胡"); m_GoodInfo.m_GoodValue = 1; return true; } } else { //判斷是否聽連寶燈 m_9LBD = Check9LBD_TING(); if(m_9LBD)return true; //判斷是否聽幺 m_13Y = Check13Y_TING(); if(m_13Y)return true; //判斷是否四暗刻 m_4AK = Check4AK_TING(); if(m_4AK)return true; //檢測是否聽頭 return CheckTING(); } return false; } //檢測是否胡牌(張) inline bool CMJ::CheckAAPai(int iValue1,int iValue2) { if(iValue1 == iValue2)return true; return false; } //檢測是否三連張 inline bool CMJ::CheckABCPai(int iValue1,int iValue2,int iValue3) { if(iValue1 == (iValue2-1)&&iValue2 == (iValue3-1))return true; return false; } //檢測是否三重張 inline bool CMJ::CheckAAAPai(int iValue1,int iValue2,int iValue3) { if(iValue1 == iValue2&&iValue2 == iValue3)return true; return false; } //檢測是否四重張 inline bool CMJ::CheckAAAAPai(int iValue1,int iValue2,int iValue3,int iValue4) { if(iValue1 == iValue2&&iValue2 == iValue3&&iValue3 == iValue4)return true; return false; } //檢測是否三連對 inline bool CMJ::CheckAABBCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6) { if(iValue1 == iValue2&&iValue3 == iValue4&&iValue5 == iValue6) { if((iValue1 == iValue3-1)&&(iValue3 == iValue5-1)) { return true; } } return false; } //檢測是否三連高壓 inline bool CMJ::CheckAAABBBCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9) { if((iValue1 == iValue2&&iValue2 == iValue3)&&(iValue4 == iValue5&&iValue5 == iValue6)&&(iValue7 == iValue8&&iValue8 == iValue9)) { if((iValue1 == iValue4-1)&&(iValue4 == iValue7-1)) { return true; } } return false; } //檢測是否三連刻 inline bool CMJ::CheckAAAABBBBCCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12) { if((iValue1 == iValue2&&iValue2 == iValue3&&iValue3 == iValue4)&&(iValue5 == iValue6&&iValue6 == iValue7&&iValue7 == iValue8)&&(iValue9 == iValue10&&iValue10 == iValue11&&iValue11 == iValue12)) { if((iValue1 == iValue5-1)&&(iValue5 == iValue9-1)) { return true; } } return false; } //檢測是否六連對 inline bool CMJ::CheckAABBCCDDEEFFPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12) { if(iValue1 == iValue2&&iValue3 == iValue4&&iValue5 == iValue6&&iValue7 == iValue8&&iValue9 == iValue10&&iValue11 == iValue12) { if((iValue1 == iValue3-1)&&(iValue3 == iValue5-1)&&(iValue5 == iValue7-1)&&(iValue7 == iValue9-1)&&(iValue9 == iValue11-1)) { return true; } } return false; } //檢測是否胡牌(張) bool CMJ::Check5Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5) { //如果是左邊兩個為將,右邊為三重張或三連張 if(CheckAAPai(iValue1,iValue2)) { if(Check3Pai(iValue3,iValue4,iValue5))return true; } //如果中間兩個為將 if(CheckAAAPai(iValue2,iValue3,iValue4)) { if(CheckABCPai(iValue1,iValue4,iValue5))return true; } //如果是左邊兩個為將,右邊為三重張或三連張 if(CheckAAPai(iValue4,iValue5)) { if(Check3Pai(iValue1,iValue2,iValue3))return true; } return false; } //檢測是否胡牌(張) bool CMJ::Check8Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8) { //如果是左邊兩個為將,右邊為三重張或三連張 if(CheckAAPai(iValue1,iValue2)) { return Check6Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8); } //如果是中間兩個為將,左右邊為三重張或三連張 if(CheckAAPai(iValue4,iValue5)) { if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue6,iValue7,iValue8))return true; } //如果是右邊兩個為將,左邊為三重張或三連張 if(CheckAAPai(iValue7,iValue8)) { return Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6); } return false; } //檢測是否胡牌(張) bool CMJ::Check11Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11) { //如果是左邊兩個為將 if(CheckAAPai(iValue1,iValue2)) { return Check9Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11); } //如果是中間兩個為將 if(CheckAAPai(iValue4,iValue5)) { //無AAA,全ABC if(Check3Pai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; } //如果是右邊兩個為將 if(CheckAAPai(iValue7,iValue8)) { //無AAA,全ABC if(Check3Pai(iValue9,iValue10,iValue11)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true; } //如果是右邊兩個為將 if(CheckAAPai(iValue10,iValue11)) { return Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9); } return false; } //檢測是否胡牌(張) bool CMJ::Check14Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12,int iValue13,int iValue14) { //如果是左邊兩個為將,右邊為三重張或三連張 if(CheckAAPai(iValue1,iValue2)) { //無AAA,全ABC if(Check12Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true; return false; } //如果是中間兩個為將,左右邊為三重張或三連張 if(CheckAAPai(iValue4,iValue5)) { //無AAA,全ABC if(Check3Pai(iValue1,iValue2,iValue3)&&Check9Pai(iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true; return false; } //如果是中間兩個為將,左右邊為三重張或三連張 if(CheckAAPai(iValue7,iValue8)) { //無AAA,全ABC if(Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6)&&Check6Pai(iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true; return false; } //如果是中間兩個為將,左右邊為三重張或三連張 if(CheckAAPai(iValue10,iValue11)) { //無AAA,全ABC if(Check3Pai(iValue12,iValue13,iValue14)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; return false; } //如果是右邊兩個為將,左右邊為三重張或三連張 if(CheckAAPai(iValue13,iValue14)) { //無AAA,全ABC if(Check12Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true; } return false; } //檢測是否胡牌(張) bool CMJ::Check3Pai(int iValue1,int iValue2,int iValue3) { if(CheckABCPai(iValue1,iValue2,iValue3))return true; if(CheckAAAPai(iValue1,iValue2,iValue3))return true; return false; } //檢測是否胡牌(張) bool CMJ::Check6Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6) { if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue4,iValue5,iValue6))return true; if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue4,iValue5,iValue6))return true; //三連對 if(CheckAABBCCPai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true; //第一張牌四連張 if(CheckAAAAPai(iValue2,iValue3,iValue4,iValue5)) { if(CheckABCPai(iValue1,iValue2,iValue6))return true; } return false; } //檢測是否胡牌(張) bool CMJ::Check9Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9) { if(CheckABCPai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; if(CheckAAAPai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; if(CheckABCPai(iValue7,iValue8,iValue9)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true; if(CheckAAAPai(iValue7,iValue8,iValue9)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true; return false; } //檢測是否胡牌(張) bool CMJ::Check12Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12) { if(CheckABCPai(iValue1,iValue2,iValue3)&&Check9Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true; if(CheckAAAPai(iValue1,iValue2,iValue3)&&Check9Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true; if(CheckABCPai(iValue10,iValue11,iValue12)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; if(CheckAAAPai(iValue10,iValue11,iValue12)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true; if(Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6)&&Check6Pai(iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true; return false; } //檢測是否是大四喜 bool CMJ::CheckD4X_HU() { //東西南北四槓 if(m_GangPAIVec[1].size()==16) { //將牌 for(int i = 0 ; i < 6 ; i++ ) { if(m_MyPAIVec[i].size()==2) { //如果是將 if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1]) { return true; } } } } return false; } //檢則是否是大三元 bool CMJ::CheckD3Y_HU() { //中發白三槓 if(m_GangPAIVec[0].size()==12) { //將牌 for(int i = 0 ; i < 6 ; i++ ) { if(m_MyPAIVec[i].size()==2) { //如果是將 if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1]) { return true; } } } } return false; } //檢測是否綠一色 bool CMJ::CheckL1S_HU() { //只准有發財和條 if(m_MyPAIVec[1].size()>0)return false; if(m_MyPAIVec[2].size()>0)return false; if(m_MyPAIVec[4].size()>0)return false; if(m_MyPAIVec[5].size()>0)return false; if(m_ChiPAIVec[1].size()>0)return false; if(m_ChiPAIVec[2].size()>0)return false; if(m_ChiPAIVec[4].size()>0)return false; if(m_ChiPAIVec[5].size()>0)return false; if(m_PengPAIVec[1].size()>0)return false; if(m_PengPAIVec[2].size()>0)return false; if(m_PengPAIVec[4].size()>0)return false; if(m_PengPAIVec[5].size()>0)return false; if(m_GangPAIVec[1].size()>0)return false; if(m_GangPAIVec[2].size()>0)return false; if(m_GangPAIVec[4].size()>0)return false; if(m_GangPAIVec[5].size()>0)return false; //對發財 if(m_MyPAIVec[0].size() ==2) { if(m_MyPAIVec[0][0]==2&&m_MyPAIVec[0][1]==2) { for(int i = 1 ;i < 6 ; i++) { if(i==3)continue; if(m_MyPAIVec[i].size()>0)return false; if(m_ChiPAIVec[i].size()>0)return false; if(m_PengPAIVec[i].size()>0)return false; if(m_GangPAIVec[i].size()>0)return false; } //吃 int iSize = m_ChiPAIVec[3].size(); if(iSize>0) { vector< int >::iterator Iter; for(Iter = m_ChiPAIVec[3].begin();Iter != m_ChiPAIVec[3].end();Iter++ ) { if((*Iter)==1)return false; if((*Iter)==5)return false; if((*Iter)==7)return false; if((*Iter)==9)return false; } } //碰 iSize = m_PengPAIVec[3].size(); if(iSize>0) { vector< int >::iterator Iter; for(Iter = m_PengPAIVec[3].begin();Iter != m_PengPAIVec[3].end();Iter++ ) { if((*Iter)==1)return false; if((*Iter)==5)return false; if((*Iter)==7)return false; if((*Iter)==9)return false; } } //槓 iSize = m_GangPAIVec[3].size(); if(iSize>0) { vector< int >::iterator Iter; for(Iter = m_GangPAIVec[3].begin();Iter != m_GangPAIVec[3].end();Iter++ ) { if((*Iter)==1)return false; if((*Iter)==5)return false; if((*Iter)==7)return false; if((*Iter)==9)return false; } } //起 iSize = m_MyPAIVec[3].size(); if(iSize>0) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end();Iter++ ) { if((*Iter)==1)return false; if((*Iter)==5)return false; if((*Iter)==7)return false; if((*Iter)==9)return false; } } } } else { return false; } //如果有三張 if(m_MyPAIVec[3].size() == 3) { if(Check3Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2]))return true; } //如果有六張 if(m_MyPAIVec[3].size() == 6) { if(Check6Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5]))return true; } //九張 if(m_MyPAIVec[3].size() == 9) { if(Check9Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8]))return true; } //十二張 if(m_MyPAIVec[3].size() == 12) { if(Check12Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11]))return true; } return false; } //檢測是否九蓮寶燈(胡) bool CMJ::Check9LBD_HU() { if(m_9LBD)//如果已經成九連寶燈牌型 { if(m_MyPAIVec[2].size()==14)return true; if(m_MyPAIVec[3].size()==14)return true; if(m_MyPAIVec[4].size()==14)return true; } return false; } //檢測是否九蓮寶燈牌型(聽) bool CMJ::Check9LBD_TING() { for(UINT i = 2 ; i < 5 ; i++ ) { if(m_MyPAIVec[i].size()==13) { if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==1&&m_MyPAIVec[i][2]==1) { if(m_MyPAIVec[i][3]==2&&m_MyPAIVec[i][4]==3&&m_MyPAIVec[i][5]==4&&m_MyPAIVec[i][6]==5&&m_MyPAIVec[i][7]==6&&m_MyPAIVec[i][8]==7&&m_MyPAIVec[i][9]==8) { if(m_MyPAIVec[i][10]==9&&m_MyPAIVec[i][11]==9&&m_MyPAIVec[i][12]==9) { return true; } } } } } return false; } //檢測是否是四槓 bool CMJ::Check4Gang_HU() { int iSize = 0; for(UINT i = 0 ; i < 6 ; i++ ) { iSize = m_GangPAIVec[i].size(); } if(iSize == 16) { //將牌 for(int i = 0 ; i < 6 ; i++ ) { //如果是將 if(CheckAAPai(m_MyPAIVec[i][0],m_MyPAIVec[i][1])) { return true; } } } return false; } //檢測是否連七對 bool CMJ::CheckL7D_HU() { for(UINT i = 2 ; i < 5 ; i++ ) { if(m_MyPAIVec[i].size()==14) { if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==1&&m_MyPAIVec[i][2]==2&&m_MyPAIVec[i][3]==2&&m_MyPAIVec[i][4]==3&&m_MyPAIVec[i][5]==3&&m_MyPAIVec[i][6]==4&&m_MyPAIVec[i][7]==4&&m_MyPAIVec[i][8]==5&&m_MyPAIVec[i][9]==5&&m_MyPAIVec[i][10]==6&&m_MyPAIVec[i][11]==6&&m_MyPAIVec[i][12]==7&&m_MyPAIVec[i][13]==7) { return true; } if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==2&&m_MyPAIVec[i][2]==3&&m_MyPAIVec[i][3]==3&&m_MyPAIVec[i][4]==4&&m_MyPAIVec[i][5]==4&&m_MyPAIVec[i][6]==5&&m_MyPAIVec[i][7]==5&&m_MyPAIVec[i][8]==6&&m_MyPAIVec[i][9]==6&&m_MyPAIVec[i][10]==7&&m_MyPAIVec[i][11]==7&&m_MyPAIVec[i][12]==8&&m_MyPAIVec[i][13]==8) { return true; } if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==3&&m_MyPAIVec[i][2]==4&&m_MyPAIVec[i][3]==4&&m_MyPAIVec[i][4]==5&&m_MyPAIVec[i][5]==5&&m_MyPAIVec[i][6]==6&&m_MyPAIVec[i][7]==6&&m_MyPAIVec[i][8]==7&&m_MyPAIVec[i][9]==7&&m_MyPAIVec[i][10]==8&&m_MyPAIVec[i][11]==8&&m_MyPAIVec[i][12]==9&&m_MyPAIVec[i][13]==9) { return true; } } } return false; } //檢測是否胡十三幺 bool CMJ::Chekc13Y_HU() { if(m_13Y) { bool i13YSize[13] ; for(UINT i = 0 ; i < 13 ; i++ ) { i13YSize[i]=false; } //中發白 vector<int>::iterator Iter; for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ ) { if((*Iter)==1) { i13YSize[0]=true; } if((*Iter)==2) { i13YSize[1]=true; } if((*Iter)==3) { i13YSize[2]=true; } } //東南西北風 for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ ) { if((*Iter)==1) { i13YSize[3]=true; } if((*Iter)==2) { i13YSize[4]=true; } if((*Iter)==3) { i13YSize[5]=true; } if((*Iter)==4) { i13YSize[6]=true; } } //一九萬 for(Iter = m_MyPAIVec[2].begin();Iter != m_MyPAIVec[2].end(); Iter++ ) { if((*Iter)==1) { i13YSize[7]=true; } if((*Iter)==9) { i13YSize[8]=true; } } //一九條 for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end(); Iter++ ) { if((*Iter)==1) { i13YSize[9]=true; } if((*Iter)==9) { i13YSize[10]=true; } } //一九餅 for(Iter = m_MyPAIVec[4].begin();Iter != m_MyPAIVec[4].end(); Iter++ ) { if((*Iter)==1) { i13YSize[11]=true; } if((*Iter)==9) { i13YSize[12]=true; } } int icount = 0; for(UINT i = 0 ; i < 13 ; i++ ) { if(i13YSize[i]==true) { icount++; } } if(icount == 13)return true; } return false; } //檢測是否清幺九 bool CMJ::CheckQY9_HU() { int iSize = 0; int iCount = 0; for(UINT i = 2 ; i < 5 ; i++ ) { iSize = m_GangPAIVec[i].size(); iCount += iSize; for(UINT j = 0 ; j < iSize ; j++ ) { if(m_GangPAIVec[i][j]!=1||m_GangPAIVec[i][j]!=9)return false; } } if(iCount == 12) { if(m_MyPAIVec[2].size()==2) { if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==1)return true; if(m_MyPAIVec[2][0]==9&&m_MyPAIVec[2][1]==9)return true; } if(m_MyPAIVec[3].size()==3) { if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==1)return true; if(m_MyPAIVec[3][0]==9&&m_MyPAIVec[3][1]==9)return true; } if(m_MyPAIVec[4].size()==4) { if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==1)return true; if(m_MyPAIVec[4][0]==9&&m_MyPAIVec[4][1]==9)return true; } } return false; } //檢測是否胡小四喜 bool CMJ::CheckX4X_HU() { //東西南北四槓 if(m_GangPAIVec[1].size()==12) { //將牌的位置 int iJiangPos = -1; //將牌 for(int i = 0 ; i < 6 ; i++ ) { if(m_MyPAIVec[i].size()==5) { if(Check5Pai(m_MyPAIVec[i][0],m_MyPAIVec[i][1],m_MyPAIVec[i][2],m_MyPAIVec[i][3],m_MyPAIVec[i][4])) { return true; } } if(m_MyPAIVec[i].size()==2) { //如果是將 if(CheckAAPai(m_MyPAIVec[i][0],m_MyPAIVec[i][1])) { iJiangPos = i; break; } } } // if(iJiangPos>0) { for(int i = 0 ; i < 6 ; i++ ) { if(i!=iJiangPos) { if((m_MyPAIVec[i].size()==3)) { if(Check3Pai(m_MyPAIVec[i][0],m_MyPAIVec[i][1],m_MyPAIVec[i][2]))return true; } } } } } return false; } //檢測是否胡小三元 bool CMJ::CheckX3Y_HU() { //東西南北四槓 if(m_GangPAIVec[0].size()==8) { if(m_MyPAIVec[0].size()==5) { if(Check5Pai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])) { return true; } else { return false; } } else if(m_MyPAIVec[0].size()==2) { //如果是將 if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])==false) { return false; } } else { return false; } return CheckHU(); } return false; } //檢測是否胡字一色 bool CMJ::CheckZ1S_HU() { //只准有字 if(m_MyPAIVec[2].size()>0)return false; if(m_MyPAIVec[3].size()>0)return false; if(m_MyPAIVec[4].size()>0)return false; if(m_MyPAIVec[5].size()>0)return false; if(m_ChiPAIVec[2].size()>0)return false; if(m_ChiPAIVec[3].size()>0)return false; if(m_ChiPAIVec[4].size()>0)return false; if(m_ChiPAIVec[5].size()>0)return false; if(m_PengPAIVec[2].size()>0)return false; if(m_PengPAIVec[3].size()>0)return false; if(m_PengPAIVec[4].size()>0)return false; if(m_PengPAIVec[5].size()>0)return false; if(m_GangPAIVec[2].size()>0)return false; if(m_GangPAIVec[3].size()>0)return false; if(m_GangPAIVec[4].size()>0)return false; if(m_GangPAIVec[5].size()>0)return false; int iSize = m_MyPAIVec[0].size(); if(iSize > 0) { if(iSize == 2) { if(m_MyPAIVec[0][0]==m_MyPAIVec[0][1]) { iSize = m_MyPAIVec[1].size(); if(iSize == 0)return true; if(iSize == 3) { if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2]))return true; } } } } return false; } //檢測是否四暗刻 bool CMJ::Check4AK_HU() { if(m_4AK) { //將牌 for(int i = 0 ; i < 6 ; i++ ) { if(m_MyPAIVec[i].size()==2) { //如果是將 if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1]) { return true; } } } } return false; } //檢測是否一色雙龍會 bool CMJ::Check1S2LH_HU() { //萬,條,餅 for(UINT i = 0 ; i <= 4; i++ ) { int iType = i; if(m_MyPAIVec[iType].size()==14) { if(m_MyPAIVec[iType][0]==1&&m_MyPAIVec[iType][1]==1) { } else { return false; } if(m_MyPAIVec[iType][2]==2&&m_MyPAIVec[iType][3]==2) { } else { return false; } if(m_MyPAIVec[iType][4]==3&&m_MyPAIVec[iType][5]==3) { } else { return false; } if(m_MyPAIVec[iType][6]==5&&m_MyPAIVec[iType][7]==5) { } else { return false; } if(m_MyPAIVec[iType][8]==7&&m_MyPAIVec[iType][9]==7) { } else { return false; } if(m_MyPAIVec[iType][10]==8&&m_MyPAIVec[iType][11]==8) { } else { return false; } if(m_MyPAIVec[iType][12]==9&&m_MyPAIVec[iType][13]==9) { } else { return false; } return true; } } return false; } //檢測是否一色四同順 bool CMJ::Check1S4TS_HU() { //萬,條,餅 for(UINT i = 0 ; i <= 4; i++ ) { int iType = i; //吃過的順 int iSize1 = m_ChiPAIVec[iType].size(); //剩余牌牆中的順 int iSize2 = m_MyPAIVec[iType].size(); //萬 if(iSize1 + iSize2 >= 12) { //無吃的順 if(iSize1==0) { if(iSize2==12) { //三連暗槓成順 if(CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11]))return CheckHU(); return false; } if(iSize2==14) { //三連暗槓成順 if((m_MyPAIVec[iType][12]==(m_MyPAIVec[iType][13]))&&CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11]))return true; //三連暗槓成順 if((m_MyPAIVec[iType][0]==(m_MyPAIVec[iType][1]))&&CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13]))return true; return false; } } //吃到一個順 if(iSize1==3) { if(iSize2==9) { //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { return CheckHU(); } } return false; } if(iSize2==11) { //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])) { if(m_MyPAIVec[iType][9]==m_MyPAIVec[iType][10]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { return true; } } //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])) { if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][8]) { return true; } } return false; } } //吃到二個順 if(iSize1==6) { if(iSize2==6) { //三連對 if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4]) { return CheckHU(); } } } return false; } if(iSize2==8) { //三連對 if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])) { if(m_MyPAIVec[iType][6]==m_MyPAIVec[iType][7]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4]) { return true; } } } //三連對 if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])) { if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][6]) { return true; } } } return false; } } //吃到三個順 if(iSize1==9) { if(iSize2==3) { //順子 if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][2]) { return CheckHU(); } } } } return false; } if(iSize2==5) { //順子 if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])) { if(m_MyPAIVec[iType][3]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][2]) { return true; } } } } //順子 if(CheckABCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])) { if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][4]) { return true; } } } } return false; } } //吃到三連順 if(iSize1==12) { if((m_ChiPAIVec[iType][0]==m_ChiPAIVec[iType][3])&&(m_ChiPAIVec[iType][3]==m_ChiPAIVec[iType][6])&&(m_ChiPAIVec[iType][6]==m_ChiPAIVec[iType][9])) { return CheckHU(); } return false; } } } return false; } //檢測是否一色四節高 bool CMJ::Check1S4JG_HU() { //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++) { int iType = i; if(m_GangPAIVec[iType].size()==16) { if((m_GangPAIVec[iType][0]==m_GangPAIVec[iType][4]-1)&&(m_GangPAIVec[iType][4]==m_GangPAIVec[iType][8]-1)&&(m_GangPAIVec[iType][8]==m_GangPAIVec[iType][12]-1)) { return CheckHU(); } } } return false; } //檢測是否一色四步高 bool CMJ::Check1S4BG_HU() { /*//萬 if(m_GangPAIVec[2].size()==16) { if((m_GangPAIVec[2][0]==m_GangPAIVec[2][4]-1)&&(m_GangPAIVec[2][4]==m_GangPAIVec[2][8]-1)&&(m_GangPAIVec[2][8]==m_GangPAIVec[2][12]-1)) { return CheckHU(); } }*/ return false; } //檢測是否三槓 bool CMJ::Check3Gang_HU() { int iSize = 0; for(UINT i = 0 ; i < 6 ; i++ ) { iSize = m_GangPAIVec[i].size(); } if(iSize == 12) { //將牌 return CheckHU(); } return false; } //檢測是否混幺九 bool CMJ::CheckHY9_HU() { return false; } //檢測是否七對 bool CMJ::Check7D_HU() { int iDoubleNum = 0 ; for(UINT i = 0 ; i < 6 ; i++ ) { UINT iSize = m_MyPAIVec[i].size(); if(iSize%2 ==1||iSize==0)return false;//如果是奇數肯定不是對 for(UINT j = 0 ; j < iSize-1 ; j++) { if(m_MyPAIVec[i][j]==m_MyPAIVec[i][j+1]) { iDoubleNum++; j++; } } } if(iDoubleNum==7)return true; return false; } //檢測是否七星不靠 bool CMJ::Check7XBK_HU() { bool bIs7XBK[14] ; for(UINT i = 0 ; i < 14 ; i++ ) { bIs7XBK[i]=false; } //中發白 vector<int>::iterator Iter; if(m_MyPAIVec[0].size()!=3)return false; for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ ) { if((*Iter)==1) { bIs7XBK[7]=true; } if((*Iter)==2) { bIs7XBK[8]=true; } if((*Iter)==3) { bIs7XBK[9]=true; } } //東南西北風 if(m_MyPAIVec[1].size()!=4)return false; for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ ) { if((*Iter)==1) { bIs7XBK[10]=true; } if((*Iter)==2) { bIs7XBK[11]=true; } if((*Iter)==3) { bIs7XBK[12]=true; } if((*Iter)==4) { bIs7XBK[13]=true; } } //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++) { if(m_MyPAIVec[i].size()==3) { if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==4&&m_MyPAIVec[i][2]==7) { bIs7XBK[0]=true; bIs7XBK[3]=true; bIs7XBK[6]=true; } } else if(m_MyPAIVec[2].size()==2) { if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==5) { bIs7XBK[1]=true; bIs7XBK[4]=true; } else if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6) { bIs7XBK[2]=true; bIs7XBK[5]=true; } } else { return false; } } bool t_Result = true; for(UINT i = 0 ; i < 14 ; i++ ) { if(bIs7XBK[i]==false)t_Result=false; } if(t_Result)return true; for(UINT i = 2 ; i <= 4 ; i++) { if(m_MyPAIVec[i].size()==3) { if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==5&&m_MyPAIVec[i][2]==8) { bIs7XBK[0]=true; bIs7XBK[3]=true; bIs7XBK[6]=true; } } else if(m_MyPAIVec[2].size()==2) { if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6) { bIs7XBK[1]=true; bIs7XBK[4]=true; } else if(m_MyPAIVec[i][0]==4&&m_MyPAIVec[i][1]==7) { bIs7XBK[2]=true; bIs7XBK[5]=true; } } else { return false; } } t_Result = true; for(UINT i = 0 ; i < 14 ; i++ ) { if(bIs7XBK[i]==false)t_Result=false; } if(t_Result)return true; for(UINT i = 2 ; i <= 4 ; i++) { if(m_MyPAIVec[i].size()==3) { if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6&&m_MyPAIVec[i][2]==9) { bIs7XBK[0]=true; bIs7XBK[3]=true; bIs7XBK[6]=true; } } else if(m_MyPAIVec[2].size()==2) { if(m_MyPAIVec[i][0]==4&&m_MyPAIVec[i][1]==7) { bIs7XBK[1]=true; bIs7XBK[4]=true; } else if(m_MyPAIVec[i][0]==5&&m_MyPAIVec[i][1]==8) { bIs7XBK[2]=true; bIs7XBK[5]=true; } } else { return false; } } t_Result = true; for(UINT i = 0 ; i < 14 ; i++ ) { if(bIs7XBK[i]==false)t_Result=false; } if(t_Result)return true; return false; } //檢測是否全雙刻 bool CMJ::CheckQSK_HU() { //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++) { int iType = i; if(m_GangPAIVec[iType].size()==16) { if(m_GangPAIVec[iType][0]==2&&m_GangPAIVec[iType][4]==4&&m_GangPAIVec[iType][8]==6&&m_GangPAIVec[iType][12]==8) { return CheckHU(); } } } return false; } //清一色 bool CMJ::CheckQ1S_HU() { if(m_MyPAIVec[0].empty()==false)return false; if(m_MyPAIVec[1].empty()==false)return false; if(m_ChiPAIVec[0].empty()==false)return false; if(m_ChiPAIVec[1].empty()==false)return false; if(m_PengPAIVec[0].empty()==false)return false; if(m_PengPAIVec[1].empty()==false)return false; if(m_GangPAIVec[0].empty()==false)return false; if(m_GangPAIVec[1].empty()==false)return false; //清萬 if(m_MyPAIVec[2].empty()==false) { if(m_MyPAIVec[3].empty()==false)return false; if(m_MyPAIVec[4].empty()==false)return false; if(m_ChiPAIVec[3].empty()==false)return false; if(m_ChiPAIVec[4].empty()==false)return false; if(m_PengPAIVec[3].empty()==false)return false; if(m_PengPAIVec[4].empty()==false)return false; if(m_GangPAIVec[3].empty()==false)return false; if(m_GangPAIVec[4].empty()==false)return false; return CheckHU(); } //清條 if(m_MyPAIVec[3].empty()==false) { if(m_MyPAIVec[2].empty()==false)return false; if(m_MyPAIVec[4].empty()==false)return false; if(m_ChiPAIVec[2].empty()==false)return false; if(m_ChiPAIVec[4].empty()==false)return false; if(m_PengPAIVec[2].empty()==false)return false; if(m_PengPAIVec[4].empty()==false)return false; if(m_GangPAIVec[2].empty()==false)return false; if(m_GangPAIVec[4].empty()==false)return false; return CheckHU(); } //清餅 if(m_MyPAIVec[4].empty()==false) { if(m_MyPAIVec[2].empty()==false)return false; if(m_MyPAIVec[3].empty()==false)return false; if(m_ChiPAIVec[2].empty()==false)return false; if(m_ChiPAIVec[3].empty()==false)return false; if(m_PengPAIVec[2].empty()==false)return false; if(m_PengPAIVec[3].empty()==false)return false; if(m_GangPAIVec[2].empty()==false)return false; if(m_GangPAIVec[3].empty()==false)return false; return CheckHU(); } return false; } //檢測是否一色三同順 bool CMJ::Check1S3TS_HU() { //萬條餅 for(UINT i = 2 ; i <= 4 ; i++ ) { int iType = i; //吃過的順 int iSize1 = m_ChiPAIVec[iType].size(); //剩余牌牆中的順 int iSize2 = m_MyPAIVec[iType].size(); if(iSize1 + iSize2 >= 9) { //無吃的順 if(iSize1==0) { if(iSize2==9) { //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])) { return CheckHU(); } return false; } if(iSize2==11) { //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&CheckAAPai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])) { return true; } //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])) { return true; } return false; } if(iSize2==12) { //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check3Pai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11])) { return CheckHU(); } //三連高壓 if(CheckAAABBBCCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11])&&Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])) { return CheckHU(); } return false; } if(iSize2==14) { //三連順(前) if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check5Pai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13])) { return true; } //三連順(中) if(CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])&&CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&Check3Pai(m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13])) { return true; } //三連順(中) if(Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAAABBBCCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11])&&CheckAAPai(m_MyPAIVec[iType][12],m_MyPAIVec[iType][13])) { return true; } //三連順(後) if(CheckAAABBBCCCPai(m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13])&&Check5Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])) { return true; } return false; } } //吃到一個順 if(iSize1==3) { if(iSize2==6) { //三連對 if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2]) { return CheckHU(); } } } if(iSize2==8) { //三連對(前) if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&CheckAAPai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { return true; } } //三連對(後) if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { return true; } } } if(iSize2==9) { //三連對(前) if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&Check3Pai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { return CheckHU(); } } //三連對(後) if(CheckAABBCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][7]) { return CheckHU(); } } } if(iSize2==11) { //三連對(前) if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&Check5Pai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { return true; } } //三連對(中) if(CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])&&CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&Check3Pai(m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { return true; } } //三連對(中) if(Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAABBCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&CheckAAPai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][7]) { return true; } } //三連對(前) if(CheckAABBCCPai(m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&Check5Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][7]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][9]) { return true; } } } } //吃到二個順 if(iSize1==6) { if(iSize2==3) { //順子 if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2]) { return CheckHU(); } } } } if(iSize2==5) { //順子(前) if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAAPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2]) { return true; } } } //順子(後) if(CheckABCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4]) { return true; } } } } if(iSize2==6) { //三連對 if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][5]) { return CheckHU(); } } } } if(iSize2==8) { //三連對(前) if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&CheckAAPai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][5]) { return true; } } } //三連對(後) if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])) { if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6]) { if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][7]) { return true; } } } } } //吃到三個順 if(iSize1==9) { if((m_ChiPAIVec[2][0]==m_ChiPAIVec[iType][3])&&(m_ChiPAIVec[iType][3]==m_ChiPAIVec[iType][6])) { return CheckHU(); } } } } return false; } //檢測是否一色三節高 bool CMJ::Check1S3JG_HU() { //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++) { int iType = i; if(m_GangPAIVec[iType].size()==12) { if((m_GangPAIVec[iType][0]==m_GangPAIVec[iType][4]-1)&&(m_GangPAIVec[iType][4]==m_GangPAIVec[iType][8]-1)) { return CheckHU(); } } } return false; } //檢測是否全大 bool CMJ::CheckQD_HU() { //劍牌,風牌 if(m_MyPAIVec[0].empty()==false)return false; if(m_MyPAIVec[1].empty()==false)return false; if(m_ChiPAIVec[0].empty()==false)return false; if(m_ChiPAIVec[1].empty()==false)return false; if(m_PengPAIVec[0].empty()==false)return false; if(m_PengPAIVec[1].empty()==false)return false; if(m_GangPAIVec[0].empty()==false)return false; if(m_GangPAIVec[1].empty()==false)return false; //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++ ) { if(m_MyPAIVec[i].empty()==false) { //剩余牌牆 int iSize = m_MyPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_MyPAIVec[i][j]<7)return false; } //吃 iSize = m_ChiPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_ChiPAIVec[i][j]<7)return false; } //碰 iSize = m_PengPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_PengPAIVec[i][j]<7)return false; } //槓 iSize = m_GangPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_GangPAIVec[i][j]<7)return false; } } } return CheckHU(); } //檢測是否全中 bool CMJ::CheckQZ_HU() { //劍牌,風牌 if(m_MyPAIVec[0].empty()==false)return false; if(m_MyPAIVec[1].empty()==false)return false; if(m_ChiPAIVec[0].empty()==false)return false; if(m_ChiPAIVec[1].empty()==false)return false; if(m_PengPAIVec[0].empty()==false)return false; if(m_PengPAIVec[1].empty()==false)return false; if(m_GangPAIVec[0].empty()==false)return false; if(m_GangPAIVec[1].empty()==false)return false; //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++ ) { if(m_MyPAIVec[i].empty()==false) { //剩余牌牆 int iSize = m_MyPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_MyPAIVec[i][j]<4)return false; if(m_MyPAIVec[i][j]>6)return false; } //吃 iSize = m_ChiPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_ChiPAIVec[i][j]<4)return false; if(m_ChiPAIVec[i][j]>6)return false; } //碰 iSize = m_PengPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_PengPAIVec[i][j]<4)return false; if(m_PengPAIVec[i][j]>6)return false; } //槓 iSize = m_GangPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_GangPAIVec[i][j]<4)return false; if(m_GangPAIVec[i][j]>6)return false; } } } return CheckHU(); } //檢測是否全小 bool CMJ::CheckQX_HU() { //劍牌,風牌 if(m_MyPAIVec[0].empty()==false)return false; if(m_MyPAIVec[1].empty()==false)return false; if(m_ChiPAIVec[0].empty()==false)return false; if(m_ChiPAIVec[1].empty()==false)return false; if(m_PengPAIVec[0].empty()==false)return false; if(m_PengPAIVec[1].empty()==false)return false; if(m_GangPAIVec[0].empty()==false)return false; if(m_GangPAIVec[1].empty()==false)return false; //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++ ) { if(m_MyPAIVec[i].empty()==false) { //剩余牌牆 int iSize = m_MyPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_MyPAIVec[i][j]>3)return false; } //吃 iSize = m_ChiPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_ChiPAIVec[i][j]>3)return false; } //碰 iSize = m_PengPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_PengPAIVec[i][j]>3)return false; } //槓 iSize = m_GangPAIVec[i].size(); for( UINT j = 0 ; j < iSize ; j++ ) { if(m_GangPAIVec[i][j]>3)return false; } } } return CheckHU(); } //檢測是否青龍 bool CMJ::CheckQL_HU() { //花色 int iColorNum = 0; //萬,條,餅 for(UINT i = 2 ; i <= 4 ; i++ ) { if(m_MyPAIVec[i].empty()==false) { iColorNum++; if(m_MyPAIVec[i].size()==9) { for(UINT j = 0 ;j < 9 ;j++) { if(m_MyPAIVec[i][j] != j)return false; } } } } if(iColorNum==1)return CheckHU(); return false; } //檢測是否三色雙龍會 bool CMJ::Check3S2LH_HU() { //五萬為雙龍 if(m_MyPAIVec[2].size()==2) { //雙龍 if(m_MyPAIVec[2][0]==5&&m_MyPAIVec[2][1]==5) { //老少副 if(m_MyPAIVec[3].size()==6&&m_MyPAIVec[4].size()==6) { if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==2&&m_MyPAIVec[3][2]==3&&m_MyPAIVec[3][3]==7&&m_MyPAIVec[3][4]==8&&m_MyPAIVec[3][5]==9) { if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==2&&m_MyPAIVec[4][2]==3&&m_MyPAIVec[4][3]==7&&m_MyPAIVec[4][4]==8&&m_MyPAIVec[4][5]==9) { return true; } } } } } //五條為雙龍 if(m_MyPAIVec[3].size()==2) { //雙龍 if(m_MyPAIVec[3][0]==5&&m_MyPAIVec[3][1]==5) { //老少副 if(m_MyPAIVec[2].size()==6&&m_MyPAIVec[4].size()==6) { if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==2&&m_MyPAIVec[2][2]==3&&m_MyPAIVec[2][3]==7&&m_MyPAIVec[2][4]==8&&m_MyPAIVec[2][5]==9) { if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==2&&m_MyPAIVec[4][2]==3&&m_MyPAIVec[4][3]==7&&m_MyPAIVec[4][4]==8&&m_MyPAIVec[4][5]==9) { return true; } } } } } //五餅為雙龍 if(m_MyPAIVec[4].size()==2) { //雙龍 if(m_MyPAIVec[4][0]==5&&m_MyPAIVec[4][1]==5) { //老少副 if(m_MyPAIVec[2].size()==6&&m_MyPAIVec[3].size()==6) { if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==2&&m_MyPAIVec[2][2]==3&&m_MyPAIVec[2][3]==7&&m_MyPAIVec[2][4]==8&&m_MyPAIVec[2][5]==9) { if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==2&&m_MyPAIVec[3][2]==3&&m_MyPAIVec[3][3]==7&&m_MyPAIVec[3][4]==8&&m_MyPAIVec[3][5]==9) { return true; } } } } } return false; } //檢測是否一色三步高 bool CMJ::Check1S3BG_HU() { return false; } //全帶五 bool CMJ::CheckQD5_HU() { //劍牌,風牌 if(m_MyPAIVec[0].empty()==false)return false; if(m_MyPAIVec[1].empty()==false)return false; if(m_ChiPAIVec[0].empty()==false)return false; if(m_ChiPAIVec[1].empty()==false)return false; if(m_PengPAIVec[0].empty()==false)return false; if(m_PengPAIVec[1].empty()==false)return false; if(m_GangPAIVec[0].empty()==false)return false; if(m_GangPAIVec[1].empty()==false)return false; return false; } //三同刻 bool CMJ::Check3TK_HU() { /*if(m_GangPAIVec[2].size()==4) { //萬,條,餅 for(UINT i = 3 ; i <= 4 ; i++ ) { if(m_GangPAIVec[i].size()==4) { if(m_GangPAIVec[2][0]!=m_GangPAIVec[i][0]) { return false; } } } }*/ return false; } //三暗刻 bool CMJ::Check3AK_HU() { return false; } //單釣將 bool CMJ::CheckDDJ_HU() { int count = 0; for(UINT i = 0 ; i < 6 ; i++ ) { count += m_MyPAIVec[i].size(); } if(count==2) { if(m_MyPAIVec[m_LastPAI.m_Type].size()==2) { if(m_MyPAIVec[m_LastPAI.m_Type][0]==m_MyPAIVec[m_LastPAI.m_Type][1])return true; } } return false; } //檢測是否聽十三幺 bool CMJ::Check13Y_TING() { bool i13YSize[13] ; for(UINT i = 0 ; i < 13 ; i++ ) { i13YSize[i]=false; } //中發白 vector<int>::iterator Iter; for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ ) { if((*Iter)==1) { i13YSize[0]=true; } if((*Iter)==2) { i13YSize[1]=true; } if((*Iter)==3) { i13YSize[2]=true; } } //東南西北風 for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ ) { if((*Iter)==1) { i13YSize[3]=true; } if((*Iter)==2) { i13YSize[4]=true; } if((*Iter)==3) { i13YSize[5]=true; } if((*Iter)==4) { i13YSize[6]=true; } } //一九萬 for(Iter = m_MyPAIVec[2].begin();Iter != m_MyPAIVec[2].end(); Iter++ ) { if((*Iter)==1) { i13YSize[7]=true; } if((*Iter)==9) { i13YSize[8]=true; } } //一九條 for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end(); Iter++ ) { if((*Iter)==1) { i13YSize[9]=true; } if((*Iter)==9) { i13YSize[10]=true; } } //一九餅 for(Iter = m_MyPAIVec[4].begin();Iter != m_MyPAIVec[4].end(); Iter++ ) { if((*Iter)==1) { i13YSize[11]=true; } if((*Iter)==9) { i13YSize[12]=true; } } int icount = 0; for(UINT i = 0 ; i < 13 ; i++ ) { if(i13YSize[i]==true) { icount++; } } if(icount >=12)return true; return false; } //檢測是否聽四暗刻 bool CMJ::Check4AK_TING() { if(m_AKNum==4)return true; return false; } //檢測胡 bool CMJ::CheckHU() { bool t_Ok = false; int iJiangNum = 0; int iSize = m_MyPAIVec[0].size(); if(iSize>0) { //中發白 if(iSize==2) { if(!CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])) { return false; } else { iJiangNum++ ; } } else if(iSize==3) { if(!CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])) { return false; } } else if(iSize==5) { if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4])) { iJiangNum++ ; } else { return false; } } else if(iSize==8) { if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7])) { iJiangNum++ ; } else { return false; } } else if(iSize==11) { if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7],m_MyPAIVec[0][8])&&CheckAAPai(m_MyPAIVec[0][9],m_MyPAIVec[0][10])) { iJiangNum++ ; } else { return false; } } else { return false; } } //東南西北 iSize = m_MyPAIVec[1].size(); if(iSize>0) { if(iSize==2) { if(!CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])) { return false; } else { iJiangNum++ ; } } else if(iSize==3) { if(!CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])) { return false; } } else if(iSize==5) { if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4])) { iJiangNum++ ; } else { return false; } } else if(iSize==8) { if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7])) { iJiangNum++ ; } else { return false; } } else if(iSize==11) { if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10])) { iJiangNum++ ; } else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7],m_MyPAIVec[1][8])&&CheckAAPai(m_MyPAIVec[1][9],m_MyPAIVec[1][10])) { iJiangNum++ ; } else { return false; } } else { return false; } } //萬 iSize = m_MyPAIVec[2].size(); if(iSize>0) { if(iSize==2) { if(!CheckAAPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1])) { return false; } else { iJiangNum++ ; } } else if(iSize==3) { if(!CheckAAAPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2])) { if(!CheckABCPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2])) { return false; } } } else if(iSize==5) { if(!Check5Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4])) { return false; } else { iJiangNum++ ; } } else if(iSize==6) { if(!Check6Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5])) { return false; } } else if(iSize==8) { if(!Check8Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7])) { return false; } else { iJiangNum++ ; } } else if(iSize==9) { if(!Check9Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8])) { return false; } } else if(iSize==11) { if(!Check11Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10])) { return false; } else { iJiangNum++ ; } } else if(iSize==12) { if(!Check12Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10],m_MyPAIVec[2][11])) { return false; } } else if(iSize==14) { if(!Check14Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10],m_MyPAIVec[2][11],m_MyPAIVec[2][12],m_MyPAIVec[2][13])) { return false; } else { iJiangNum++ ; } } else { return false; } } //條 iSize = m_MyPAIVec[3].size(); if(iSize>0) { if(iSize==2) { if(!CheckAAPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1])) { return false; } else { iJiangNum++ ; } } else if(iSize==3) { if(!CheckAAAPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2])) { if(!CheckABCPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2])) { return false; } } } else if(iSize==5) { if(!Check5Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4])) { return false; } else { iJiangNum++ ; } } else if(iSize==6) { if(!Check6Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5])) { return false; } } else if(iSize==8) { if(!Check8Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7])) { return false; } else { iJiangNum++ ; } } else if(iSize==9) { if(!Check9Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8])) { return false; } } else if(iSize==11) { if(!Check11Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10])) { return false; } else { iJiangNum++ ; } } else if(iSize==12) { if(!Check12Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11])) { return false; } } else if(iSize==14) { if(!Check14Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11],m_MyPAIVec[3][12],m_MyPAIVec[3][13])) { return false; } else { iJiangNum++ ; } } else { return false; } } //餅 iSize = m_MyPAIVec[4].size(); if(iSize>0) { if(iSize==2) { if(!CheckAAPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1])) { return false; } else { iJiangNum++ ; } } else if(iSize==3) { if(!CheckAAAPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2])) { if(!CheckABCPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2])) { return false; } } } else if(iSize==5) { if(!Check5Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4])) { return false; } else { iJiangNum++ ; } } else if(iSize==6) { if(!Check6Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5])) { return false; } } else if(iSize==8) { if(!Check8Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7])) { return false; } else { iJiangNum++ ; } } else if(iSize==9) { if(!Check9Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8])) { return false; } } else if(iSize==11) { if(!Check11Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10])) { return false; } else { iJiangNum++ ; } } else if(iSize==12) { if(!Check12Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10],m_MyPAIVec[4][11])) { return false; } } else if(iSize==14) { if(!Check14Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10],m_MyPAIVec[4][11],m_MyPAIVec[4][12],m_MyPAIVec[4][13])) { return false; } else { iJiangNum++ ; } } else { return false; } } if(iJiangNum==1)return true; return false; } //檢測聽 bool CMJ::CheckTING() { //劍牌 for(UINT j = 0 ; j < 9 ;j++ ) { //起牌 AddPai(0,j+1); if(CheckAllPai(MJPAI_GETPAI)) { int iPaiIndex = GetPaiIndex(0,j+1); DelPai(iPaiIndex); return true; } else { int iPaiIndex = GetPaiIndex(0,j+1); DelPai(iPaiIndex); } } //風牌 for(UINT j = 0 ; j < 9 ;j++ ) { //起牌 AddPai(1,j+1); if(CheckAllPai(MJPAI_GETPAI)) { int iPaiIndex = GetPaiIndex(1,j+1); DelPai(iPaiIndex); return true; } else { int iPaiIndex = GetPaiIndex(1,j+1); DelPai(iPaiIndex); } } for(UINT i = 2 ; i < 5 ;i++ ) { for(UINT j = 0 ; j < 9 ;j++ ) { //起牌 AddPai(i,j+1); if(CheckAllPai(MJPAI_GETPAI)) { int iPaiIndex = GetPaiIndex(i,j+1); DelPai(iPaiIndex); return true; } else { int iPaiIndex = GetPaiIndex(i,j+1); DelPai(iPaiIndex); } } } return false; }
怎麼樣,代碼寫的還算清晰吧。喝口水,休息一下,再看一下CMJManage類的實現:
#ifndef _CMJMANAGE_H #define _CMJMANAGE_H #include "CMJ.h" //剩余牌牆信息 //擴展 struct stPAIEx { stPAI m_NewPai; //起的新牌 int m_PaiNum; //剩余牌數 bool m_IsHZ; //是否黃莊 } ; //麻將管理器 class CMJManage { vector<stPAI> m_MJVec; //麻將數據VEC int m_HZPaiNum; //黃莊的牌數 public: //構造函數 CMJManage(); //析構函數 ~CMJManage(); //初始化牌 void InitPai(int p_HZPaiNum = 0); //起牌 stPAIEx GetAPai(); private: //洗牌 void XiPai(); } ; #endif
對應CPP:
#include "CMJManage.h" //構造函數 CMJManage::CMJManage() { m_HZPaiNum = 0; } //析構函數 CMJManage::~CMJManage() { } //初始化牌 void CMJManage::InitPai(int p_HZPaiNum) { m_HZPaiNum = p_HZPaiNum; m_MJVec.clear(); //中發白 for(UINT i = 1 ; i <= 3 ; i++) { stPAI t_Pai; t_Pai.m_Type = 0; t_Pai.m_Value = i; m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); } //東南西北 for(UINT i = 1 ; i <= 4 ; i++) { stPAI t_Pai; t_Pai.m_Type = 1; t_Pai.m_Value = i; m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); } //萬 for(UINT i = 1 ; i <= 9 ; i++) { stPAI t_Pai; t_Pai.m_Type = 2; t_Pai.m_Value = i; m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); } //條 for(UINT i = 1 ; i <= 9 ; i++) { stPAI t_Pai; t_Pai.m_Type = 3; t_Pai.m_Value = i; m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); } //餅 for(UINT i = 1 ; i <= 9 ; i++) { stPAI t_Pai; t_Pai.m_Type = 4; t_Pai.m_Value = i; m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); m_MJVec.push_back(t_Pai); } XiPai(); } //洗牌 void CMJManage::XiPai() { srand( GetTickCount() ); random_shuffle(m_MJVec.begin(),m_MJVec.end()); } //起牌 stPAIEx CMJManage::GetAPai() { //如果所有牌都起完了 stPAIEx t_Pai; t_Pai.m_NewPai.m_Type = m_MJVec.back().m_Type; t_Pai.m_NewPai.m_Value = m_MJVec.back().m_Value; t_Pai.m_PaiNum = m_MJVec.size()-1; if(t_Pai.m_PaiNum ==m_HZPaiNum) { t_Pai.m_IsHZ = true; } else { t_Pai.m_IsHZ = false; } //扔去一個 m_MJVec.pop_back(); return t_Pai; }
看,洗牌發牌類也搞定了,下面我們來將其在控制台上運行起來,打開控制台的main函數。
#include "AI\\CMJ.h" #include "AI\\CMJManage.h" #include <windows.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //其它三個玩家 CMJ t_OtherPlayer[3]; //我 CMJ t_MyPlayer; //洗牌器 CMJManage t_MJManage; //分數 int t_Score = 0; GameStart: //初始化及洗牌 t_MJManage.InitPai();//初始化 t_MyPlayer.CleanUp(); for(UINT i = 0 ; i < 3; i++ ) { t_OtherPlayer[i].CleanUp(); } cout<<"洗牌完成"<<endl; cout<<"起牌:========================================================"<<endl; for(UINT i = 0 ; i < 13 ; i++) { stPAIEx t_Pai = t_MJManage.GetAPai(); t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); for(UINT j = 0 ; j < 3; j++ ) { stPAIEx t_Pai2 = t_MJManage.GetAPai(); t_OtherPlayer[j].AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); } } t_MyPlayer.Init(); for(UINT j = 0 ; j < 3; j++ ) { t_OtherPlayer[j].Init(); } //打牌循環 bool t_Finish = false; bool t_Ting = false; while(t_Finish == false) { t_MyPlayer.PrintAllPai(); cout<<endl; cout<<"起牌:========================================================"<<endl; stPAIEx t_Pai = t_MJManage.GetAPai(); //刷新我方牌牆 t_MyPlayer.PrintPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); cout<<endl; //如果沒有聽頭 if(t_Ting == false) { cout<<"要還是打?Y/N"; char t_Result; cin>>t_Result; if(t_Result =='Y'||t_Result=='y') { //起牌 t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); //起牌後胡牌判斷 t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI); if(t_Finish) { printf("胡啦!!!:%s-%d",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue); ::_sleep(1000); } else { if(t_Pai.m_NewPai.m_Type == -1)//如果起牌數已達到上限 { cout<<endl; cout<<"黃莊了!!!!!!!!!!!!!"<<endl; break; } t_MyPlayer.PrintAllPai(); cout<<endl; OUTPai: cout<<"請打牌(輸入牌序號)"; int PaiIndex; cin>>PaiIndex; if(t_MyPlayer.DelPai(PaiIndex)==false) { cout<<"沒有此牌"<<endl; goto OUTPai; } //==============================牌面刷新================================================ cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== //======================包聽======================================================== if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI)) { char t_BTing; cout<<"要包聽嗎?:(Y/N)"; cin>>t_BTing; if(t_BTing=='y'||t_BTing=='Y') { t_Ting = true; } } //============================================================================== } } else { //======================包聽======================================================== if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI)) { char t_BTing; cout<<"要包聽嗎?:(Y/N)"; cin>>t_BTing; if(t_BTing=='y'||t_BTing=='Y') { t_Ting = true; } } //============================================================================== } } else { t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); //起牌 int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); if(iPaiIndex>=0) { //起牌後胡牌判斷 t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI); if(t_Finish) { cout<<endl; printf("胡啦!!!:%s-合計%d番",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue); t_Score += t_MyPlayer.GetInfo()->m_GoodValue; ::_sleep(1000); break; } else { t_MyPlayer.DelPai(iPaiIndex); cout<<"打牌"; t_MyPlayer.PrintPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value); cout<<endl; ::_sleep(1000); } } else { cout<<"程序出錯!"<<endl; } } cout<<endl; //其它玩家起牌出牌 for(UINT j = 0 ; j < 3; j++ ) { stPAIEx t_Pai2 = t_MJManage.GetAPai(); if(j==0) { cout<<"南家起牌出牌:"; t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); cout<<endl; ::_sleep(1000); } if(j==1) { cout<<"西家起牌出牌:"; t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); cout<<endl; ::_sleep(1000); } if(j==2) { cout<<"北家起牌出牌:"; t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); cout<<endl; ::_sleep(1000); } char t_Result; if(t_Ting == false) { if(t_Pai2.m_IsHZ)//如果起牌數已達到上限 { cout<<endl; cout<<"黃莊了!!!!!!!!!!!!!"<<endl; t_Finish = true; break; } bool t_Check = false; //檢查吃牌 if(t_MyPlayer.CheckChiPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value)) { if(t_Check==false) { cout<<"請選擇:"; } cout<<"(吃)"; t_Check = true; } //檢查碰牌 if(t_MyPlayer.CheckPengPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value)) { if(t_Check==false) { cout<<"請選擇:"; } cout<<"(碰)"; t_Check = true; } //檢查槓牌 if(t_MyPlayer.CheckGangPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value)) { if(t_Check==false) { cout<<"請選擇:"; } cout<<"(槓)"; t_Check = true; } //起牌 t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); //起牌後胡牌判斷 if(t_MyPlayer.CheckAllPai(MJPAI_GETPAI)) { if(t_Check==false) { cout<<"請選擇:"; } cout<<"(胡)"; t_Check = true; } int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); t_MyPlayer.DelPai(iPaiIndex); //如果查到 if(t_Check) { cout<<endl; cin>>t_Result; } else { //返回循環 continue; } } else { t_Result = '4'; } //吃牌 if(t_Result =='1') { t_MyPlayer.PrintChiChosePai(); int index = 0; //如果吃牌組合大於 if(t_MyPlayer.GetChiChoseNum()>1) { cout<<"請輸入組合號:"<<endl; cin>>index; } t_MyPlayer.DoChiPai(index,t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); //============================================================================== cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //==============================================================================
OUTPai2: cout<<"請打牌(輸入牌序號)"; int PaiIndex; cin>>PaiIndex; if(t_MyPlayer.DelPai(PaiIndex)==false) { cout<<"沒有此牌"<<endl; goto OUTPai2; } //=================================牌面刷新============================================= cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== //======================包聽======================================================== if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI)) { char t_BTing; cout<<"要包聽嗎?:(Y/N)"; cin>>t_BTing; if(t_BTing=='y'||t_BTing=='Y') { t_Ting = true; } } //============================================================================== //該我下家 j = -1; } else if(t_Result =='2')//碰牌 { t_MyPlayer.PrintPengChosePai(); t_MyPlayer.DoPengPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); //============================================================================== cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== OUTPai3: cout<<"請打牌(輸入牌序號)"; int PaiIndex; cin>>PaiIndex; if(t_MyPlayer.DelPai(PaiIndex)==false) { cout<<"沒有此牌"<<endl; goto OUTPai3; } //==========================牌面刷新==================================================== cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== //======================包聽======================================================== if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI)) { char t_BTing; cout<<"要包聽嗎?:(Y/N)"; cin>>t_BTing; if(t_BTing=='y'||t_BTing=='Y') { t_Ting = true; } } //============================================================================== j = -1; } else if(t_Result =='3')//槓牌 { t_MyPlayer.PrintGangChosePai(); t_MyPlayer.DoGangPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); cout<<"起槓底牌"<<endl; t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); //============================================================================== cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== stPAIEx t_Pai2 = t_MJManage.GetAPai(); //起牌後胡牌判斷 t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI); if(t_Finish) { cout<<"槓底花嗎?(Y/N)"<<endl; char t_Result; cin>>t_Result; if(t_Result =='Y'||t_Result=='y') { cout<<endl; printf("胡啦!!!:%s-%d",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue); t_Score += t_MyPlayer.GetInfo()->m_GoodValue; ::_sleep(1000); break; } } if(t_Pai2.m_IsHZ)//如果起牌數已達到上限 { cout<<"黃莊了!!!!!!!!!!!!!"<<endl; t_Finish = true; break; } OUTPai4: cout<<"請打牌(輸入牌序號)"; int PaiIndex; cin>>PaiIndex; if(t_MyPlayer.DelPai(PaiIndex)==false) { cout<<"沒有此牌"<<endl; goto OUTPai4; } //===========================牌面刷新=================================================== cout<<"牌面刷新============================"<<endl; t_MyPlayer.PrintAllPai(); cout<<endl; //============================================================================== //======================包聽======================================================== if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI)) { char t_BTing; cout<<"要包聽嗎?:(Y/N)"; cin>>t_BTing; if(t_BTing=='y'||t_BTing=='Y') { t_Ting = true; } } //============================================================================== //該我下家 j = -1; } else if(t_Result =='4')//胡牌 { //起牌 t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); //起牌後胡牌判斷 t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI); if(t_Finish) { printf("胡啦!!!:%s-合計%d番",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue); t_Score += t_MyPlayer.GetInfo()->m_GoodValue; ::_sleep(1000); break; } else { if(t_Pai2.m_IsHZ)//如果起牌數已達到上限 { cout<<"黃莊了!!!!!!!!!!!!!"<<endl; t_Finish = true; break; } //起牌 int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value); cout<<endl; t_MyPlayer.DelPai(iPaiIndex); } } } } cout<<"我的分數:"<<t_Score<<endl; ::_sleep(3000); goto GameStart;//重新開始一局 return 0; }
OK,麻將就這樣實現了,你可以將其任意修改一下變形成你喜歡的麻將游戲,我很開心這個代碼能再次煥發青春,在此謝謝你。
[db:作者簡介][db:原文翻譯及解析]