//对比扑克 bool CGameLogic::CompareCard(BYTE bFirstList[], BYTE bNextList[], BYTE cbFirstCount, BYTE cbNextCount) { //数目判断 if (cbFirstCount!=cbNextCount) return false; //获取类型 BYTE bNextType=GetCardType(bNextList,cbNextCount); BYTE bFirstType=GetCardType(bFirstList,cbFirstCount); //类型过滤 ASSERT(bFirstType!=CT_ERROR); if ((bFirstType==CT_ERROR)||(bNextType==CT_ERROR)) return false; //简单类型 switch(bFirstType) { case CT_SINGLE: //单牌 case CT_DOUBLE: //对子 case CT_THREE_TIAO: //三条 { if (bNextType!=bFirstType) return false; return CompareCard(bFirstList[0],bNextList[0]); } } //类型判断 if (bFirstType!=bNextType) return (bFirstType>bNextType); //五条类型 switch(bFirstType) { case CT_SHUN_ZI: //顺子 case CT_TONG_HUA: //同花 case CT_TONG_HUA_SHUN: //同花顺 { return CompareCard(bFirstList[0],bNextList[0]); } case CT_HU_LU: //葫芦 { return CompareCard(bFirstList[2],bNextList[2]); } case CT_TIE_ZHI: //铁支 { return CompareCard(bFirstList[1],bNextList[1]); } } return false; }
//定时器消息 void CGameClientView::OnTimer(UINT nIDEvent) { if (nIDEvent==IDI_CARTOON) //动画到时 { //变量定义 bool bKillTimer=true; //闪牌动画 if(m_bStopDraw && (FlashCard()==true)) { bKillTimer=false; } //比牌动画 if ((m_wLoserUser!=INVALID_CHAIR)&&(CompareCard()==true)) { bKillTimer=false; } //发牌动画 if ((m_SendCardItemArray.GetCount()>0)&&(SendCard()==true)) { bKillTimer=false; } //删除时间 if (bKillTimer==true) { m_bCartoon=false; KillTimer(nIDEvent); } return; } __super::OnTimer(nIDEvent); }
/** * @brief 从7张牌中分析出5张最大牌型 * @param bHandCards[] 要分析的手牌 * @param nCount 手牌张数 * @param bPublicCards[] 要分析公共牌 * @param nPublicCount 公共牌张数 * @param bResultCard[] 返回分析得到的数据牌 * @return 牌型 */ int CUpGradeGameLogic::AnalysisCard(BYTE bHandCards[], int nHandCount, BYTE bPublicCards[], int nPublicCount, BYTE bResultCard[]) { if ((nHandCount + nPublicCount) != 7) { return 0; } int i, j; CByteArray arrCards; for (i = 0; i < nHandCount; i++) { arrCards.Add(bHandCards[i]); } for (i = 0; i < nPublicCount; i++) { arrCards.Add(bPublicCards[i]); } BYTE bCard[5] = {0}; int nCardKind[21] = {0}; //// 21种组成方法 //BYTE bIndex[21][5] = {0, 1, 2, 3, 4, \ // 0, 1, 2, 3, 5, \ // 0, 1, 2, 3, 6, \ // 0, 1, 2, 4, 5, \ // 0, 1, 2, 4, 6, \ // 0, 1, 2, 5, 6, \ // 0, 1, 3, 4, 5, \ // 0, 1, 3, 4, 6, \ // 0, 1, 3, 5, 6, \ // 0, 1, 4, 5, 6, \ // 0, 2, 3, 4, 5, \ // 0, 2, 3, 4, 6, \ // 0, 2, 3, 5, 6, \ // 0, 2, 4, 5, 6, \ // 0, 3, 4, 5, 6, \ // 1, 2, 3, 4, 5, \ // 1, 2, 3, 4, 6, \ // 1, 2, 3, 5, 6, \ // 1, 2, 4, 5, 6, \ // 1, 3, 4, 5, 6, \ // 2, 3, 4, 5, 6, \ // }; // 21种组成方法 BYTE bIndex[21][7] = {0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 5, 4, 6, 0, 1, 2, 3, 6, 4, 5, 0, 1, 2, 4, 5, 3, 6, 0, 1, 2, 4, 6, 3, 5, 0, 1, 2, 5, 6, 3, 4, 0, 1, 3, 4, 5, 2, 6, 0, 1, 3, 4, 6, 2, 5, 0, 1, 3, 5, 6, 2, 4, 0, 1, 4, 5, 6, 2, 3, 0, 2, 3, 4, 5, 1, 6, 0, 2, 3, 4, 6, 1, 5, 0, 2, 3, 5, 6, 1, 4, 0, 2, 4, 5, 6, 1, 3, 0, 3, 4, 5, 6, 1, 2, 1, 2, 3, 4, 5, 0, 6, 1, 2, 3, 4, 6, 0, 5, 1, 2, 3, 5, 6, 0, 4, 1, 2, 4, 5, 6, 0, 3, 1, 3, 4, 5, 6, 0, 2, 2, 3, 4, 5, 6, 0, 1 }; for (i = 0; i < 21; i++) { for (j = 0; j < 5; j++) { // 按牌下标取出5张牌 bCard[j] = arrCards.GetAt(bIndex[i][j]); } // 获取牌型 nCardKind[i] = GetCardShape(bCard, 5); //CString str; //str.Format("dxh: 第%d种方法, 牌型: %d", i, nCardKind[i]); //OutputDebugString(str); } // 取最大牌型位置 int nMax = 0; for (i = 1; i < 21; i++) { if (nCardKind[i] > nCardKind[nMax]) { nMax = i; } } BYTE bCompareCard1[5], bCompareCard2[5]; int nCompareMax = nMax; // 找出最大牌型后, 再找出相同牌型最大牌组合(牌型一样情况下, 则会比大小, 所以这里就需要取最大的相同的牌型) for (i = 0; i < 21; i++) { if (i == nMax) { continue; } for (j = 0; j < 5; j++) { bCompareCard1[j] = arrCards.GetAt(bIndex[i][j]); bCompareCard2[j] = arrCards.GetAt(bIndex[nCompareMax][j]); } // 比牌(-1:输, 0:和, 1:赢) if (CompareCard(bCompareCard1, 5, bCompareCard2, 5) > 0) { nCompareMax = i; } } // 从7张手牌中取出5终最终牌型 for (i = 0; i < 7; i++) { bResultCard[i] = arrCards.GetAt(bIndex[nCompareMax][i]); } CString str; str.Format("dxh: 当前最大牌型索引: %d, 牌型ID:%d", nCompareMax, nCardKind[nCompareMax]); OutputDebugString(str); return nCardKind[nCompareMax]; }