#include "StdAfx.h" #include "io.h" #include #include "GameLogic.h" ////////////////////////////////////////////////////////////////////////// //静态变量 //扑克数据 const BYTE CGameLogic::m_cbCardData[FULL_COUNT]= { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D, //方块 A - K 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D, //梅花 A - K 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, //红桃 A - K 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, //黑桃 A - K 0x4E,0x4F, }; //好牌数据 const BYTE CGameLogic::m_cbGoodcardData[GOOD_CARD_COUNT]= { 0x01,0x02,0x11,0x12,0x21,0x22,0x31,0x32,0x4E,0x4F, 0x07,0x08,0x09,0x17,0x18,0x19,0x27,0x28,0x29,0x37,0x38,0x39, 0x0A,0x0B,0x0C,0x0D,0x1A,0x1B,0x1C,0x1D,0x2A,0x2B,0x2C,0x2D,0x3A,0x3B,0x3C,0x3D }; //牌库数据 std::vector CGameLogic::m_vecLandCard; ////////////////////////////////////////////////////////////////////////// //构造函数 CGameLogic::CGameLogic() { } //析构函数 CGameLogic::~CGameLogic() { } //加载牌库数据 void CGameLogic::LoadLandCard() { m_vecLandCard.clear(); int ListCount = 0; BYTE cardbuffer[51] = {0}; if (m_vecLandCard.empty()) { std::ostringstream ostr; ostr.str(""); ostr << "randcard/1" << ".card"; std::ifstream ifs(ostr.str().c_str()); if (!ifs.is_open()) { //AfxMessageBox(TEXT("Small_Path 文件未找到"),MB_OK); return; } if (ifs.bad()) { //AfxMessageBox(TEXT("Small_Path is bad! "),MB_OK); return; } LandCardList LcardList; BYTE Allcard[FULL_COUNT] = {0}; int nX1[17] = {0}; CString strBuf; char szBuff[128] = {0}; while( !ifs.eof() ) { ZeroMemory(szBuff,sizeof(szBuff)); ifs.getline(szBuff,sizeof(szBuff)); if (strcmp(szBuff, "(end)")==0) { int count1 = (int)LcardList.vecLandListCard.size(); memset(cardbuffer,0,sizeof(cardbuffer)); for (int j=0;j cbCardCount) return false; //定义变量 BYTE cbDeleteCount=0, cbDeleteCard[FULL_COUNT]={0}; if (cbCardCount>CountArray(cbDeleteCard)) return false; CopyMemory(cbDeleteCard, cbCardData, cbCardCount*sizeof(cbCardData[0])); CString strErrorTip; //置零扑克 for (BYTE i=0; i 0) { //牌型判断 if (AnalyseResult.cbFourCount==1 && cbCardCount==4) { return CT_BOMB_CARD; } if (AnalyseResult.cbFourCount==1 && AnalyseResult.cbSingleCount==2 && cbCardCount==6) { return CT_FOUR_TAKE_ONE; } if (AnalyseResult.cbFourCount==1 && AnalyseResult.cbDoubleCount==1 && cbCardCount==6) { return CT_FOUR_TAKE_ONE; } if (AnalyseResult.cbFourCount==1 && AnalyseResult.cbDoubleCount==2 && cbCardCount==8) { return CT_FOUR_TAKE_TWO; } //分析含有炸弹飞机 if (AnalyseResult.cbThreeCount > 0) { if ((AnalyseResult.cbFourCount+AnalyseResult.cbThreeCount)*4 == cbCardCount) { BYTE cbAnalyCardData[MAX_COUNT]={0}, cbAnalyCardCount=0; //拷贝四张牌 for (int i=0; i 0) { //三条类型 if (AnalyseResult.cbThreeCount==1 && cbCardCount==3) { return CT_THREE; } //连牌判断 if (AnalyseResult.cbThreeCount > 1) { //变量定义 BYTE cbFirstCard = AnalyseResult.cbThreeCardData[0]; BYTE cbFirstLogicValue = GetCardLogicValue(cbFirstCard); BYTE cbStartIndex = 1; if (cbFirstLogicValue == 15) { cbFirstLogicValue = GetCardLogicValue(AnalyseResult.cbThreeCardData[cbStartIndex*3]); cbStartIndex = 2; } //连牌判断 BYTE cbThreeLength=1, cbMaxThreeLenght=1; for (; cbStartIndex cbMaxThreeLenght) { cbMaxThreeLenght = cbThreeLength; } } //特殊判断 if (cbMaxThreeLenght != AnalyseResult.cbThreeCount) { if (cbMaxThreeLenght==AnalyseResult.cbThreeCount-1 && cbMaxThreeLenght*4==cbCardCount) { return CT_THREE_TAKE_ONE; } return CT_ERROR; } } //牌形判断 if (AnalyseResult.cbThreeCount*3 == cbCardCount) { return CT_THREE_LINE; } if (AnalyseResult.cbThreeCount*4 == cbCardCount) { return CT_THREE_TAKE_ONE; } if (AnalyseResult.cbThreeCount*5==cbCardCount && AnalyseResult.cbDoubleCount==AnalyseResult.cbThreeCount) { return CT_THREE_TAKE_TWO; } return CT_ERROR; } //两张类型 if (AnalyseResult.cbDoubleCount >= 3) { //变量定义 BYTE cbFirstCard = AnalyseResult.cbDoubleCardData[0]; BYTE cbFirstLogicValue = GetCardLogicValue(cbFirstCard); //错误过虑 if (cbFirstLogicValue >= 15) { return CT_ERROR; } //连牌判断 for (BYTE i=1; i=5 && AnalyseResult.cbSingleCount==cbCardCount) { //变量定义 BYTE cbFirstCard = AnalyseResult.cbSingleCardData[0]; BYTE cbFirstLogicValue = GetCardLogicValue(cbFirstCard); //错误过虑 if (cbFirstLogicValue >= 15) { return CT_ERROR; } //连牌判断 for (BYTE i=1; icbCardCount) { ASSERT(0); return false; } //定义变量 BYTE cbDeleteCount=0, cbDeleteCard[MAX_COUNT]={0}; if (cbCardCount>CountArray(cbDeleteCard)) return false; CopyMemory(cbDeleteCard, cbCardData, cbCardCount*sizeof(BYTE)); //置零扑克 for (BYTE i=0; icbCardCount) return false; //定义变量 BYTE cbDeleteCount=0,cbDeletaCard[FULL_COUNT]={0}; if (cbCardCount>CountArray(cbDeletaCard)) return false; CopyMemory(cbDeletaCard, cbCardData, cbCardCount*sizeof(cbCardData[0])); //置零扑克 for (BYTE i=0; i1; i--) { cbPosition=BYTE(rand()%i); cbTemp=cbBufferData[i-1]; cbBufferData[i-1]=cbBufferData[cbPosition]; cbBufferData[cbPosition]=cbTemp; } return; } //牌型缓冲区 void CGameLogic::SortArrayBuffer( BYTE cbBufferData[], BYTE cbBufferCount ) { bool bSorted = true; BYTE cbTemp=0, cbLast=cbBufferCount-1; do { bSorted = true; for (BYTE i=0; icbBufferData[i+1]) { cbTemp = cbBufferData[i]; cbBufferData[i] = cbBufferData[i+1]; cbBufferData[i+1] = cbTemp; bSorted = false; } } cbLast--; } while(bSorted==false); } //有效判断 bool CGameLogic::IsValidCard( BYTE cbCardData ) { //获取属性 BYTE cbCardColor = GetCardColor(cbCardData); BYTE cbCardValue = GetCardValue(cbCardData); //有效判断 if (cbCardData==0x4E || cbCardData==0x4F) { return true; } if (cbCardColor<=0x30 && cbCardValue>=0x01 && cbCardValue<=0x0D) { return true; } return false; } //有效判断 bool CGameLogic::IsValidCount( BYTE cbCardCount ) { if (cbCardCount>0 && cbCardCount<=MAX_COUNT) { return true; } return false; } //有效判断 bool CGameLogic::IsValidUser( WORD wChairID ) { if (wChairID>=0 && wChairIDcbFirstLogicValue) ? true : false; } case CT_THREE_TAKE_ONE: case CT_THREE_TAKE_TWO: { //分析扑克 tagAnalyseResult NextResult, FirstResult; VERIFY(AnalysebCardData(cbNextCard, cbNextCount, NextResult)); VERIFY(AnalysebCardData(cbFirstCard, cbFirstCount, FirstResult)); //获取数值 BYTE cbFirstLogicValue = GetCardLogicValue(FirstResult.cbThreeCardData[0]); BYTE cbNextLogicValue = GetCardLogicValue(NextResult.cbThreeCardData[0]); if (NextResult.cbThreeCount>1 && GetCardLogicValue(NextResult.cbThreeCardData[0])!=GetCardLogicValue(NextResult.cbThreeCardData[3])+1) { cbNextLogicValue = GetCardLogicValue(NextResult.cbThreeCardData[3]); } if (FirstResult.cbThreeCount>1 && GetCardLogicValue(FirstResult.cbThreeCardData[0])!=GetCardLogicValue(FirstResult.cbThreeCardData[3])+1) { cbFirstLogicValue = GetCardLogicValue(FirstResult.cbThreeCardData[3]); } //对比扑克 return (cbNextLogicValue>cbFirstLogicValue) ? true : false; } case CT_FOUR_TAKE_ONE: case CT_FOUR_TAKE_TWO: { //分析扑克 tagAnalyseResult NextResult, FirstResult; VERIFY(AnalysebCardData(cbNextCard, cbNextCount, NextResult)); VERIFY(AnalysebCardData(cbFirstCard, cbFirstCount, FirstResult)); //获取数值 BYTE cbNextLogicValue = GetCardLogicValue(NextResult.cbFourCardData[0]); BYTE cbFirstLogicValue = GetCardLogicValue(FirstResult.cbFourCardData[0]); //对比扑克 return (cbNextLogicValue>cbFirstLogicValue) ? true : false; } } return false; } //出牌搜索 bool CGameLogic::SearchOutCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, tagOutCardResult &OutCardResult ) { //设置结果 ZeroMemory(&OutCardResult, sizeof(OutCardResult)); //构造扑克 BYTE cbTempCardData[MAX_COUNT] = {0}; BYTE cbTempCardCount = cbHandCardCount; CopyMemory(cbTempCardData, cbHandCardData, sizeof(BYTE)*cbHandCardCount); //排列扑克 SortCardList(cbTempCardData, cbTempCardCount, ST_ORDER); //获取类型 BYTE cbTurnOutType = CT_ERROR; if (cbTurnCardCount > 0) { cbTurnOutType = GetCardType(cbTurnCardData, cbTurnCardCount); } //出牌分析 switch (cbTurnOutType) { case CT_ERROR: //错误类型 { //获取数值 BYTE cbLogicValue = GetCardLogicValue(cbTempCardData[cbTempCardCount-1]); //多牌判断 BYTE cbSameCount = 1; for (BYTE i=1; i 1) { OutCardResult.cbCardCount = cbSameCount; for (BYTE j=0; j cbLogicValue) { //设置结果 OutCardResult.cbCardCount = cbTurnCardCount; CopyMemory(OutCardResult.cbCardData, &AnalyseResult.cbSingleCardData[cbIndex], sizeof(BYTE)*cbTurnCardCount); return true; } } } //寻找对牌 if (cbTurnCardCount <= 2) { for (BYTE i=0; i cbLogicValue) { //设置结果 OutCardResult.cbCardCount = cbTurnCardCount; CopyMemory(OutCardResult.cbCardData, &AnalyseResult.cbDoubleCardData[cbIndex], sizeof(BYTE)*cbTurnCardCount); return true; } } } //寻找三牌 if (cbTurnCardCount <= 3) { for (BYTE i=0; i cbLogicValue) { //设置结果 OutCardResult.cbCardCount = cbTurnCardCount; CopyMemory(OutCardResult.cbCardData, &AnalyseResult.cbThreeCardData[cbIndex], sizeof(BYTE)*cbTurnCardCount); return true; } } } }break; case CT_SINGLE_LINE: //单连类型 { //长度判断 if (cbTempCardCount < cbTurnCardCount) break; //获取数值 BYTE cbLogicValue = GetCardLogicValue(cbTurnCardData[0]); //搜索连牌 for (BYTE i=(cbTurnCardCount-1); i= 15) break; if (cbHandLogicValue <= cbLogicValue) continue; //搜索连牌 BYTE cbLineCount = 0; for (BYTE j=(cbTempCardCount-i-1); j1 && cbHandLogicValue>=15) break; //搜索连牌 BYTE cbLineCount = 0; for (BYTE j=(cbTempCardCount-i-1); j<(cbTempCardCount-1); j++) { if (GetCardLogicValue(cbTempCardData[j])+cbLineCount==cbHandLogicValue && GetCardLogicValue(cbTempCardData[j+1])+cbLineCount==cbHandLogicValue) { //增加连数 OutCardResult.cbCardData[cbLineCount*2] = cbTempCardData[j]; OutCardResult.cbCardData[(cbLineCount++)*2+1] = cbTempCardData[j+1]; //完成判断 if (cbLineCount*2 == cbTurnCardCount) { OutCardResult.cbCardCount = cbTurnCardCount; return true; } } } } }break; case CT_THREE_LINE: //三连类型 case CT_THREE_TAKE_ONE: //三带一单 case CT_THREE_TAKE_TWO: //三带一对 { //长度判断 if (cbTempCardCount < cbTurnCardCount) break; //获取数值 BYTE cbLogicValue = 0; for (BYTE i=0; i1 && cbHandLogicValue>=15) break; bool bfour = false; for (int b=0; b=4 && cbTurnOutType!=CT_MISSILE_CARD) { //变量定义 BYTE cbLogicValue = 0; if (cbTurnOutType == CT_BOMB_CARD) { cbLogicValue = GetCardLogicValue(cbTurnCardData[0]); } //搜索炸弹 for (BYTE i=3; i=2 && cbTempCardData[0]==0x4F && cbTempCardData[1]==0x4E) { if (cbTurnOutType == CT_MISSILE_CARD) return true; //设置结果 OutCardResult.cbCardCount = 2; OutCardResult.cbCardData[0] = cbTempCardData[0]; OutCardResult.cbCardData[1] = cbTempCardData[1]; return true; } return false; } //提示出牌 bool CGameLogic::SearchOutCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, tagPromptCardResult &OutCardResult ) { //设置结果 ZeroMemory(&OutCardResult, sizeof(OutCardResult)); //拷贝出牌 BYTE cbOutCardData[MAX_COUNT] = {0}; BYTE cbOutCardCount = cbTurnCardCount; CopyMemory(cbOutCardData, cbTurnCardData, cbTurnCardCount); bool bContinue = true; tagOutCardResult TempOutCardResult; while (bContinue) { ZeroMemory(&TempOutCardResult, sizeof(TempOutCardResult)); SearchOutCard(cbHandCardData, cbHandCardCount, cbOutCardData, cbOutCardCount, TempOutCardResult); if (TempOutCardResult.cbCardCount > 0) { BYTE cbPos = OutCardResult.cbResultCount; OutCardResult.cbCardCount[cbPos] = TempOutCardResult.cbCardCount; CopyMemory(OutCardResult.cbCardData[cbPos], TempOutCardResult.cbCardData, sizeof(BYTE)*TempOutCardResult.cbCardCount); OutCardResult.cbResultCount++; cbOutCardCount = TempOutCardResult.cbCardCount; CopyMemory(cbOutCardData, TempOutCardResult.cbCardData, sizeof(BYTE)*TempOutCardResult.cbCardCount); } else { bContinue = false; } } return false; } //分析扑克 bool CGameLogic::AnalysebCardData( const BYTE cbCardData[], const BYTE cbCardCount, tagAnalyseResult &AnalyseResult ) { //设置结果 ZeroMemory(&AnalyseResult, sizeof(AnalyseResult)); if (cbCardCount == 0) return false; //扑克分析 for (BYTE i=0; i= 3) { cbThreeCardData[cbThreeCardCount++] = cbTempCardData[i]; cbThreeCardData[cbThreeCardCount++] = cbTempCardData[i+1]; cbThreeCardData[cbThreeCardCount++] = cbTempCardData[i+2]; } //设置索引 i += cbSameCount-1; } } //分析对子 void CGameLogic::GetAllDoubleCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, BYTE cbDoubleCardData[], BYTE &cbDoubleCardCount ) { cbDoubleCardCount = 0; if (cbHandCardCount < 2) return; BYTE cbTempCardData[MAX_COUNT] = {0}; CopyMemory(cbTempCardData, cbHandCardData, cbHandCardCount); //大小排序 SortCardList(cbTempCardData, cbHandCardCount, ST_ORDER); //扑克分析 for (BYTE i=0; i= 2) { cbDoubleCardData[cbDoubleCardCount++] = cbTempCardData[i]; cbDoubleCardData[cbDoubleCardCount++] = cbTempCardData[i+1]; } //设置索引 i += cbSameCount-1; } } //分析单牌 void CGameLogic::GetAllSingleCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, BYTE cbSingleCardData[], BYTE &cbSingleCardCount, bool bOnlySingle ) { cbSingleCardCount = 0; if (cbHandCardCount == 0) return; BYTE cbTempCardData[MAX_COUNT] = {0}; CopyMemory(cbTempCardData, cbHandCardData, cbHandCardCount); //大小排序 SortCardList(cbTempCardData, cbHandCardCount, ST_ORDER); //扑克分析 for (BYTE i=0; i= 1) { cbSingleCardData[cbSingleCardCount++] = cbTempCardData[i]; } } //设置索引 i += cbSameCount-1; } } //分析顺子 void CGameLogic::GetAllLineCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, BYTE cbLineCardData[], BYTE &cbLineCardCount ) { cbLineCardCount = 0; //数据校验 if (cbHandCardCount < 5) return; BYTE cbTempCardData[MAX_COUNT] = {0}; CopyMemory(cbTempCardData, cbHandCardData, cbHandCardCount); //大小排序 SortCardList(cbTempCardData, cbHandCardCount, ST_ORDER); BYTE cbFirstCard = 0; //去除2和王 for (BYTE i=0; i=5 && bFindSingleLine) { cbSingleLineCount = 1; bFindSingleLine = false; BYTE cbLastCard = cbTempCardData[cbFirstCard]; cbSingleLineCard[cbSingleLineCount-1] = cbTempCardData[cbFirstCard]; for (BYTE i=cbFirstCard+1; i= 5) { RemoveCard(cbSingleLineCard, cbSingleLineCount, cbTempCardData, cbLeftCardCount); memcpy(cbLineCardData+cbLineCardCount, cbSingleLineCard, sizeof(BYTE)*cbSingleLineCount); cbLineCardCount += cbSingleLineCount; cbLeftCardCount -= cbSingleLineCount; bFindSingleLine = true; } } } //分析顺子 void CGameLogic::GetAllLineCard( const BYTE cbHandCardData[], const BYTE cbHandCardCount, tagPromptCardInfo &PromptCardInfo ) { //数据校验 if (cbHandCardCount < 5) return; BYTE cbTempCardData[MAX_COUNT] = {0}; CopyMemory(cbTempCardData, cbHandCardData, cbHandCardCount); //大小排序 SortCardList(cbTempCardData, cbHandCardCount, ST_ORDER); BYTE cbFirstCard = 0; //去除2和王 for (BYTE i=0; i=5 && bFindSingleLine) { cbSingleLineCount = 1; bFindSingleLine = false; BYTE cbLastCard = cbTempCardData[cbFirstCard]; cbSingleLineCard[cbSingleLineCount-1] = cbTempCardData[cbFirstCard]; for (BYTE i=cbFirstCard+1; i= 5) { RemoveCard(cbSingleLineCard, cbSingleLineCount, cbTempCardData, cbLeftCardCount); CopyMemory(PromptCardInfo.stSingleLineResult.cbCardData[cbLinkResult], cbSingleLineCard, sizeof(BYTE)*cbSingleLineCount); PromptCardInfo.stSingleLineResult.cbCardCount[cbLinkResult] = cbSingleLineCount; ++PromptCardInfo.stSingleLineResult.cbResultCount; ++cbLinkResult; cbLeftCardCount -= cbSingleLineCount; bFindSingleLine = true; } } } //提取信息 void CGameLogic::PromptHandCardEachType( const BYTE cbHandCardData[], const BYTE cbHandCardCount, tagPromptCardInfo &PromptCardInfo ) { ZeroMemory(&PromptCardInfo, sizeof(tagPromptCardInfo)); ASSERT(cbHandCardCount>=0 && cbHandCardCount<=MAX_COUNT); if (cbHandCardCount==0 || cbHandCardCount>MAX_COUNT) return; //拷贝数据 BYTE cbTempCardData[MAX_COUNT] = {0}; BYTE cbTempCardCount = cbHandCardCount; CopyMemory(cbTempCardData, cbHandCardData, cbHandCardCount); //排序扑克 SortCardList(cbTempCardData, cbTempCardCount, ST_ORDER); //分析扑克 tagAnalyseResult AnalyseResult; VERIFY(AnalysebCardData(cbTempCardData,cbTempCardCount,AnalyseResult)); //火箭 if (AnalyseResult.cbSingleCount>=2 && AnalyseResult.cbSingleCardData[0]==0x4F && AnalyseResult.cbSingleCardData[1]==0x4E) { PromptCardInfo.stRocketResult.cbResultCount = 1; PromptCardInfo.stRocketResult.cbCardCount[0] = 2; PromptCardInfo.stRocketResult.cbCardData[0][0] = 0x4F; PromptCardInfo.stRocketResult.cbCardData[0][1] = 0x4E; } //炸弹 if (AnalyseResult.cbFourCount > 0) { PromptCardInfo.stBombResult.cbResultCount = AnalyseResult.cbFourCount; for (int i=AnalyseResult.cbFourCount,k=0; i>0; --i,++k) { PromptCardInfo.stBombResult.cbCardCount[k] = 4; CopyMemory(PromptCardInfo.stBombResult.cbCardData[k], &AnalyseResult.cbFourCardData[(i-1)*4], sizeof(BYTE)*4); } } //四带二 if (AnalyseResult.cbFourCount>0 && cbHandCardCount>=6) { int iResultCount = 0; for (int i=AnalyseResult.cbFourCount,k=0; i>0; --i,++k) { //四带二单 if (AnalyseResult.cbSingleCount >= 2) { PromptCardInfo.stFourTwoResult.cbCardCount[iResultCount] = 6; CopyMemory(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], &AnalyseResult.cbFourCardData[(i-1)*4], sizeof(BYTE)*4); CopyMemory(&PromptCardInfo.stFourTwoResult.cbCardData[iResultCount][4], &AnalyseResult.cbSingleCardData[AnalyseResult.cbSingleCount-2], sizeof(BYTE)*2); SortCardList(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], 6, ST_ORDER); ++iResultCount; } else { BYTE cbElemCardData[MAX_COUNT] = {0}; CopyMemory(cbElemCardData, cbHandCardData, cbHandCardCount); RemoveCard(&AnalyseResult.cbFourCardData[(i-1)*4], 4, cbElemCardData, cbHandCardCount); PromptCardInfo.stFourTwoResult.cbCardCount[iResultCount] = 6; CopyMemory(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], &AnalyseResult.cbFourCardData[(i-1)*4], sizeof(BYTE)*4); CopyMemory(&PromptCardInfo.stFourTwoResult.cbCardData[iResultCount][4], &cbElemCardData[cbHandCardCount-6], sizeof(BYTE)*2); SortCardList(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], 6, ST_ORDER); ++iResultCount; } //四带二双 if (cbHandCardCount >= 8) { if (AnalyseResult.cbDoubleCount >= 2) { PromptCardInfo.stFourTwoResult.cbCardCount[iResultCount] = 8; CopyMemory(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], &AnalyseResult.cbFourCardData[(i-1)*4], sizeof(BYTE)*4); CopyMemory(&PromptCardInfo.stFourTwoResult.cbCardData[iResultCount][4], &AnalyseResult.cbDoubleCardData[AnalyseResult.cbDoubleCount*2-4], sizeof(BYTE)*4); SortCardList(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], 8, ST_ORDER); ++iResultCount; } else { BYTE cbElemCardData[MAX_COUNT] = {0}; CopyMemory(cbElemCardData, cbHandCardData, cbHandCardCount); RemoveCard(&AnalyseResult.cbFourCardData[(i-1)*4], 4, cbElemCardData, cbHandCardCount); //提取对牌 BYTE cbDoubleCard[MAX_COUNT]={0}, cbDoubleCount=0; GetAllDoubleCard(cbElemCardData, cbHandCardCount-4, cbDoubleCard, cbDoubleCount); if (cbDoubleCount >= 4) { PromptCardInfo.stFourTwoResult.cbCardCount[iResultCount] = 8; CopyMemory(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], &AnalyseResult.cbFourCardData[(i-1)*4], sizeof(BYTE)*4); CopyMemory(&PromptCardInfo.stFourTwoResult.cbCardData[iResultCount][4], &cbDoubleCard[cbDoubleCount-4], sizeof(BYTE)*4); SortCardList(PromptCardInfo.stFourTwoResult.cbCardData[iResultCount], 8, ST_ORDER); ++iResultCount; } } } } PromptCardInfo.stFourTwoResult.cbResultCount = iResultCount; } //飞机 BYTE cbThreeCardData[MAX_COUNT]={0}, cbThreeCardCount=0; GetAllThreeCard(cbHandCardData, cbHandCardCount, cbThreeCardData, cbThreeCardCount); if (cbThreeCardCount >= 6) { for (int i=0; i= 6) { BYTE cbSameCount=1, cbPos=0; for (int i=0,n=cbDoubleCount/2; i 2) { cbPos = i*2; break; } else { cbSameCount = 1; } } if (cbSameCount > 2) { ++PromptCardInfo.stDoubleLineResult.cbResultCount; PromptCardInfo.stDoubleLineResult.cbCardCount[cbDoubleLineCount] = cbSameCount*2; CopyMemory(PromptCardInfo.stDoubleLineResult.cbCardData[cbDoubleLineCount], &cbDoubleCard[cbPos], sizeof(BYTE)*cbSameCount*2); RemoveCard(PromptCardInfo.stDoubleLineResult.cbCardData[cbDoubleLineCount], cbSameCount*2, cbElemCardData, cbElemCardCount); cbElemCardCount -= cbSameCount*2; ++cbDoubleLineCount; } else { break; } } else { break; } } //顺子 GetAllLineCard(cbHandCardData, cbHandCardCount, PromptCardInfo); } //////////////////////////////////////////////////////////////////////////