|
- #include "StdAfx.h"
- #include "GameLogicOther.h"
- #include "math.h"
- #include "TableFrameSinkOther.h"
- #include "fstream"
- #include "GameLogic.h"
-
- //////////////////////////////////////////////////////////////////////////
- //静态变量
-
- //扑克数据,一脚癞油的基础数据
- const BYTE CGameLogicOther::m_cbCardDataArray[MAX_REPERTORY] =
- {
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- };
-
- //三人两房 扑克数据
- const BYTE CGameLogicOther::m_cbCardDataArray_SRLF[MAX_REPERTORY_SRLF] =
- {
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
- };
-
- //////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CGameLogicOther::CGameLogicOther(CTableFrameSinkOther* pTableFramSink)
- {
- m_cbMagicIndex = MAX_INDEX;
- m_pTableFramSink = pTableFramSink;
- }
-
- //析构函数
- CGameLogicOther::~CGameLogicOther()
- {
- }
-
- //混乱扑克
- BYTE CGameLogicOther::RandCardData(BYTE cbCardData[])
- {
- BYTE cbCardDataTemp[MAX_REPERTORY];
- BYTE cbMaxCount = 0;
- //混乱准备
- //if (srlf == m_pTableFramSink->m_gameConfig.wSubGameID)
- //{
- // CopyMemory(cbCardDataTemp, m_cbCardDataArray_SRLF, sizeof(m_cbCardDataArray_SRLF));
- // cbMaxCount = MAX_REPERTORY_SRLF;
- //}
- //else {
- CopyMemory(cbCardDataTemp, m_cbCardDataArray, sizeof(m_cbCardDataArray));
- cbMaxCount = MAX_REPERTORY;
- //}
- //混乱扑克
- BYTE cbRandCount = 0, cbPosition = 0;
- do
- {
- cbPosition = rand() % (cbMaxCount - cbRandCount);
- cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
- cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
- } while (cbRandCount < cbMaxCount);
-
- return cbMaxCount;
- }
-
- //删除扑克
- bool CGameLogicOther::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard)
- {
- //效验扑克
- ASSERT(IsValidCard(cbRemoveCard));
- ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
-
- //删除扑克
- BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
- if (cbCardIndex[cbRemoveIndex]>0)
- {
- cbCardIndex[cbRemoveIndex]--;
- return true;
- }
-
- //失败效验
- ASSERT(FALSE);
-
- return false;
- }
-
- //删除扑克
- bool CGameLogicOther::RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount)
- {
- //删除扑克
- for (BYTE i=0;i<cbRemoveCount;i++)
- {
- //效验扑克
- ASSERT(IsValidCard(cbRemoveCard[i]));
- ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
-
- //删除扑克
- BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
- if (cbCardIndex[cbRemoveIndex]==0)
- {
- //错误断言
- ASSERT(FALSE);
-
- //还原删除
- for (BYTE j=0;j<i;j++)
- {
- ASSERT(IsValidCard(cbRemoveCard[j]));
- cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
- }
-
- return false;
- }
- else
- {
- //删除扑克
- --cbCardIndex[cbRemoveIndex];
- }
- }
-
- return true;
- }
-
- //删除扑克
- bool CGameLogicOther::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount)
- {
- //检验数据
- ASSERT(cbCardCount<=14);
- ASSERT(cbRemoveCount<=cbCardCount);
-
- //定义变量
- BYTE cbDeleteCount=0,cbTempCardData[14];
- if (cbCardCount>CountArray(cbTempCardData))
- return false;
- CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
-
- //置零扑克
- for (BYTE i=0;i<cbRemoveCount;i++)
- {
- for (BYTE j=0;j<cbCardCount;j++)
- {
- if (cbRemoveCard[i]==cbTempCardData[j])
- {
- cbDeleteCount++;
- cbTempCardData[j]=0;
- break;
- }
- }
- }
-
- //成功判断
- if (cbDeleteCount!=cbRemoveCount)
- {
- ASSERT(FALSE);
- return false;
- }
-
- //清理扑克
- BYTE cbCardPos=0;
- for (BYTE i=0;i<cbCardCount;i++)
- {
- if (cbTempCardData[i]!=0)
- cbCardData[cbCardPos++]=cbTempCardData[i];
- }
-
- return true;
- }
-
- //有效判断
- bool CGameLogicOther::IsValidCard(BYTE cbCardData)
- {
- BYTE cbValue=(cbCardData&MASK_VALUE);
- BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
- return (((cbValue>=1)&&(cbValue<=9)&&(cbColor<=2))||((cbValue>=1)&&(cbValue<=7)&&(cbColor==3)));
- }
-
-
- //扑克数目
- BYTE CGameLogicOther::GetCardCount(const BYTE cbCardIndex[MAX_INDEX])
- {
- //数目统计
- BYTE cbCardCount=0;
- for (BYTE i=0;i<MAX_INDEX;i++)
- cbCardCount+=cbCardIndex[i];
-
- return cbCardCount;
- }
-
- //获取组合
- BYTE CGameLogicOther::GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4])
- {
- //组合扑克
- switch (cbWeaveKind)
- {
- case WIK_LEFT: //上牌操作
- {
- //设置变量
- cbCardBuffer[0]=cbCenterCard;
- cbCardBuffer[1]=cbCenterCard+1;
- cbCardBuffer[2]=cbCenterCard+2;
-
- return 3;
- }
- case WIK_RIGHT: //上牌操作
- {
- //设置变量
- cbCardBuffer[0]=cbCenterCard;
- cbCardBuffer[1]=cbCenterCard-1;
- cbCardBuffer[2]=cbCenterCard-2;
-
- return 3;
- }
- case WIK_CENTER: //上牌操作
- {
- //设置变量
- cbCardBuffer[0]=cbCenterCard;
- cbCardBuffer[1]=cbCenterCard-1;
- cbCardBuffer[2]=cbCenterCard+1;
-
- return 3;
- }
- case WIK_PENG: //碰牌操作
- {
- //设置变量
- cbCardBuffer[0]=cbCenterCard;
- cbCardBuffer[1]=cbCenterCard;
- cbCardBuffer[2]=cbCenterCard;
-
- return 3;
- }
- case WIK_GANG: //杠牌操作
- {
- //设置变量
- cbCardBuffer[0]=cbCenterCard;
- cbCardBuffer[1]=cbCenterCard;
- cbCardBuffer[2]=cbCenterCard;
- cbCardBuffer[3]=cbCenterCard;
-
- return 4;
- }
- case WIK_MING_GANG: //明杠牌操作
- {
- //设置变量
- cbCardBuffer[0] = cbCenterCard;
- cbCardBuffer[1] = cbCenterCard;
- cbCardBuffer[2] = cbCenterCard;
- cbCardBuffer[3] = cbCenterCard;
-
- return 4;
- }
- case WIK_AN_GANG: //暗杠牌操作
- {
- //设置变量
- cbCardBuffer[0] = cbCenterCard;
- cbCardBuffer[1] = cbCenterCard;
- cbCardBuffer[2] = cbCenterCard;
- cbCardBuffer[3] = cbCenterCard;
-
- return 4;
- }
- case WIK_AN_PIGANG: //暗皮杠牌操作
- {
- //设置变量
- cbCardBuffer[0] = cbCenterCard;
- cbCardBuffer[1] = cbCenterCard;
- cbCardBuffer[2] = cbCenterCard;
-
- return 3;
- }
- case WIK_MING_PIGANG: //明皮杠牌操作
- {
- //设置变量
- cbCardBuffer[0] = cbCenterCard;
- cbCardBuffer[1] = cbCenterCard;
- cbCardBuffer[2] = cbCenterCard;
-
- return 3;
- }
- case WIK_BU_GANG:
- {
- cbCardBuffer[0] = cbCenterCard;
- cbCardBuffer[1] = cbCenterCard;
- cbCardBuffer[2] = cbCenterCard;
- cbCardBuffer[3] = cbCenterCard;
-
- return 4;
- }
- default:
- {
- ASSERT(FALSE);
- }
- }
- return 0;
- }
-
- //动作等级,只有碰,杠
- BYTE CGameLogicOther::GetUserActionRank(INT cbUserAction)
- {
- //胡牌等级
- if (cbUserAction&WIK_CHI_HU) { return 4; }
-
- if (cbUserAction&WIK_DUO_PAO){ return 3; }
- //杠牌等级
- if (cbUserAction&WIK_MING_GANG) { return 2; }
-
- //碰牌等级
- if (cbUserAction&WIK_PENG) { return 1; }
-
- //上牌等级
- //if (cbUserAction&(WIK_RIGHT|WIK_CENTER|WIK_LEFT)) { return 1; }
-
- return 0;
- }
-
- //胡牌等级
- WORD CGameLogicOther::GetChiHuActionRank(const CChiHuRight & ChiHuRight)
- {
- WORD wFanShu = 0;
-
- if (!(ChiHuRight&CHR_QING_DUI).IsEmpty())
- wFanShu = 4;
- else if( !(ChiHuRight&CHR_QING_YI_SE).IsEmpty() )
- wFanShu = 2;
- else if (!(ChiHuRight&CHK_PENGPENG).IsEmpty())
- wFanShu = 2;
- else if (!(ChiHuRight&CHK_CHI_HU).IsEmpty())
- wFanShu = 1;
- ASSERT( wFanShu > 0 );
- return wFanShu;
- }
-
- //吃牌判断 一脚耐油不需要
- /*
- BYTE CGameLogic::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
- {
- //参数效验
- ASSERT(IsValidCard(cbCurrentCard));
-
- //过滤判断
- if ( cbCurrentCard>=0x31 || IsMagicCard(cbCurrentCard) )
- return WIK_NULL;
-
- //变量定义
- BYTE cbExcursion[3]={0,1,2};
- BYTE cbItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT};
-
- //吃牌判断
- BYTE cbEatKind=0,cbFirstIndex=0;
- BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
- for (BYTE i=0;i<CountArray(cbItemKind);i++)
- {
- BYTE cbValueIndex=cbCurrentIndex%9;
- if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6))
- {
- //吃牌判断
- cbFirstIndex=cbCurrentIndex-cbExcursion[i];
-
- //吃牌不能包含有王霸
- if( m_cbMagicIndex != MAX_INDEX &&
- m_cbMagicIndex >= cbFirstIndex && m_cbMagicIndex <= cbFirstIndex+2 ) continue;
-
- if ((cbCurrentIndex!=cbFirstIndex)&&(cbCardIndex[cbFirstIndex]==0))
- continue;
- if ((cbCurrentIndex!=(cbFirstIndex+1))&&(cbCardIndex[cbFirstIndex+1]==0))
- continue;
- if ((cbCurrentIndex!=(cbFirstIndex+2))&&(cbCardIndex[cbFirstIndex+2]==0))
- continue;
-
- //设置类型
- cbEatKind|=cbItemKind[i];
- }
- }
-
- return cbEatKind;
- }*/
-
- //碰牌判断
- int CGameLogicOther::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
- {
- //参数效验
- ASSERT(IsValidCard(cbCurrentCard));
-
- //过滤判断
- if (IsMagicCard(cbCurrentCard))
- return WIK_NULL;
- //碰牌判断
- return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)] >= 2) ? WIK_PENG : WIK_NULL;
- }
-
- //杠牌判断
- int CGameLogicOther::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
- {
- //参数效验
- ASSERT(IsValidCard(cbCurrentCard));
-
- //过滤判断
- if ( IsMagicCard(cbCurrentCard) )
- return WIK_NULL;
- BYTE index = SwitchToCardIndex(cbCurrentCard);
- BYTE zhi = cbCardIndex[index];
- //杠牌判断
- return (zhi==3)?WIK_MING_GANG:WIK_NULL;
- }
-
- //杠牌分析
- int CGameLogicOther::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult, BYTE bProvideCard, bool bCanAnGang /* = true */)
- {
- //设置变量
- int cbActionMask = WIK_NULL;
- ZeroMemory(&GangCardResult, sizeof(GangCardResult));
-
- //手上杠牌
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- if (i == m_cbMagicIndex) continue;
- if (cbCardIndex[i] == 4)
- {
- BYTE cbCardData = SwitchToCardData(i);
- cbActionMask |= WIK_GANG;
- GangCardResult.cbCardData[GangCardResult.cbCardCount++] = cbCardData;
- }
- }
-
-
- //组合杠牌
- for (BYTE i = 0; i < cbWeaveCount; i++)
- {
- if (WeaveItem[i].cbWeaveKind == WIK_PENG)
- {
- if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)] == 1)
- {
- cbActionMask |= WIK_BU_GANG;
- GangCardResult.cbCardData[GangCardResult.cbCardCount++] = WeaveItem[i].cbCenterCard;
- }
- }
- }
-
- return cbActionMask;
- }
-
- ////吃胡分析,把吃胡分析改成自摸分析。因为我们已经没有吃牌动作了,所以不存在吃胡模式
- //int CGameLogic::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight, BYTE m_cbLaiZi)
- //{
- // //变量定义
- // int cbChiHuKind=WIK_NULL;
- // CAnalyseItemArray AnalyseItemArray;
- //
- // //设置变量
- // AnalyseItemArray.RemoveAll();
- // ChiHuRight.SetEmpty();
- //
- // //构造扑克
- // BYTE cbCardIndexTemp[MAX_INDEX];
- // CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
- //
- // //cbCurrentCard一定不为0 !!!!!!!!!
- // ASSERT( cbCurrentCard != 0 );
- // if( cbCurrentCard == 0 ) return WIK_NULL;
- //
- // if( !ChiHuRight.IsEmpty() )
- // cbChiHuKind = WIK_ZI_MO;
- //
- // //插入扑克
- // if (cbCurrentCard == 0)
- // {
- // ASSERT(false);
- // return false;
- // }
- //
- // cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
- //
- // BYTE LaiZiIndex = SwitchToCardIndex(m_cbLaiZi);//癞子在牌里面的索引
- // if (cbCardIndexTemp[LaiZiIndex]>1)//手上癞子超过2个或者2个,就不能胡牌,必须打掉一个
- // {
- // return WIK_NULL;
- // }
- // BYTE isHuPaiCount = 0;
- // if (cbCardIndexTemp[LaiZiIndex] == 1 && cbCurrentCard != m_cbLaiZi)
- // {
- // cbCardIndexTemp[LaiZiIndex]--;
- // //分析扑克,cbCardIndexTemp是用户手上的牌,WeaveItem,
- // for (BYTE i = 0; i < MAX_INDEX; i++)
- // {
- // cbCardIndexTemp[i]++;
- // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
- // //胡牌分析
- // if (AnalyseItemArray.GetCount()>0)
- // {
- // cbChiHuKind = WIK_ZI_MO;
- // isHuPaiCount++;
- // }
- // cbCardIndexTemp[i]--;
- // }
- // cbCardIndexTemp[LaiZiIndex]++;
- // if (isHuPaiCount == 27) //当有癞子时,且癞子是个万能和牌时,需要打掉,或者改牌
- // {
- // isHuPaiCount = 0;
- // return WIK_NULL;
- // }
- // return cbChiHuKind;
- // }
- // else
- // {
- // if (cbCurrentCard == m_cbLaiZi)
- // {
- // if (cbCardIndexTemp[LaiZiIndex] != 1)
- // {
- // ASSERT(false);
- // return false;
- // }
- // cbCardIndexTemp[LaiZiIndex]--;
- // //分析扑克,cbCardIndexTemp是用户手上的牌,WeaveItem,
- // for (BYTE i = 0; i < MAX_INDEX; i++)
- // {
- // cbCardIndexTemp[i]++;
- // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
- // //胡牌分析
- // if (AnalyseItemArray.GetCount()>0)
- // {
- // cbChiHuKind = WIK_ZI_MO;
- // }
- // cbCardIndexTemp[i]--;
- // }
- // cbCardIndexTemp[LaiZiIndex]++;
- // return cbChiHuKind;
- // }
- // else
- // {
- // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
- // //胡牌分析
- // if (AnalyseItemArray.GetCount() > 0)
- // {
- // cbChiHuKind = WIK_ZI_MO;
- // ChiHuRight |= CHR_YING_ZIMO;
- // }
- // return cbChiHuKind;
- // }
- // }
- //}
-
- int CGameLogicOther::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CChiHuRight &ChiHuRight, BYTE bSubMit)
- {
- if (bSubMit == XueLiu)
- {
- //变量定义
- int cbChiHuKind = WIK_NULL;
- CAnalyseItemArray AnalyseItemArray;
-
- //设置变量
- AnalyseItemArray.RemoveAll();
- ChiHuRight.SetEmpty();
-
- //构造扑克
- BYTE cbCardIndexTemp[MAX_INDEX];
- CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
- if (!ChiHuRight.IsEmpty())
- cbChiHuKind = WIK_ZI_MO;
- if (IsHuaZhu(cbCardIndexTemp, WeaveItem, cbWeaveCount))
- {
- AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
- //胡牌分析
- if (AnalyseItemArray.GetCount() > 0)
- {
- cbChiHuKind |= WIK_ZI_MO;
- }
- return cbChiHuKind;
- }
- return WIK_NULL;
- }
- return WIK_NULL;
- }
-
- bool CGameLogicOther::AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *m_cbTingPaiData, BYTE subMit)
- {
- //复制数据
- BYTE cbCardIndexTemp[MAX_INDEX];
- CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
-
- BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
- if (cbCardCount > 1 && (cbCardCount - 1) % 3 != 0)
- {
- ASSERT(false);
- return false;
- }
- CChiHuRight chr;
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- if (cbCardIndexTemp[i] == 4)continue;
- cbCardIndexTemp[i]++;
- if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, chr, subMit))
- m_cbTingPaiData[i] = 1;
- else
- {
- m_cbTingPaiData[i] = 0;
- }
- cbCardIndexTemp[i]--;
- }
- int tempcount = 0;
- for (int i = 0; i < MAX_INDEX; i++)
- {
- if (m_cbTingPaiData[i] == 1)tempcount++;
- }
- if (tempcount == 0)return false;
- return true;
- }
-
- //是否听牌,true表示已经听牌
- bool CGameLogicOther::IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE subMit)
- {
- //复制数据
- BYTE cbCardIndexTemp[MAX_INDEX];
- CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
- CChiHuRight chr;
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- if (cbCardIndexTemp[i] == 4)continue;
- cbCardIndexTemp[i]++;
- if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, chr, subMit))
- return true;
- cbCardIndexTemp[i]--;
- }
- return false;
- }
-
- //扑克转换
- BYTE CGameLogicOther::SwitchToCardData(BYTE cbCardIndex)
- {
- //ASSERT(cbCardIndex<34);
- return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
- }
-
- //扑克转换
- BYTE CGameLogicOther::SwitchToCardIndex(BYTE cbCardData)
- {
- ASSERT(IsValidCard(cbCardData));
- return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
- }
-
- //扑克转换
- BYTE CGameLogicOther::SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT])
- {
- //转换扑克
- BYTE cbPosition=0;
- //钻牌
- if( m_cbMagicIndex != MAX_INDEX )
- {
- for( BYTE i = 0; i < cbCardIndex[m_cbMagicIndex]; i++ )
- cbCardData[cbPosition++] = SwitchToCardData(m_cbMagicIndex);
- }
- for (BYTE i=0;i<MAX_INDEX;i++)
- {
- if( i == m_cbMagicIndex ) continue;
- if (cbCardIndex[i]!=0)
- {
- for (BYTE j=0;j<cbCardIndex[i];j++)
- {
- ASSERT(cbPosition<MAX_COUNT);
- cbCardData[cbPosition++]=SwitchToCardData(i);
- }
- }
- }
-
- return cbPosition;
- }
-
- //扑克转换
- BYTE CGameLogicOther::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
- {
- //设置变量
- ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
-
- //转换扑克
- for (BYTE i=0;i<cbCardCount;i++)
- {
- ASSERT(IsValidCard(cbCardData[i]));
- cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
- }
-
- return cbCardCount;
- }
- //默认换三张
- bool CGameLogicOther::ExchangeCardIndex(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[EXCHANGE])
- {
- BYTE TempCardIndex[MAX_INDEX] = {0};
- CopyMemory(TempCardIndex, cbCardIndex, sizeof(TempCardIndex));
- BYTE cbTempCardData[MAX_COUNT] = { 0 };
- SwitchToCardData(TempCardIndex, cbTempCardData);
- BYTE WanCount = 0;//万
- BYTE WanTempCardData[MAX_COUNT];
- BYTE TiaoCount = 0;//条
- BYTE TiaoTempCardData[MAX_COUNT];
- BYTE TongCount = 0;//筒
- BYTE TongTempCardData[MAX_COUNT];
- ZeroMemory(WanTempCardData, sizeof(WanTempCardData));
- ZeroMemory(TiaoTempCardData, sizeof(TiaoTempCardData));
- ZeroMemory(TongTempCardData, sizeof(TongTempCardData));
- for (int i = 0; i < MAX_INDEX; i++)//获取手牌花色个数
- {
- if (TempCardIndex[i] == 0)continue;
- if (i < 9)
- while (TempCardIndex[i]--)
- WanTempCardData[WanCount++] = SwitchToCardData(i);
- else if (i < 18)
- while (TempCardIndex[i]--)
- TiaoTempCardData[TiaoCount++] = SwitchToCardData(i);
- else
- while (TempCardIndex[i]--)
- TongTempCardData[TongCount++] = SwitchToCardData(i);
- }
- if (TongCount>TiaoCount&&TongCount > WanCount)//根据花色多少决定默认换三张的牌,筒最多
- {
- if (TiaoCount > WanCount&&WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else if (TiaoCount >= 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else if (WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else
- {
- CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
- return true;
- }
- ASSERT(false);
- return false;
- }
- else if (TiaoCount > TongCount&&TiaoCount > WanCount)//条最多
- {
- if (TongCount > WanCount&&WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else if(TongCount >= 3)
- {
- CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
- return true;
- }
- else if (WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- ASSERT(false);
- return false;
- }
- else if (WanCount > TongCount&&WanCount > TiaoCount) //万最多
- {
- if (TongCount > TiaoCount&&TiaoCount >= 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else if (TongCount >= 3)
- {
- CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
- return true;
- }
- else if (TiaoCount >= 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- ASSERT(false);
- return false;
- }
- else
- {
- if (TiaoCount == TongCount&&WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else if(TiaoCount == WanCount&&TongCount >= 3)
- {
- CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
- return true;
- }
- else if (WanCount == TongCount && TiaoCount>=3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else if (TiaoCount == TongCount&&WanCount < 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else if (TiaoCount == WanCount&&TongCount < 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- }
- /*if (WanCount <= TiaoCount&&WanCount <= TongCount&&WanCount >= 3)
- {
- CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
- return true;
- }
- else if (TiaoCount <= WanCount&& TiaoCount <= TongCount&& TiaoCount >= 3)
- {
- CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
- return true;
- }
- else
- {
- CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
- return true;
- }*/
- ASSERT(false);
- return false;
- }
- //分析扑克
- bool CGameLogicOther::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray)
- {
- //计算数目
- BYTE cbCardCount = GetCardCount(cbCardIndex);
-
- //效验数目
- //ASSERT((cbCardCount>=2)&&(cbCardCount<=MAX_COUNT)&&((cbCardCount-2)%3==0));
- if ((cbCardCount<2) || (cbCardCount>MAX_COUNT) || ((cbCardCount - 2) % 3 != 0))
- return false;
-
- //变量定义
- BYTE cbKindItemCount = 0;
- tagKindItem KindItem[27 * 2 + 7 + 14];
- ZeroMemory(KindItem, sizeof(KindItem));
-
- //需求判断
- BYTE cbLessKindItem = (cbCardCount - 2) / 3;
- ASSERT((cbLessKindItem + cbWeaveCount) == 4);
-
- //单吊判断
- if (cbLessKindItem == 0)
- {
- //效验参数
- ASSERT((cbCardCount == 2) && (cbWeaveCount == 4));
-
- //牌眼判断
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- if (cbCardIndex[i] == 2 ||
- (m_cbMagicIndex != MAX_INDEX && i != m_cbMagicIndex && cbCardIndex[m_cbMagicIndex] + cbCardIndex[i] == 2))
- {
- //变量定义
- tagAnalyseItem AnalyseItem;
- ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
-
- //设置结果
- for (BYTE j = 0; j < cbWeaveCount; j++)
- {
- AnalyseItem.cbWeaveKind[j] = WeaveItem[j].cbWeaveKind;
- AnalyseItem.cbCenterCard[j] = WeaveItem[j].cbCenterCard;
- GetWeaveCard(WeaveItem[j].cbWeaveKind, WeaveItem[j].cbCenterCard, AnalyseItem.cbCardData[j]);
- }
- AnalyseItem.cbCardEye = SwitchToCardData(i);
- if (cbCardIndex[i] < 2 || i == m_cbMagicIndex)
- AnalyseItem.bMagicEye = true;
- else AnalyseItem.bMagicEye = false;
-
- //插入结果
- AnalyseItemArray.Add(AnalyseItem);
-
- return true;
- }
- }
- return false;
- }
-
- //拆分分析,用户手上的临时牌变量
- BYTE cbMagicCardIndex[MAX_INDEX];
- CopyMemory(cbMagicCardIndex, cbCardIndex, sizeof(cbMagicCardIndex));
- BYTE cbMagicCardCount = 0;//用来干什么的不知道
- if (m_cbMagicIndex != MAX_INDEX)
- {
- cbMagicCardCount = cbCardIndex[m_cbMagicIndex];
- if (cbMagicCardIndex[m_cbMagicIndex]) cbMagicCardIndex[m_cbMagicIndex] = 1; //减小多余组合
- }
- if (cbCardCount >= 3)
- {
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- //同牌判断
- if (cbMagicCardIndex[i] + cbMagicCardCount >= 3)
- {
- ASSERT(cbKindItemCount < CountArray(KindItem));
- KindItem[cbKindItemCount].cbCardIndex[0] = i;
- KindItem[cbKindItemCount].cbCardIndex[1] = i;
- KindItem[cbKindItemCount].cbCardIndex[2] = i;
- KindItem[cbKindItemCount].cbWeaveKind = WIK_PENG;
- KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
- KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i] > 0 ? i : m_cbMagicIndex;
- KindItem[cbKindItemCount].cbValidIndex[1] = cbMagicCardIndex[i] > 1 ? i : m_cbMagicIndex;
- KindItem[cbKindItemCount].cbValidIndex[2] = cbMagicCardIndex[i] > 2 ? i : m_cbMagicIndex;
- cbKindItemCount++;
- if (cbMagicCardIndex[i] + cbMagicCardCount >= 6)
- {
- ASSERT(cbKindItemCount < CountArray(KindItem));
- KindItem[cbKindItemCount].cbCardIndex[0] = i;
- KindItem[cbKindItemCount].cbCardIndex[1] = i;
- KindItem[cbKindItemCount].cbCardIndex[2] = i;
- KindItem[cbKindItemCount].cbWeaveKind = WIK_PENG;
- KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
- KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i] > 3 ? i : m_cbMagicIndex;
- KindItem[cbKindItemCount].cbValidIndex[1] = m_cbMagicIndex;
- KindItem[cbKindItemCount].cbValidIndex[2] = m_cbMagicIndex;
- cbKindItemCount++;
- }
- }
-
- //连牌判断
- if ((i < (MAX_INDEX - 2)) && ((i % 9) < 7))
- {
- //只要财神牌数加上3个顺序索引的牌数大于等于3,则进行组合
- if (cbMagicCardCount + cbMagicCardIndex[i] + cbMagicCardIndex[i + 1] + cbMagicCardIndex[i + 2] >= 3)
- {
- BYTE cbIndex[3] = { i == m_cbMagicIndex ? 0 : cbMagicCardIndex[i], (i + 1) == m_cbMagicIndex ? 0 : cbMagicCardIndex[i + 1],
- (i + 2) == m_cbMagicIndex ? 0 : cbMagicCardIndex[i + 2] };
- int nMagicCountTemp = cbMagicCardCount;
- BYTE cbValidIndex[3];
- while (nMagicCountTemp + cbIndex[0] + cbIndex[1] + cbIndex[2] >= 3)
- {
- for (BYTE j = 0; j < CountArray(cbIndex); j++)
- {
- if (cbIndex[j] > 0)
- {
- cbIndex[j]--;
- cbValidIndex[j] = i + j;
- }
- else
- {
- nMagicCountTemp--;
- cbValidIndex[j] = m_cbMagicIndex;
- }
- }
- if (nMagicCountTemp >= 0)
- {
- ASSERT(cbKindItemCount < CountArray(KindItem));
- KindItem[cbKindItemCount].cbCardIndex[0] = i;
- KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
- KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
- KindItem[cbKindItemCount].cbWeaveKind = WIK_LEFT;
- KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
- CopyMemory(KindItem[cbKindItemCount].cbValidIndex, cbValidIndex, sizeof(cbValidIndex));
- cbKindItemCount++;
- }
- else break;
- }
- }
- }
- }
- }
-
- //组合分析
- if (cbKindItemCount >= cbLessKindItem)
- {
- //变量定义
- BYTE cbCardIndexTemp[MAX_INDEX];
- ZeroMemory(cbCardIndexTemp, sizeof(cbCardIndexTemp));
-
- //变量定义
- BYTE cbIndex[4] = { 0, 1, 2, 3 };
- tagKindItem * pKindItem[4];
- ZeroMemory(&pKindItem, sizeof(pKindItem));
-
- //开始组合
- do
- {
- //设置变量
- CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
- for (BYTE i = 0; i < cbLessKindItem; i++)
- pKindItem[i] = &KindItem[cbIndex[i]];
-
- //数量判断
- bool bEnoughCard = true;
- for (BYTE i = 0; i < cbLessKindItem * 3; i++)
- {
- //存在判断
- BYTE cbCardIndex = pKindItem[i / 3]->cbValidIndex[i % 3];
- if (cbCardIndexTemp[cbCardIndex] == 0)
- {
- bEnoughCard = false;
- break;
- }
- else
- cbCardIndexTemp[cbCardIndex]--;
- }
-
- //胡牌判断
- if (bEnoughCard == true)
- {
- //牌眼判断
- BYTE cbCardEye = 0;
- bool bMagicEye = false;
- for (BYTE i = 0; i < MAX_INDEX; i++)
- {
- if (cbCardIndexTemp[i] == 2)
- {
- cbCardEye = SwitchToCardData(i);
- if (i == m_cbMagicIndex) bMagicEye = true;
- break;
- }
- else if (i != m_cbMagicIndex &&
- m_cbMagicIndex != MAX_INDEX && cbCardIndexTemp[i] + cbCardIndexTemp[m_cbMagicIndex] == 2)
- {
- cbCardEye = SwitchToCardData(i);
- bMagicEye = true;
- }
- }
-
- //组合类型
- if (cbCardEye != 0)
- {
- //变量定义
- tagAnalyseItem AnalyseItem;
- ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
-
- //设置组合
- for (BYTE i = 0; i < cbWeaveCount; i++)
- {
- AnalyseItem.cbWeaveKind[i] = WeaveItem[i].cbWeaveKind;
- AnalyseItem.cbCenterCard[i] = WeaveItem[i].cbCenterCard;
- GetWeaveCard(WeaveItem[i].cbWeaveKind, WeaveItem[i].cbCenterCard,
- AnalyseItem.cbCardData[i]);
- }
-
- //设置牌型
- for (BYTE i = 0; i < cbLessKindItem; i++)
- {
- AnalyseItem.cbWeaveKind[i + cbWeaveCount] = pKindItem[i]->cbWeaveKind;
- AnalyseItem.cbCenterCard[i + cbWeaveCount] = pKindItem[i]->cbCenterCard;
- AnalyseItem.cbCardData[cbWeaveCount + i][0] = SwitchToCardData(pKindItem[i]->cbValidIndex[0]);
- AnalyseItem.cbCardData[cbWeaveCount + i][1] = SwitchToCardData(pKindItem[i]->cbValidIndex[1]);
- AnalyseItem.cbCardData[cbWeaveCount + i][2] = SwitchToCardData(pKindItem[i]->cbValidIndex[2]);
- }
-
- //设置牌眼
- AnalyseItem.cbCardEye = cbCardEye;
- AnalyseItem.bMagicEye = bMagicEye;
-
- //插入结果
- AnalyseItemArray.Add(AnalyseItem);
- }
- }
-
- //设置索引
- if (cbIndex[cbLessKindItem - 1] == (cbKindItemCount - 1))
- {
- BYTE i = cbLessKindItem - 1;
- for (; i > 0; i--)
- {
- if ((cbIndex[i - 1] + 1) != cbIndex[i])
- {
- BYTE cbNewIndex = cbIndex[i - 1];
- for (BYTE j = (i - 1); j < cbLessKindItem; j++)
- cbIndex[j] = cbNewIndex + j - i + 2;
- break;
- }
- }
- if (i == 0)
- break;
- }
- else
- cbIndex[cbLessKindItem - 1]++;
- } while (true);
-
- }
- return (AnalyseItemArray.GetCount() > 0);
- }
-
- //钻牌
- bool CGameLogicOther::IsMagicCard(BYTE cbCardData)
- {
- if( m_cbMagicIndex != MAX_INDEX )
- return SwitchToCardIndex(cbCardData) == m_cbMagicIndex;
- return false;
- }
-
- //排序,根据牌值排序
- bool CGameLogicOther::SortCardList(BYTE cbCardData[MAX_COUNT], BYTE cbCardCount)
- {
- //数目过虑
- if (cbCardCount==0||cbCardCount>MAX_COUNT) return false;
-
- //排序操作
- bool bSorted=true;
- BYTE cbSwitchData=0,cbLast=cbCardCount-1;
- do
- {
- bSorted=true;
- for (BYTE i=0;i<cbLast;i++)
- {
- if (cbCardData[i]>cbCardData[i+1])
- {
- //设置标志
- bSorted=false;
-
- //扑克数据
- cbSwitchData=cbCardData[i];
- cbCardData[i]=cbCardData[i+1];
- cbCardData[i+1]=cbSwitchData;
- }
- }
- cbLast--;
- } while(bSorted==false);
-
- return true;
- }
- //编码
- WORD CGameLogicOther::GetValue(BYTE uNum, BYTE uFangShu, BYTE PaiZhi)
- {
- WORD mcd = PaiZhi | (uFangShu << 6) | (uNum << 11);
- return mcd;
- }
- //解码
- BYTE CGameLogicOther::DeCodeCard(const WORD cbCardData)
- {
- //BYTE num = (cbCardData & 0x3800) >> 11;
- //BYTE fanshu = (cbCardData & 0x07C0) >> 6;
- BYTE TempCardData = cbCardData & 0x003F;
- return TempCardData;
- }
- //解码番薯
- BYTE CGameLogicOther::DeCodeFanshu(const WORD cbCardData)
- {
- //BYTE num = (cbCardData & 0x3800) >> 11;
- BYTE fanshu = (cbCardData & 0x07C0) >> 6;
- //BYTE TempCardData = cbCardData & 0x003F;
- return fanshu;
- }
-
- bool CGameLogicOther::PeiPai(BYTE ParZhi[MAX_REPERTORY])
- {
- std::ifstream in;
- std::string filename = "zuopai.dat";
- in.open(filename);
- if (!in.is_open())
- {
- return false;
- //ASSERT(false);
- }
- static BYTE TempCardData[MAX_REPERTORY];
-
- ZeroMemory(TempCardData, sizeof(TempCardData));
-
- BYTE tempCount = 0;
- char ch[1];
- while (!in.eof())
- {
- in.read(ch, 1);
- TempCardData[tempCount++] = ch[0];
- }
- in.close();
- for (BYTE i = 0; i < MAX_REPERTORY; i++)
- {
- ASSERT(i < MAX_REPERTORY);
- ParZhi[i] = TempCardData[MAX_REPERTORY - i - 1];
- }
-
- return true;
- }
- BYTE CGameLogicOther::GetEndCard(BYTE cbCardIndex[MAX_INDEX])
- {
- for (int i = MAX_INDEX - 1; i >= 0; i--)
- {
- if (cbCardIndex[i] > 0 )
- {
- return SwitchToCardData(i);
- }
- }
- ASSERT(false);
- return 1;
- }
- /*
- // 胡法分析函数
- */
-
- //中张(不带1和9)
- //bool CGameLogic::IsZhongZhang(const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
- //{
- // for (BYTE i = 0; i < MAX_INDEX; i++)
- // {
- // if (cbCardIndex[i] > 0)
- // {
- // BYTE cbCardValue = SwitchToCardData(i) & MASK_VALUE;
- // if (cbCardValue == 1 || cbCardValue == 9) return false;
- // }
- // }
- //
- // for (BYTE i = 0; i < cbWeaveCount; i++)
- // {
- // BYTE cbCardValue = WeaveItem[i].cbCenterCard & MASK_VALUE;
- //
- // if (WeaveItem[i].cbWeaveKind & WIK_LEFT)
- // {
- // if (cbCardValue == 1 || cbCardValue == 7) return false;
- // }
- // else if (WeaveItem[i].cbWeaveKind & WIK_CENTER)
- // {
- // if (cbCardValue == 2 || cbCardValue == 8) return false;
- // }
- // else if (WeaveItem[i].cbWeaveKind & WIK_RIGHT)
- // {
- // if (cbCardValue == 3 || cbCardValue == 9) return false;
- // }
- // else
- // {
- // if (cbCardValue == 1 || cbCardValue == 9) return false;
- // }
- // }
- //
- // return true;
- //}
- //大对子
- //bool CGameLogic::IsPengPeng( const tagAnalyseItem *pAnalyseItem )
- //{
- // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
- // {
- // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
- // return false;
- // }
- // return true;
- //}
- //清一色牌
- bool CGameLogicOther::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard)
- {
- //胡牌判断
- BYTE cbCardColor=0xFF;
- for (BYTE i=0;i<MAX_INDEX;i++)
- {
- if (cbCardIndex[i]!=0)
- {
- //花色判断
- if (cbCardColor!=0xFF)
- return false;
- //设置花色
- cbCardColor=(SwitchToCardData(i)&MASK_COLOR);
- //设置索引
- i=(i/9+1)*9-1;
- }
- }
- //组合判断
- for (BYTE i = 0; i<cbItemCount; i++)
- {
- BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
- if ((cbCenterCard&MASK_COLOR) != cbCardColor) return false;
- }
-
- //如果手上只有王霸
- //if( cbCardColor == 0xFF )
- //{
- // ASSERT( m_cbMagicIndex != MAX_INDEX && cbCardIndex[m_cbMagicIndex] > 0 );
- // //检查组合
- // ASSERT( cbItemCount > 0 );
- // cbCardColor = WeaveItem[0].cbCenterCard&MASK_COLOR;
- //}
- //if((cbCurrentCard&MASK_COLOR)!=cbCardColor && !IsMagicCard(cbCurrentCard) ) return false;
-
- return true;
- }
- //七小对牌
- //bool CGameLogic::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard)
- //{
- // //组合判断
- // if (cbWeaveCount!=0) return false;
- //
- // //单牌数目
- // BYTE cbReplaceCount = 0;
- //
- // //临时数据
- // BYTE cbCardIndexTemp[MAX_INDEX];
- // CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
- //
- // //插入数据
- // BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
- // cbCardIndexTemp[cbCurrentIndex]++;
- //
- // //计算单牌
- // for (BYTE i=0;i<MAX_INDEX;i++)
- // {
- // BYTE cbCardCount=cbCardIndexTemp[i];
- //
- // //王牌过滤
- // if( i == m_cbMagicIndex ) continue;
- //
- // //单牌统计
- // if( cbCardCount == 1 || cbCardCount == 3 ) cbReplaceCount++;
- // }
- //
- // //王牌不够
- // if( m_cbMagicIndex != MAX_INDEX && cbReplaceCount > cbCardIndexTemp[m_cbMagicIndex] ||
- // m_cbMagicIndex == MAX_INDEX && cbReplaceCount > 0 )
- // return false;
- //
- // return true;
- //
- //}
- //带幺
- //bool CGameLogic::IsDaiYao( const tagAnalyseItem *pAnalyseItem )
- //{
- // //检查牌眼
- // BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
- // if( cbCardValue != 1 && cbCardValue != 9 ) return false;
- //
- // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
- // {
- // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
- // {
- // BYTE j = 0;
- // for( ; j < 3; j++ )
- // {
- // cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
- // if( cbCardValue == 1 || cbCardValue == 9 ) break;
- // }
- // if( j == 3 ) return false;
- // }
- // else
- // {
- // cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
- // if( cbCardValue != 1 && cbCardValue != 9 ) return false;
- // }
- // }
- // return true;
- //}
-
- //将对
- //bool CGameLogic::IsJiangDui( const tagAnalyseItem *pAnalyseItem )
- //{
- // //是否大对子
- // if( !IsPengPeng(pAnalyseItem) ) return false;
- //
- // //检查牌眼
- // BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
- // if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
- //
- // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
- // {
- // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
- // {
- // BYTE j = 0;
- // for( ; j < 3; j++ )
- // {
- // cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
- // if( cbCardValue == 2 || cbCardValue == 5 || cbCardValue == 8 ) break;
- // }
- // if( j == 3 ) return false;
- // }
- // else
- // {
- // cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
- // if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
- // }
- // }
- // return true;
- //}
-
- //是否花猪,xueliu判断花猪牌型,false为花柱
- bool CGameLogicOther::IsHuaZhu(const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
- {
- BYTE cbColor[3] = { 0,0,0 };
- for( BYTE i = 0; i < MAX_INDEX; i++ )
- {
- if( cbCardIndex[i] > 0 )
- {
- BYTE cbCardColor = SwitchToCardData(i)&MASK_COLOR;
- cbColor[cbCardColor>>4]++;
-
- i = (i/9+1)*9-1;
- }
- }
- for( BYTE i = 0; i < cbWeaveCount; i++ )
- {
- BYTE cbCardColor = WeaveItem[i].cbCenterCard&MASK_COLOR;
- cbColor[cbCardColor>>4]++;
- }
-
- //if (INVALID_BYTE != cbDingque && 0 != cbColor[cbDingque])
- // return true;
-
- //缺一门就不是花猪
- for( BYTE i = 0; i < CountArray(cbColor); i++ )
- if( cbColor[i] == 0 ) return true;
-
- return false;
- }
- //是否碰碰胡
- bool CGameLogicOther::IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
- {
- BYTE cbCardCount = GetCardCount(cbCardIndex);
- BYTE DanCount = 0;
- BYTE DuiZiCount = 0;
- for (BYTE i = 0; i<MAX_INDEX; i++)
- {
- if (cbCardIndex[i] == 3)
- {
- DuiZiCount++;
- }
- if (cbCardIndex[i] == 2)
- {
- DanCount++;
- }
- }
- switch (cbCardCount)
- {
- case 2:
- if (DanCount == 1)
- return true;
- case 5:
- if (DuiZiCount == 1 && DanCount == 1)
- return true;
- case 8:
- if (DuiZiCount == 2 && DanCount == 1)
- return true;
- case 11:
- if (DuiZiCount == 3 && DanCount == 1)
- return true;
- case 14:
- if (DuiZiCount == 4 && DanCount == 1)
- return true;
- default:
- return false;
- }
- return false;
- }
- //////////////////////////////////////////////////////////////////////////
|