Files
wnmj/Servers/游戏组件/万年麻将/游戏服务器/GameLogic.cpp

2276 lines
49 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "GameLogic.h"
//////////////////////////////////////////////////////////////////////////
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
const BYTE CGameLogic::m_cbCardDataArray[MAX_REPERTORY]=
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //<2F><><EFBFBD><EFBFBD>
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //<2F><><EFBFBD><EFBFBD>
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //<2F><><EFBFBD><EFBFBD>
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //<2F><><EFBFBD><EFBFBD>
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //<2F><><EFBFBD><EFBFBD>
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //<2F><><EFBFBD><EFBFBD>
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //<2F><><EFBFBD><EFBFBD>
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //<2F><><EFBFBD><EFBFBD>
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //ͬ<><CDAC>
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //ͬ<><CDAC>
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //ͬ<><CDAC>
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //ͬ<><CDAC>
0x31,0x32,0x33,0x34,0x35,0x36,0x37, //<2F><><EFBFBD><EFBFBD>
0x31,0x32,0x33,0x34,0x35,0x36,0x37, //<2F><><EFBFBD><EFBFBD>
0x31,0x32,0x33,0x34,0x35,0x36,0x37, //<2F><><EFBFBD><EFBFBD>
0x31,0x32,0x33,0x34,0x35,0x36,0x37, //<2F><><EFBFBD><EFBFBD>
};
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CGameLogic::CGameLogic()
{
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CGameLogic::~CGameLogic()
{
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void CGameLogic::RandCardData(BYTE cbCardData[], BYTE cbMaxCount)
{
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
srand(GetTickCount() | (rand() << 8));
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
BYTE cbCardDataTemp[CountArray(m_cbCardDataArray)];
CopyMemory(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbRandCount=0,cbPosition=0;
do
{
cbPosition=rand()%(cbMaxCount-cbRandCount);
cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];
cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];
} while (cbRandCount<cbMaxCount);
return;
}
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard)
{
//Ч<><D0A7><EFBFBD>˿<EFBFBD>
ASSERT(IsValidCard(cbRemoveCard));
ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
if (cbCardIndex[cbRemoveIndex]>0)
{
cbCardIndex[cbRemoveIndex]--;
return true;
}
//ʧ<><CAA7>Ч<EFBFBD><D0A7>
ASSERT(FALSE);
return false;
}
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard[], BYTE cbRemoveCount)
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
for (BYTE i=0;i<cbRemoveCount;i++)
{
//Ч<><D0A7><EFBFBD>˿<EFBFBD>
ASSERT(IsValidCard(cbRemoveCard[i]));
ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
if (cbCardIndex[cbRemoveIndex]==0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
//<2F><>ԭɾ<D4AD><C9BE>
for (BYTE j=0;j<i;j++)
{
ASSERT(IsValidCard(cbRemoveCard[j]));
cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
}
return false;
}
else
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
--cbCardIndex[cbRemoveIndex];
}
}
return true;
}
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool CGameLogic::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, BYTE cbRemoveCard[], BYTE cbRemoveCount)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(cbCardCount<=MAX_COUNT);
ASSERT(cbRemoveCount<=cbCardCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbDeleteCount=0,cbTempCardData[MAX_COUNT];
if (cbCardCount>CountArray(cbTempCardData)) return false;
CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
for (BYTE i=0;i<cbRemoveCount;i++)
{
for (BYTE j=0;j<cbCardCount;j++)
{
if (cbRemoveCard[i]==cbTempCardData[j])
{
cbDeleteCount++;
cbTempCardData[j]=0;
break;
}
}
}
//<2F>ɹ<EFBFBD><C9B9>ж<EFBFBD>
if (cbDeleteCount!=cbRemoveCount)
{
ASSERT(FALSE);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbCardPos=0;
for (BYTE i=0;i<cbCardCount;i++)
{
if (cbTempCardData[i]!=0)
cbCardData[cbCardPos++]=cbTempCardData[i];
}
return true;
}
//<2F><>Ч<EFBFBD>ж<EFBFBD>
bool CGameLogic::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)));
}
//<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
BYTE CGameLogic::GetCardCount(BYTE cbCardIndex[MAX_INDEX])
{
//<2F><>Ŀͳ<C4BF><CDB3>
BYTE cbCardCount=0;
for (BYTE i=0;i<MAX_INDEX;i++)
cbCardCount+=cbCardIndex[i];
return cbCardCount;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
BYTE CGameLogic::GetWeaveCard(WORD wWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4])
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
switch (wWeaveKind)
{
case WIK_LEFT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard+1;
cbCardBuffer[2]=cbCenterCard+2;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
case WIK_RIGHT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-2;
cbCardBuffer[2]=cbCenterCard-1;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
case WIK_CENTER: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-1;
cbCardBuffer[0]=cbCenterCard;
cbCardBuffer[2]=cbCenterCard+1;
return 3;
}
case WIK_PENG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[0]=cbCenterCard;
cbCardBuffer[1]=cbCenterCard;
cbCardBuffer[2]=cbCenterCard;
return 3;
}
case WIK_GANG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[0]=cbCenterCard;
cbCardBuffer[1]=cbCenterCard;
cbCardBuffer[2]=cbCenterCard;
cbCardBuffer[3]=cbCenterCard;
return 4;
}
case WIK_DNBL: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard+1;
cbCardBuffer[2]=cbCenterCard+3;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
case WIK_DNBC: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-1;
cbCardBuffer[0]=cbCenterCard;
cbCardBuffer[2]=cbCenterCard+2;
return 3;
}
case WIK_DNBR: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-3;
cbCardBuffer[2]=cbCenterCard-2;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
case WIK_DXBL: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard+2;
cbCardBuffer[2]=cbCenterCard+3;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
case WIK_DXBC: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-2;
cbCardBuffer[0]=cbCenterCard;
cbCardBuffer[2]=cbCenterCard+1;
return 3;
}
case WIK_DXBR: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbCardBuffer[1]=cbCenterCard-3;
cbCardBuffer[2]=cbCenterCard-1;
cbCardBuffer[0]=cbCenterCard;
return 3;
}
default:
{
ASSERT(FALSE);
}
}
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
BYTE CGameLogic::GetUserActionRank(WORD wUserAction)
{
//<2F><><EFBFBD>Ƶȼ<C6B5>
if (wUserAction&WIK_CHI_HU) { return 4; }
//<2F><><EFBFBD>Ƶȼ<C6B5>
if (wUserAction&WIK_GANG) { return 3; }
//<2F><><EFBFBD>Ƶȼ<C6B5>
if (wUserAction&WIK_PENG) { return 2; }
//<2F><><EFBFBD>Ƶȼ<C6B5>
if (wUserAction&(WIK_RIGHT|WIK_CENTER|WIK_LEFT|WIK_DNBL|WIK_DNBC|WIK_DNBR|WIK_DXBL|WIK_DXBC|WIK_DXBR)) { return 1; }
return 0;
}
//<2F><><EFBFBD>Ƶȼ<C6B5>
BYTE CGameLogic::GetChiHuActionRank(tagChiHuResult & ChiHuResult)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbChiHuOrder=0;
WORD wChiHuRight=ChiHuResult.wChiHuRight;
WORD wChiHuKind=(ChiHuResult.wChiHuKind&0xFF00)>>4;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i=0;i<8;i++)
{
wChiHuKind>>=1;
if ((wChiHuKind&0x0001)!=0)
cbChiHuOrder++;
}
//Ȩλ<C8A8><CEBB><EFBFBD><EFBFBD>
for (BYTE i=0;i<16;i++)
{
wChiHuRight>>=1;
if ((wChiHuRight&0x0001)!=0)
cbChiHuOrder++;
}
return cbChiHuOrder;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD CGameLogic::EstimateEatCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(IsValidCard(cbCurrentCard));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbExcursion[3]={0,1,2};
WORD wItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT};
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD wEatKind=0;
BYTE cbFirstIndex=0;
BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
//<2F>з<EFBFBD><D0B7><EFBFBD>
if(cbCurrentIndex>=31)
{
for (BYTE i=0;i<CountArray(wItemKind);i++)
{
BYTE cbValueIndex=cbCurrentIndex%9;
if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=4))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
cbFirstIndex=cbCurrentIndex-cbExcursion[i];
//<2F><><EFBFBD><EFBFBD>
if(cbFirstIndex<31) 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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wEatKind|=wItemKind[i];
}
}
}
else if(cbCurrentIndex>=27)
{
for (BYTE i=0;i<CountArray(wItemKind);i++)
{
BYTE cbValueIndex=cbCurrentIndex%9;
if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=1))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
cbFirstIndex=cbCurrentIndex-cbExcursion[i];
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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wEatKind|=wItemKind[i];
}
}
}
else
{
for (BYTE i=0;i<CountArray(wItemKind);i++)
{
BYTE cbValueIndex=cbCurrentIndex%9;
if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
cbFirstIndex=cbCurrentIndex-cbExcursion[i];
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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wEatKind|=wItemKind[i];
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>׵<EFBFBD><D7B5><EFBFBD><EFBFBD><EFBFBD>
if(cbCurrentIndex>=27)
{
if(cbCurrentIndex==27)
{
if(cbCardIndex[28]>0&&cbCardIndex[30]>0)
wEatKind |=WIK_DNBL;
if(cbCardIndex[29]>0&&cbCardIndex[30]>0)
wEatKind |=WIK_DXBL;
}
if(cbCurrentIndex==28)
{
if(cbCardIndex[27]>0&&cbCardIndex[30]>0)
wEatKind |=WIK_DNBC;
}
if(cbCurrentIndex==29)
{
if(cbCardIndex[27]>0&&cbCardIndex[30]>0)
wEatKind |=WIK_DXBC;
}
if(cbCurrentIndex==30)
{
if(cbCardIndex[27]>0&&cbCardIndex[28]>0)
wEatKind |=WIK_DNBR;
if(cbCardIndex[27]>0&&cbCardIndex[29]>0)
wEatKind |=WIK_DXBR;
}
}
return wEatKind;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD CGameLogic::EstimatePengCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(IsValidCard(cbCurrentCard));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>=2)?WIK_PENG:WIK_NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD CGameLogic::EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(IsValidCard(cbCurrentCard));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL;
}
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
WORD CGameLogic::AnalyseGangCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
WORD wActionMask=WIK_NULL;
ZeroMemory(&GangCardResult,sizeof(GangCardResult));
//<2F><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
for (BYTE i=0;i<MAX_INDEX;i++)
{
if (cbCardIndex[i]==4)
{
wActionMask|=WIK_GANG;
GangCardResult.cbCardData[GangCardResult.cbCardCount++]=SwitchToCardData(i);
}
}
//<2F><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
for (BYTE i=0;i<cbWeaveCount;i++)
{
if (WeaveItem[i].wWeaveKind==WIK_PENG)
{
if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)]==1)
{
wActionMask|=WIK_GANG;
GangCardResult.cbCardData[GangCardResult.cbCardCount++]=WeaveItem[i].cbCenterCard;
}
}
}
return wActionMask;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
bool CGameLogic::AnalyseCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray,BYTE cbCurrentCard,bool bZimo)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
BYTE cbCardCount=0;
for (BYTE i=0;i<MAX_INDEX;i++)
cbCardCount+=cbCardIndex[i];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbTempCardIndex[MAX_INDEX];
CopyMemory(cbTempCardIndex,cbCardIndex,sizeof(cbTempCardIndex));
//Ч<><D0A7><EFBFBD><EFBFBD>Ŀ
ASSERT((cbCardCount>=2)&&(cbCardCount<=MAX_COUNT)&&((cbCardCount-2)%3==0));
if ((cbCardCount<2)||(cbCardCount>MAX_COUNT)||((cbCardCount-2)%3!=0)) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbKindItemCount=0;
tagKindItem KindItem[MAX_INDEX*2];
ZeroMemory(KindItem,sizeof(KindItem));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbLessKindItem=(cbCardCount-2)/3;
ASSERT((cbLessKindItem+cbWeaveCount)==4);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (cbLessKindItem == 0)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT((cbCardCount == 2) && (cbWeaveCount == 4));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
for (BYTE i = 0; i < MAX_INDEX; i++)
{
if (cbCardIndex[i] == 2)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagAnalyseItem AnalyseItem;
ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
for (BYTE j = 0; j < cbWeaveCount; j++)
{
AnalyseItem.wWeaveKind[j] = WeaveItem[j].wWeaveKind;
AnalyseItem.cbCenterCard[j] = WeaveItem[j].cbCenterCard;
}
AnalyseItem.cbCardEye = SwitchToCardData(i);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
AnalyseItemArray.Add(AnalyseItem);
return true;
}
}
return false;
}
//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
if (cbCardCount>=3)
{
for (BYTE i=0;i<MAX_INDEX;i++)
{
//ͬ<><CDAC><EFBFBD>ж<EFBFBD>
if (cbCardIndex[i]>=3)
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i;
KindItem[cbKindItemCount].cbCardIndex[2]=i;
KindItem[cbKindItemCount++].wWeaveKind=WIK_PENG;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((i<(MAX_INDEX-2-7))&&(cbCardIndex[i]>0)&&((i%9)<7))
{
for (BYTE j=1;j<=cbCardIndex[i];j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i=MAX_INDEX-7;i<MAX_INDEX-5;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
//<2F><><EFBFBD>ϱ<EFBFBD>
if(i==MAX_INDEX-7)
{
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+3]>=j))
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+3;
KindItem[cbKindItemCount++].wWeaveKind=WIK_DNBL;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(i==MAX_INDEX-7)
{
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+2]>=j)&&(cbCardIndex[i+3]>=j))
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+2;
KindItem[cbKindItemCount].cbCardIndex[2]=i+3;
KindItem[cbKindItemCount++].wWeaveKind=WIK_DXBL;
}
}
}
}
//<2F>з<EFBFBD><D0B7><EFBFBD>
for (BYTE i=MAX_INDEX-3;i<MAX_INDEX;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((i<(MAX_INDEX-2))&&(cbCardIndex[i]>0)&&((i%9)<7))
{
for (BYTE j=1;j<=cbCardIndex[i];j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
}
}
}
//<2F><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
if (cbKindItemCount>=cbLessKindItem)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
ZeroMemory(cbCardIndexTemp,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbIndex[MAX_WEAVE]={0,1,2,3};
tagKindItem * pKindItem[MAX_WEAVE];
ZeroMemory(&pKindItem,sizeof(pKindItem));
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
do
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
for (BYTE i=0;i<cbLessKindItem;i++)
pKindItem[i]=&KindItem[cbIndex[i]];
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
bool bEnoughCard=true;
for (BYTE i=0;i<cbLessKindItem*3;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbCardIndex=pKindItem[i/3]->cbCardIndex[i%3];
if (cbCardIndexTemp[cbCardIndex]==0)
{
bEnoughCard=false;
break;
}
else
cbCardIndexTemp[cbCardIndex]--;
}
//<2F>¹<EFBFBD><C2B9>ж<EFBFBD>
if (bEnoughCard == true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbCardEye = 0;
for (BYTE i = 0; i < MAX_INDEX; i++)
{
if (cbCardIndexTemp[i] == 2)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
cbCardEye = SwitchToCardData(i);
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbCardEye != 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagAnalyseItem AnalyseItem;
ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i = 0; i < cbWeaveCount; i++)
{
AnalyseItem.wWeaveKind[i] = WeaveItem[i].wWeaveKind;
AnalyseItem.cbCenterCard[i] = WeaveItem[i].cbCenterCard;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i = 0; i < cbLessKindItem; i++)
{
AnalyseItem.wWeaveKind[i + cbWeaveCount] = pKindItem[i]->wWeaveKind;
AnalyseItem.cbCenterCard[i + cbWeaveCount] = pKindItem[i]->cbCenterCard;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>滻;
AnalyseItem.cbWeaveKingReplace = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
AnalyseItem.cbCardEye = cbCardEye;
//<2F><><EFBFBD><EFBFBD><EFBFBD>滻;
AnalyseItem.cbEyeKingReplace = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AnalyseItemArray.Add(AnalyseItem);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbIndex[cbLessKindItem-1]==(cbKindItemCount-1))
{
BYTE i = 0;
for ( i=cbLessKindItem-1;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);
}
//Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (AnalyseItemArray.GetCount()>0)
return true;
//Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AnalyseItemArray.RemoveAll();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cbKindItemCount=0;
ZeroMemory(KindItem,sizeof(KindItem));
return false;
}
//<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
WORD CGameLogic::AnalyseChiHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo, bool bRealHu)
{
if (cbHuRule == eWNMJHURuleEnum_Invalid)
{
return WIK_NULL;
}
if (cbHuRule == eWNMJHURuleEnum_YingHU)
{
return AnalyseYingHuCard(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, wChiHuRight, ChiHuResult, bZimo, bRealHu);
}
else if (cbHuRule == eWNMJHURuleEnum_YiBianDaoHU)
{
return AnalyseYiBianDaoHuCard(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, wChiHuRight, ChiHuResult, bZimo, bRealHu);
}
else if (cbHuRule == eWNMJHURuleEnum_HunHU)
{
WORD wAction = AnalyseYiBianDaoHuCard(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, wChiHuRight, ChiHuResult, bZimo, bRealHu);
if ( wAction != WIK_NULL )
{
return wAction;
}
return AnalyseYingHuCard(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, wChiHuRight, ChiHuResult, bZimo, bRealHu);
}
return WIK_NULL;
}
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex)
{
ASSERT(cbCardIndex<MAX_INDEX);
ASSERT(cbCardIndex<34);
return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
}
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData)
{
ASSERT(IsValidCard(cbCardData));
////<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
//BYTE cbValue=cbCardData&MASK_VALUE;
//BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
}
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT],BYTE bMaxCount)
{
//ת<><D7AA><EFBFBD>˿<EFBFBD> <20><><EFBFBD>Ʒŵ<C6B7>ԭ<EFBFBD><D4AD>λ<EFBFBD><CEBB>
BYTE bPosition=0;
for (BYTE i=0;i<MAX_INDEX;i++)
{
if (cbCardIndex[i]!=0)
{
for (BYTE j=0;j<cbCardIndex[i];j++)
{
ASSERT(bPosition<bMaxCount);
cbCardData[bPosition++]=SwitchToCardData(i);
}
}
}
return bPosition;
}
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
//ת<><D7AA><EFBFBD>˿<EFBFBD>
for (BYTE i=0;i<cbCardCount;i++)
{
cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
}
return cbCardCount;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LONG CGameLogic::CalScore(tagChiHuResult & ChihuResult, LONG &lScore, LONG &lTimes, LONG &lExtScore, BYTE cbFan, bool bZhiAnGangFanbei)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
ASSERT(ChihuResult.wChiHuKind!=CHK_NULL);
if (ChihuResult.wChiHuKind== CHK_NULL) return 0;
//<2F><>ֵ<EFBFBD><D6B5>ʼ<EFBFBD><CABC>;
lTimes = 1L;
lExtScore = 0L;
//<2F><><EFBFBD><EFBFBD>
if (ChihuResult.wChiHuRight&CHR_QIANG_GANG)
{
lTimes *= 1;
}
//<2F>ܿ<EFBFBD>
if (ChihuResult.wChiHuRight&CHR_GANG_FLOWER)
{
lTimes *= 1;
}
//<2F><><EFBFBD><EFBFBD>
if (ChihuResult.wChiHuRight&CHR_TIAN)
{
lTimes *= 2;
}
//<2F>غ<EFBFBD>
if (ChihuResult.wChiHuRight&CHR_DI)
{
lTimes *= 2;
}
//7<><37>
if (ChihuResult.wChiHuKind&CHK_QI_DUI)
{
lTimes *= 2;
}
//13<31><33>
if (ChihuResult.wChiHuKind&CHK_THIRTEEN)
{
lTimes *= 1;
}
//<2F><><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD>;
if (ChihuResult.wChiHuKind&CHK_SERVEN)
{
lTimes *= 2;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (ChihuResult.wChiHuKind&CHK_PENG_PENG)
{
lTimes *= 2;
}
//<2F><>һɫ;
if (ChihuResult.wChiHuKind&CHK_HUNYISE)
{
lTimes *= 2;
}
//<2F><>һɫ;
if (ChihuResult.wChiHuKind&CHK_QINYISE)
{
lTimes *= 4;
}
//<2F><>һɫ;
if (ChihuResult.wChiHuKind&CHK_ZIYISE)
{
lTimes *= 16;
}
if ( cbFan == eWNMJRuleEnum_OneTwoFAN )
{
if (ChihuResult.wChiHuRight&CHR_GANG_FLOWER)
{
lTimes *= 2;
}
else
{
if (ChihuResult.wChiHuRight&CHR_ZI_MO)
{
lTimes *= 1;
}
else
{
lTimes *= 2;
}
}
}
else if ( cbFan == eWNMJRuleEnum_TwoThreeFAN )
{
if (ChihuResult.wChiHuRight&CHR_GANG_FLOWER)
{
lTimes *= 3;
}
else
{
if (ChihuResult.wChiHuRight&CHR_ZI_MO)
{
lTimes *= 2;
}
else
{
lTimes *= 3;
}
}
}
//<2F><><EFBFBD><EFBFBD>,<2C>غ<EFBFBD>,<2C><><EFBFBD><EFBFBD>,<2C>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (((ChihuResult.wChiHuRight&CHR_TIAN) || (ChihuResult.wChiHuRight&CHR_DI) || (ChihuResult.wChiHuRight&CHR_QIANG_GANG) || (ChihuResult.wChiHuRight&CHR_GANG_FLOWER))
&& ((ChihuResult.wChiHuRight&CHR_HAS_KING) != CHR_HAS_KING))
{
lTimes *= 2;
}
if (ChihuResult.wChiHuRight&CHR_GANG_FLOWER && !(ChihuResult.wChiHuRight&CHR_GANG_ZHONGSE))
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>ܵ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if ((ChihuResult.wChiHuKind&CHK_HUNYISE) || (ChihuResult.wChiHuKind&CHK_QINYISE))
{
if (cbFan == eWNMJRuleEnum_OneTwoFAN)
{
lTimes = 2;
}
else if (cbFan == eWNMJRuleEnum_TwoThreeFAN)
{
lTimes = 3;
}
}
else if (ChihuResult.wChiHuKind&CHK_ZIYISE)
{
if (cbFan == eWNMJRuleEnum_OneTwoFAN)
{
lTimes = 4;
}
else if (cbFan == eWNMJRuleEnum_TwoThreeFAN)
{
lTimes = 6;
}
}
}
int nMaxTimes = 0;
if (cbFan == eWNMJRuleEnum_OneTwoFAN)
{
nMaxTimes = 16;
}
else if (cbFan == eWNMJRuleEnum_TwoThreeFAN)
{
nMaxTimes = 24;
}
if (bZhiAnGangFanbei)
{
nMaxTimes *= 2;
}
if (lTimes > nMaxTimes)
{
lTimes = nMaxTimes;
}
return lTimes;
}
//13<31><33>
bool CGameLogic::IsNeatAlone(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo)
{
BYTE cbTempCardIndex[MAX_INDEX];
CopyMemory(cbTempCardIndex,cbCardIndex,sizeof(BYTE)*MAX_INDEX);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
BYTE cbCardCount=0;
for (BYTE i=0;i<MAX_INDEX;i++)
cbCardCount+=cbTempCardIndex[i];
//<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
if(cbCardCount<MAX_COUNT) return false;
//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD>ж<EFBFBD>
bool bRet=true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const BYTE COMMON_TYPE_SUM = 9;
for (BYTE i = 0; i<MAX_INDEX; i++)
{
//<2F>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
if(cbTempCardIndex[i] > 1)
{
bRet=false;
break;
}
}
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if(bRet)
{
BYTE* pKingIndex = 0;
for(BYTE i=0; i<3; i++)
{
pKingIndex = &cbTempCardIndex[i*COMMON_TYPE_SUM];
for(BYTE j=0; j<COMMON_TYPE_SUM; j++)
{
if(pKingIndex[j] > 0)
{
for(BYTE k=0; k<2; k++)
{
j ++;
if(j<COMMON_TYPE_SUM)
{
if(pKingIndex[j] > 0)
{
bRet= false;
break;
}
}
}
}
}
}
}
if(bRet)
{
//<2F>¹<EFBFBD><C2B9>ж<EFBFBD>
cbGerman=1;
return true;
}
return false;
}
//3˳ 3<><33>
bool CGameLogic::IsNeat3(const BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman)
{
//<2F>¹<EFBFBD>
cbGerman=1;
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbIndex[4]={0,1,2,3};
tagKindItem * pKindItem[4];
ZeroMemory(&pKindItem,sizeof(pKindItem));
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbCardCount = 0;
for(BYTE i=0; i<MAX_INDEX; i++)
{
cbCardCount += cbCardIndexTemp[i];
}
//Ч<><D0A7><EFBFBD><EFBFBD>Ŀ
ASSERT(cbCardCount<=14);
if((cbCardCount%3) != 0)
{
return false;
}
BYTE cbLessKindItem = cbCardCount/3;
if (cbLessKindItem == 0)
{
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbKindItemCount=0;
tagKindItem KindItem[MAX_INDEX-2];
ZeroMemory(KindItem,sizeof(KindItem));
for (BYTE i=0;i<MAX_INDEX;i++)
{
//ͬ<><CDAC><EFBFBD>ж<EFBFBD>
if (cbCardIndex[i]>=3)
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i;
KindItem[cbKindItemCount].cbCardIndex[2]=i;
KindItem[cbKindItemCount++].wWeaveKind=WIK_PENG;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((i<(MAX_INDEX-2-7))&&(cbCardIndex[i]>0)&&((i%9)<7))
{
for (BYTE j=1;j<=cbCardIndex[i];j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i=MAX_INDEX-7;i<MAX_INDEX-5;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
//<2F><><EFBFBD>ϱ<EFBFBD>
if(i==MAX_INDEX-7)
{
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+3]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+3;
KindItem[cbKindItemCount++].wWeaveKind=WIK_DNBL;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(i==MAX_INDEX-7)
{
for (BYTE j=1;j<=cbCardIndex[i]&&cbCardIndex[i]>0;j++)
{
if ((cbCardIndex[i+2]>=j)&&(cbCardIndex[i+3]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+2;
KindItem[cbKindItemCount].cbCardIndex[2]=i+3;
KindItem[cbKindItemCount++].wWeaveKind=WIK_DXBL;
}
}
}
}
//<2F>з<EFBFBD><D0B7><EFBFBD>
for (BYTE i=MAX_INDEX-3;i<MAX_INDEX;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((i<(MAX_INDEX-2))&&(cbCardIndex[i]>0)&&((i%9)<7))
{
for (BYTE j=1;j<=cbCardIndex[i];j++)
{
if ((cbCardIndex[i+1]>=j)&&(cbCardIndex[i+2]>=j))
{
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
KindItem[cbKindItemCount++].wWeaveKind=WIK_LEFT;
}
}
}
}
//<2F><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
if (cbKindItemCount>=cbLessKindItem)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
ZeroMemory(cbCardIndexTemp,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbIndex[4]={0,1,2,3};
tagKindItem * pKindItem[4];
ZeroMemory(&pKindItem,sizeof(pKindItem));
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
do
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
for (BYTE i=0;i<cbLessKindItem;i++)
{
pKindItem[i]=&KindItem[cbIndex[i]];
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
bool bEnoughCard=true;
for (BYTE i=0;i<cbLessKindItem*3;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbCardIndex=pKindItem[i/3]->cbCardIndex[i%3];
if (cbCardIndexTemp[cbCardIndex]==0)
{
bEnoughCard=false;
break;
}
else
{
cbCardIndexTemp[cbCardIndex]--;
}
}
if(bEnoughCard)
{
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbIndex[cbLessKindItem-1] == (cbKindItemCount-1))
{
BYTE i = 0;
for (i=cbLessKindItem-1;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);
}
//<2F>ǵ¹<C7B5>
cbGerman=0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cbKindItemCount=0;
ZeroMemory(KindItem,sizeof(KindItem));
//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
if (cbCardCount>=3)
{
for (BYTE i=0;i<MAX_INDEX;i++)
{
//ͬ<><CDAC><EFBFBD>ж<EFBFBD>
if (cbCardIndex[i]>=3)
{
ASSERT( cbKindItemCount < CountArray(KindItem) );
KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
KindItem[cbKindItemCount].cbCardIndex[0]=i;
KindItem[cbKindItemCount].cbCardIndex[1]=i;
KindItem[cbKindItemCount].cbCardIndex[2]=i;
KindItem[cbKindItemCount++].wWeaveKind=WIK_PENG;
}
}
}
//<2F><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
if (cbKindItemCount>=cbLessKindItem)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
ZeroMemory(cbCardIndexTemp,sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbIndex[MAX_WEAVE]={0,1,2,3};
tagKindItem * pKindItem[MAX_WEAVE];
ZeroMemory(&pKindItem,sizeof(pKindItem));
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
do
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
for (BYTE i=0;i<cbLessKindItem;i++)
pKindItem[i]=&KindItem[cbIndex[i]];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbIndex[cbLessKindItem-1] == (cbKindItemCount-1))
{
BYTE i = 0;
for (i=cbLessKindItem-1;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 false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>Ƿ<EFBFBD>ȫ2
bool CGameLogic::IsNeat2(BYTE cbCardIndex[MAX_INDEX],tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
{
//<2F><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>
if(cbWeaveCount>0) return false;
//<2F>¹<EFBFBD><C2B9>ж<EFBFBD>
for(BYTE i=0; i<MAX_INDEX; i++)
{
if(cbCardIndex[i] != 0 && cbCardIndex[i] != 2 &&cbCardIndex[i] != 4)
{
return false;
}
}
return true;
}
//<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
bool CGameLogic::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard,BYTE &cbGerman,bool bZimo)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
if (cbWeaveCount!=0) return false;
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>;
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
//<2F><>Ŀ<EFBFBD><C4BF>֤;
ASSERT(GetCardCount(cbCardIndexTemp)%2==0);
if(GetCardCount(cbCardIndexTemp)%2 !=0) return false;
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>;
BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
//<2F><><EFBFBD><EFBFBD><E3B5A5>;
for (BYTE i=0;i<MAX_INDEX;i++)
{
BYTE cbCardCount=cbCardIndexTemp[i];
//<2F><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>;
if( cbCardCount == 1 || cbCardCount == 3 ) return false;
}
return true;
}
//7<><37>
bool CGameLogic::ServenStar(BYTE cbCardIndex[MAX_INDEX], BYTE &cbGerman, BYTE cbCurrentCard, bool bZimo, bool bChongfeng)
{
cbGerman=0;
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
if (!bChongfeng)
{ //ȫ<><C8AB><EFBFBD><EFBFBD>;
bool bRet = false;
bool bAlone = IsNeatAlone(cbCardIndexTemp, cbGerman, cbCurrentCard, bZimo);
if (bAlone == false)
{
return false;
}
}
//7<><37><EFBFBD><EFBFBD>¼
BYTE cbHasFeng[7];
ZeroMemory(cbHasFeng,sizeof(cbHasFeng));
for(int i=27; i<34; i++)
{
cbHasFeng[i-27]=cbCardIndexTemp[i];
if (!bChongfeng)
{
//<2F>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>;
if (cbHasFeng[i - 27] > 1) return false;
}
}
//7<><37>ȫ
int j=0;
for (int i=0;i<7;i++)
{
if(cbHasFeng[i]>0)
j++;
}
if(j==7)
{
return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><E3B8B1>
BYTE CGameLogic::GetKingFromBrother(BYTE cbBrotherData)
{
if(IsValidCard(cbBrotherData) == false)
{
return 0xFF;
}
BYTE cbColor = cbBrotherData & MASK_COLOR;
BYTE cbValue = (cbBrotherData & MASK_VALUE) + 1;
//<2F><> <20><> Ͳ
if(cbColor != 0x30)
{
if(cbValue > 0x09)
{
cbValue = 0x01;
}
}
else if(cbValue < 0x06)
{
if(cbValue > 0x04)
{
cbValue = 0x01;
}
}
else
{
if(cbValue > 0x07)
{
cbValue = 0x05;
}
}
return (cbColor | cbValue);
}
void CGameLogic::GetCardRemoveRepeat(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT], BYTE &nCount)
{
nCount = 0;
for (BYTE i = 0; i < MAX_INDEX; ++i)
{
if (cbCardIndex[i] > 0)
{
cbCardData[nCount] = SwitchToCardData(i);
++nCount;
}
}
}
BYTE CGameLogic::AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo /*= false*/, bool bTurnAll, bool bRealTing)
{ //<2F><><EFBFBD><EFBFBD>ͣ<EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
WORD wChiHuKind = CHK_NULL;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>;
ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>;
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
BYTE cbRemoveRepeat = 0;
BYTE cbCardDataRemoveRepeat[MAX_COUNT] = { 0 };
GetCardRemoveRepeat(cbCardIndexTemp, cbCardDataRemoveRepeat, cbRemoveRepeat);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>;
if (cbCurrentCard != 0)
cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
if ( bZimo )
{
cbCardDataRemoveRepeat[cbRemoveRepeat] = cbCurrentCard;
++cbRemoveRepeat;
}
if (!bTurnAll)
{
for (BYTE i = 0; i < cbRemoveRepeat; ++i)
{
RemoveCard(cbCardIndexTemp, cbCardDataRemoveRepeat[i]);
for (BYTE j = 0; j < MAX_INDEX; j++)
{
BYTE cbCurrentCardTemp = SwitchToCardData(j);
if (WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCardTemp, wChiHuRight, ChiHuResult, cbHuRule, bZimo, false))
{
if (IsCheckZhongSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, ChiHuResult, cbHuRule, bRealTing))
{
ChiHuResult.wChiHuRight |= CHR_HAS_KING;
return WIK_CHI_HU;
}
}
}
cbCardIndexTemp[SwitchToCardIndex(cbCardDataRemoveRepeat[i])]++;
}
}
else
{
tagChiHuResult tempChiHuResult;
bool bHuPai = false;
for (BYTE i = 0; i < cbRemoveRepeat; ++i)
{
RemoveCard(cbCardIndexTemp, cbCardDataRemoveRepeat[i]);
for (BYTE j = 0; j < MAX_INDEX; j++)
{
BYTE cbCurrentCardTemp = SwitchToCardData(j);
if (WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCardTemp, wChiHuRight, tempChiHuResult, cbHuRule, bZimo, false))
{
if (IsCheckZhongSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, tempChiHuResult, cbHuRule, bRealTing))
{
bHuPai = true;
tempChiHuResult.wChiHuRight |= CHR_HAS_KING;
CompareChiHuResult( ChiHuResult, tempChiHuResult );
}
}
}
cbCardIndexTemp[SwitchToCardIndex(cbCardDataRemoveRepeat[i])]++;
}
if (bHuPai)
{
return WIK_CHI_HU;
}
}
return WIK_NULL;
}
bool CGameLogic::IsTingCard(const BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount,
BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult& ChiHuResult, BYTE cbHuRule, bool bZimo /*= true*/, bool bTurnAll /*= false*/)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
if (!bTurnAll)
{
for (BYTE i = 0; i < MAX_INDEX; i++)
{
BYTE cbCurrentCardTemp = SwitchToCardData(i);
if (WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCardTemp, wChiHuRight, ChiHuResult, cbHuRule, bZimo, false))
{
if (IsCheckZhongSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, ChiHuResult, cbHuRule, true))
return true;
}
}
}
else
{
tagChiHuResult tempChiHuResult;
bool bHuPai = false;
for (BYTE i = 0; i < MAX_INDEX; i++)
{
BYTE cbCurrentCardTemp = SwitchToCardData(i);
if (WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCardTemp, wChiHuRight, tempChiHuResult, cbHuRule, bZimo, false))
{
if (IsCheckZhongSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, tempChiHuResult, cbHuRule, true))
{
bHuPai = true;
tempChiHuResult.wChiHuRight |= CHR_HAS_KING;
CompareChiHuResult(ChiHuResult, tempChiHuResult);
}
}
}
if (bHuPai)
{
return true;
}
}
return false;
}
//<2F><>һɫ<D2BB><C9AB>
bool CGameLogic::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard)
{
//<2F><><EFBFBD>ƺ<EFBFBD><C6BA>ж<EFBFBD>;
BYTE cbCardColor = 0xFF;
for (BYTE i = 0; i < MAX_INDEX; i++)
{
if (cbCardIndex[i] != 0)
{
//<2F><>ɫ<EFBFBD>ж<EFBFBD>;
if (cbCardColor != 0xFF)
return false;
//<2F><><EFBFBD>û<EFBFBD>ɫ;
cbCardColor = (SwitchToCardData(i)&MASK_COLOR);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;(<28><>һ<EFBFBD>ֻ<EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><><D6B1><EFBFBD><EFBFBD>9λ,<2C>ҵ<EFBFBD><D2B5>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ɫ);
i = (i / 9 + 1) * 9 - 1;
}
}
if ((cbCurrentCard&MASK_COLOR) != cbCardColor) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
for (BYTE i = 0; i < cbItemCount; i++)
{
BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
if ((cbCenterCard&MASK_COLOR) != cbCardColor) return false;
}
return true;
}
bool CGameLogic::IsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard)
{
BYTE cbCardColor = 0xFF;
BYTE cbCardIndexTemp[MAX_INDEX] = {0};
memcpy(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
BYTE cbCardDataIndex = SwitchToCardIndex(cbCurrentCard);
cbCardIndexTemp[cbCardDataIndex]++;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
for (BYTE i = 0; i < cbItemCount; i++)
{
BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
BYTE cbCardDataIndex = SwitchToCardIndex(cbCenterCard);
cbCardIndexTemp[cbCardDataIndex]++;
}
for (BYTE i = 0; i < (MAX_INDEX - 7); i++)
{
if (cbCardIndexTemp[i] != 0)
{
//<2F><>ɫ<EFBFBD>ж<EFBFBD>;
if (cbCardColor != 0xFF)
return false;
//<2F><><EFBFBD>û<EFBFBD>ɫ;
cbCardColor = (SwitchToCardData(i)&MASK_COLOR);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;(<28><>һ<EFBFBD>ֻ<EFBFBD>ɫ<EFBFBD><C9AB>ɫ<EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><><D6B1><EFBFBD><EFBFBD>9λ,<2C>ҵ<EFBFBD><D2B5>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ɫ);
i = (i / 9 + 1) * 9 - 1;
}
}
return true;
}
bool CGameLogic::IsZiPai(BYTE cbCardData)
{
return ((cbCardData&MASK_COLOR) == 0x30);
}
bool CGameLogic::IsZiYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard)
{
if (!IsZiPai(cbCurrentCard)) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
for (BYTE i = 0; i < cbItemCount; i++)
{
BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
if (!IsZiPai(cbCenterCard)) return false;
}
for (BYTE i = 0; i < (MAX_INDEX - 7); i++)
{
if (cbCardIndex[i] != 0)
{
return false;
}
}
return true;
}
WORD CGameLogic::AnalyseYingHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo /*= false*/, bool bRealHu /*= true*/)
{
BYTE cbValue = cbCurrentCard&MASK_VALUE;
BYTE cbColor = (cbCurrentCard&MASK_COLOR) >> 4;
if (bRealHu && (cbColor < 3) && (cbValue < 5))
{ //5<><35><EFBFBD>µIJ<C2B5><C4B2>ܺ<EFBFBD>;(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>׿<EFBFBD><D7BF>Ժ<EFBFBD>);
return WIK_NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wChiHuKind = CHK_NULL;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if (cbCurrentCard != 0)
cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
//<2F><>ģȨλ
if (bZimo)
{
wChiHuRight |= CHR_ZI_MO;
}
//Ȩλ<C8A8><CEBB><EFBFBD><EFBFBD> <20>ܺ<EFBFBD>+<2B><><EFBFBD><EFBFBD> = <20><><EFBFBD>ϻ<EFBFBD>
if ((wChiHuRight&CHR_QIANG_GANG) && (wChiHuRight&CHR_ZI_MO))
{
wChiHuRight &= ~CHR_QIANG_GANG;
wChiHuRight &= ~CHR_ZI_MO;
wChiHuRight |= CHR_GANG_FLOWER;
}
//<2F>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD>
BYTE bGerman = 0;
//7<><37>
if (cbWeaveCount == 0 && ServenStar(cbCardIndexTemp, bGerman, cbCurrentCard, bZimo) == true)
{
////<2F><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>б<EFBFBD>Ȩλ;
//wChiHuRight &= ~CHR_HAS_KING;
ChiHuResult.wChiHuKind = CHK_SERVEN;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
bGerman = 0;
//13<31><33>
if (cbWeaveCount == 0 && IsNeatAlone(cbCardIndexTemp, bGerman, cbCurrentCard, bZimo) == true)
{
ChiHuResult.wChiHuKind = CHK_THIRTEEN;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
bGerman = 0;
//7С<37>Է<EFBFBD><D4B7><EFBFBD>
if (cbWeaveCount == 0 && IsQiXiaoDui(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCard, bGerman, bZimo))
{
wChiHuKind = CHK_QI_DUI;
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static CAnalyseItemArray AnalyseItemArray;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
AnalyseItemArray.RemoveAll();
ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray, cbCurrentCard, bZimo);
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
if (AnalyseItemArray.GetCount() > 0)
{
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
for (INT_PTR i = 0; i < AnalyseItemArray.GetCount(); i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bLianCard = false, bPengCard = false;
bool bGerman = true;
tagAnalyseItem * pAnalyseItem = &AnalyseItemArray[i];
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
for (BYTE j = 0; j < CountArray(pAnalyseItem->wWeaveKind); j++)
{
WORD wWeaveKind = pAnalyseItem->wWeaveKind[j];
bPengCard = ((wWeaveKind&(WIK_GANG | WIK_PENG)) != 0) ? true : bPengCard;
bLianCard = ((wWeaveKind&(WIK_CHI)) != 0) ? true : bLianCard;
}
bGerman = (pAnalyseItem->cbWeaveKingReplace || pAnalyseItem->cbEyeKingReplace) ? false : bGerman;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
ASSERT((bLianCard == true) || (bPengCard == true));
//<2F><><EFBFBD><EFBFBD>
if ((bLianCard == true) && (bPengCard == true))
wChiHuKind |= CHK_JI_HU;
if ((bLianCard == true) && (bPengCard == false))
wChiHuKind |= CHK_JI_HU;
if ((bLianCard == false) && (bPengCard == true))
wChiHuKind |= CHK_JI_HU; //wChiHuKind |= CHK_PENG_PENG;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (wChiHuKind != CHK_NULL)
{
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight = wChiHuRight;
return WIK_CHI_HU;
}
return WIK_NULL;
}
WORD CGameLogic::AnalyseYiBianDaoHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo /*= false*/, bool bRealHu /*= true*/)
{
BYTE cbValue = cbCurrentCard&MASK_VALUE;
BYTE cbColor = (cbCurrentCard&MASK_COLOR) >> 4;
if (bRealHu && (cbColor < 3) && (cbValue < 5))
{ //5<><35><EFBFBD>µIJ<C2B5><C4B2>ܺ<EFBFBD>;(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>׿<EFBFBD><D7BF>Ժ<EFBFBD>);
return WIK_NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wChiHuKind = CHK_NULL;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if (cbCurrentCard != 0)
cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
//<2F><>ģȨλ
if (bZimo)
{
wChiHuRight |= CHR_ZI_MO;
}
//Ȩλ<C8A8><CEBB><EFBFBD><EFBFBD> <20>ܺ<EFBFBD>+<2B><><EFBFBD><EFBFBD> = <20><><EFBFBD>ϻ<EFBFBD>
if ((wChiHuRight&CHR_QIANG_GANG) && (wChiHuRight&CHR_ZI_MO))
{
wChiHuRight &= ~CHR_QIANG_GANG;
wChiHuRight &= ~CHR_ZI_MO;
wChiHuRight |= CHR_GANG_FLOWER;
}
//<2F>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD>;
BYTE bGerman = 0;
//7<><37>
if (cbWeaveCount == 0 && ServenStar(cbCardIndexTemp, bGerman, cbCurrentCard, bZimo) == true)
{
ChiHuResult.wChiHuKind = CHK_SERVEN;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
bGerman = 0;
//7С<37>Է<EFBFBD><D4B7><EFBFBD>
if (cbWeaveCount == 0 && IsQiXiaoDui(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCard, bGerman, bZimo))
{
if (IsZiYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
wChiHuKind = (CHK_QI_DUI | CHK_ZIYISE);
}
else if (IsQingYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
wChiHuKind = (CHK_QI_DUI | CHK_QINYISE);
}
else if (IsHunYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
wChiHuKind = (CHK_QI_DUI | CHK_HUNYISE);
}
else
{
wChiHuKind = CHK_QI_DUI;
}
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static CAnalyseItemArray AnalyseItemArray;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
AnalyseItemArray.RemoveAll();
ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray, cbCurrentCard, bZimo);
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
if (AnalyseItemArray.GetCount() > 0)
{
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
for (INT_PTR i = 0; i < AnalyseItemArray.GetCount(); i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bLianCard = false, bPengCard = false;
bool bGerman = true;
tagAnalyseItem * pAnalyseItem = &AnalyseItemArray[i];
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
for (BYTE j = 0; j < CountArray(pAnalyseItem->wWeaveKind); j++)
{
WORD wWeaveKind = pAnalyseItem->wWeaveKind[j];
bPengCard = ((wWeaveKind&(WIK_GANG | WIK_PENG)) != 0) ? true : bPengCard;
bLianCard = ((wWeaveKind&(WIK_CHI)) != 0) ? true : bLianCard;
}
bGerman = (pAnalyseItem->cbWeaveKingReplace || pAnalyseItem->cbEyeKingReplace) ? false : bGerman;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
ASSERT((bLianCard == true) || (bPengCard == true));
//<2F><><EFBFBD><EFBFBD>;
if ((bLianCard == true) && (bPengCard == true))
wChiHuKind |= CHK_JI_HU;
if ((bLianCard == true) && (bPengCard == false))
wChiHuKind |= CHK_JI_HU;
if ((bLianCard == false) && (bPengCard == true))
wChiHuKind |= CHK_PENG_PENG;
}
}
//<2F><>һɫ<D2BB><C9AB><EFBFBD><EFBFBD>;
if (IsZiYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
if (wChiHuKind == WIK_NULL)
{ //û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>Ƶ<EFBFBD><C6B5><EFBFBD>һɫ<D2BB><C9AB>Ȩλ;
wChiHuRight |= CHR_INVALIDHU_ZIYISE;
}
wChiHuKind |= CHK_ZIYISE;
wChiHuKind &= (~CHK_JI_HU);
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
//<2F><>һɫ<D2BB><C9AB><EFBFBD><EFBFBD>;
if ((wChiHuKind != CHK_NULL) && IsQingYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
wChiHuKind |= CHK_QINYISE;
wChiHuKind &= (~CHK_JI_HU);
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
//<2F><>һɫ<D2BB><C9AB><EFBFBD><EFBFBD>;
if ((wChiHuKind != CHK_NULL) && IsHunYiSe(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard))
{
wChiHuKind |= CHK_HUNYISE;
wChiHuKind &= (~CHK_JI_HU);
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight |= wChiHuRight;
return WIK_CHI_HU;
}
if (wChiHuKind == CHK_JI_HU)
{ //ֻ<>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD>,<2C>Ͳ<EFBFBD><CDB2><EFBFBD>һ<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>;
wChiHuKind = CHK_NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
if (wChiHuKind != CHK_NULL)
{
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
ChiHuResult.wChiHuKind = wChiHuKind;
ChiHuResult.wChiHuRight = wChiHuRight;
return WIK_CHI_HU;
}
return WIK_NULL;
}
bool CGameLogic::IsCheckZhongSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard, tagChiHuResult & ChiHuResult, BYTE cbRule, bool bTing)
{
if (ChiHuResult.wChiHuKind & CHK_ZIYISE)
{
if (IsZiYiSe(cbCardIndex, WeaveItem, cbItemCount, cbCurrentCard))
{
ChiHuResult.wChiHuRight &= (~CHR_INVALIDHU_ZIYISE);
ChiHuResult.wChiHuRight |= CHR_GANG_ZHONGSE;
}
else
{
if (ChiHuResult.wChiHuRight & CHR_INVALIDHU_ZIYISE)
{ //û<>ܵ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һɫ<D2BB><C9AB><EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD><><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һɫ<D2BB><C9AB><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ϳɺ<CFB3><C9BA><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
ChiHuResult.wChiHuKind = WIK_NULL;
}
else
{
if (!bTing)
{
ChiHuResult.wChiHuKind &= (~CHK_ZIYISE);
}
else
{
if (ChiHuResult.wChiHuKind & (~CHK_ZIYISE))
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>һɫȨλ;
ChiHuResult.wChiHuKind &= (~CHK_ZIYISE);
}
}
//<2F><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD>һɫ<D2BB><C9AB><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (IsHunYiSe(cbCardIndex, WeaveItem, cbItemCount, cbCurrentCard))
{
ChiHuResult.wChiHuKind &= (~CHK_ZIYISE);
ChiHuResult.wChiHuKind |= CHK_HUNYISE;
ChiHuResult.wChiHuRight |= CHR_GANG_ZHONGSE;
}
}
}
}
else if(ChiHuResult.wChiHuKind & CHK_QINYISE)
{
if (IsQingYiSe(cbCardIndex, WeaveItem, cbItemCount, cbCurrentCard))
{
ChiHuResult.wChiHuRight |= CHR_GANG_ZHONGSE;
}
else
{
if (!bTing)
{
ChiHuResult.wChiHuKind &= (~CHK_QINYISE);
}
else
{
if (ChiHuResult.wChiHuKind & (~CHK_QINYISE))
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>һɫȨλ;
ChiHuResult.wChiHuKind &= (~CHK_QINYISE);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD>һɫ<D2BB><C9AB><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (IsHunYiSe(cbCardIndex, WeaveItem, cbItemCount, cbCurrentCard))
{
ChiHuResult.wChiHuKind &= (~CHK_QINYISE);
ChiHuResult.wChiHuKind |= CHK_HUNYISE;
ChiHuResult.wChiHuRight |= CHR_GANG_ZHONGSE;
}
}
}
else if (ChiHuResult.wChiHuKind & CHK_HUNYISE)
{
if (IsHunYiSe(cbCardIndex, WeaveItem, cbItemCount, cbCurrentCard))
{
ChiHuResult.wChiHuRight |= CHR_GANG_ZHONGSE;
}
else
{
if (!bTing)
{
ChiHuResult.wChiHuKind &= (~CHK_HUNYISE);
}
else
{
if (ChiHuResult.wChiHuKind & (~CHK_HUNYISE))
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>һɫȨλ;
ChiHuResult.wChiHuKind &= (~CHK_HUNYISE);
}
}
}
}
if (ChiHuResult.wChiHuKind == CHK_SERVEN)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>;
BYTE cbCardIndexTemp[MAX_INDEX];
CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>;
if (cbCurrentCard != 0)
cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
//<2F>ٴ<EFBFBD><D9B4>ж<EFBFBD>ʱ,<2C><><EFBFBD><EFBFBD>ʱ<EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><E3B6BC><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><E6BBBB>;
BYTE bGerman = 0;
bool bZimo = false;
bool bReal = ServenStar(cbCardIndexTemp, bGerman, cbCurrentCard, bZimo, true);
if (!bReal)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (cbRule == eWNMJHURuleEnum_YiBianDaoHU)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
ChiHuResult.wChiHuKind = CHK_NULL;
}
else
{ //<2F><><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD>;
ChiHuResult.wChiHuKind = CHK_THIRTEEN;
}
}
}
if ( ChiHuResult.wChiHuKind == CHK_NULL )
{
ChiHuResult.wChiHuRight = 0;
return false;
}
return true;
}
void CGameLogic::CompareChiHuResult(tagChiHuResult& destChiHuResult, tagChiHuResult& tempChiHuResult)
{
if (destChiHuResult.wChiHuKind == CHK_NULL)
{
destChiHuResult = tempChiHuResult;
}
else
{
if (destChiHuResult.wChiHuKind < tempChiHuResult.wChiHuKind)
{
if (tempChiHuResult.wChiHuKind >= CHK_HUNYISE)
{
if (tempChiHuResult.wChiHuRight & CHR_GANG_ZHONGSE)
{
destChiHuResult = tempChiHuResult;
}
}
else
{
destChiHuResult = tempChiHuResult;
}
}
else
{
if (destChiHuResult.wChiHuKind >= CHK_HUNYISE)
{
if (!(destChiHuResult.wChiHuRight & CHR_GANG_ZHONGSE))
{
destChiHuResult = tempChiHuResult;
}
}
}
}
}
//////////////////////////////////////////////////////////////////////////