1443 lines
40 KiB
C++
1443 lines
40 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "GameLogic.h"
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
const BYTE cbIndexCount=5;
|
|||
|
|
|
|||
|
|
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
const BYTE CGameLogic::m_cbCardData[FULL_COUNT]=
|
|||
|
|
{
|
|||
|
|
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D, //<2F><><EFBFBD><EFBFBD> A - K
|
|||
|
|
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D, //÷<><C3B7> A - K
|
|||
|
|
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, //<2F><><EFBFBD><EFBFBD> A - K
|
|||
|
|
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, //<2F><><EFBFBD><EFBFBD> A - K
|
|||
|
|
0x4E,0x4F,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const BYTE CGameLogic::m_cbGoodcardData[GOOD_CARD_COUTN] =
|
|||
|
|
{
|
|||
|
|
0x01, 0x11, 0x21, 0x31,
|
|||
|
|
0x02, 0x12, 0x22, 0x32,
|
|||
|
|
0x4E, 0x4F,
|
|||
|
|
0x1A, 0x1B, 0x1C, 0x1D,
|
|||
|
|
0x2A, 0x2B, 0x2C, 0x2D,
|
|||
|
|
0x3A, 0x3B, 0x3C, 0x3D
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CGameLogic::CGameLogic()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CGameLogic::~CGameLogic()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::GetCardType(const BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
switch (cbCardCount)
|
|||
|
|
{
|
|||
|
|
case 0: //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
case 1: //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return CT_SINGLE;
|
|||
|
|
}
|
|||
|
|
case 2: //<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E)) return CT_MISSILE_CARD;
|
|||
|
|
if (GetCardLogicValue(cbCardData[0])==GetCardLogicValue(cbCardData[1])) return CT_DOUBLE;
|
|||
|
|
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult;
|
|||
|
|
AnalysebCardData(cbCardData,cbCardCount,AnalyseResult);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (AnalyseResult.cbBlockCount[3]>0)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==4)) return CT_BOMB_CARD;
|
|||
|
|
if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==6)) return CT_FOUR_TAKE_ONE;
|
|||
|
|
if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==8)&&(AnalyseResult.cbBlockCount[1]==2)) return CT_FOUR_TAKE_TWO;
|
|||
|
|
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (AnalyseResult.cbBlockCount[2]>0)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (AnalyseResult.cbBlockCount[2]>1)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[2][0];
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (cbFirstLogicValue>=15) return CT_ERROR;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
for (BYTE i=1;i<AnalyseResult.cbBlockCount[2];i++)
|
|||
|
|
{
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[2][i*3];
|
|||
|
|
if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if( cbCardCount == 3 ) return CT_THREE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (AnalyseResult.cbBlockCount[2]*3==cbCardCount) return CT_THREE_LINE;
|
|||
|
|
if (AnalyseResult.cbBlockCount[2]*4==cbCardCount) return CT_THREE_TAKE_ONE;
|
|||
|
|
if ((AnalyseResult.cbBlockCount[2]*5==cbCardCount)&&(AnalyseResult.cbBlockCount[1]==AnalyseResult.cbBlockCount[2])) return CT_THREE_TAKE_TWO;
|
|||
|
|
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (AnalyseResult.cbBlockCount[1]>=3)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[1][0];
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (cbFirstLogicValue>=15) return CT_ERROR;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
for (BYTE i=1;i<AnalyseResult.cbBlockCount[1];i++)
|
|||
|
|
{
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[1][i*2];
|
|||
|
|
if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((AnalyseResult.cbBlockCount[1]*2)==cbCardCount) return CT_DOUBLE_LINE;
|
|||
|
|
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((AnalyseResult.cbBlockCount[0]>=5)&&(AnalyseResult.cbBlockCount[0]==cbCardCount))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[0][0];
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (cbFirstLogicValue>=15) return CT_ERROR;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
for (BYTE i=1;i<AnalyseResult.cbBlockCount[0];i++)
|
|||
|
|
{
|
|||
|
|
BYTE cbCardData=AnalyseResult.cbCardData[0][i];
|
|||
|
|
if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return CT_SINGLE_LINE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
VOID CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType)
|
|||
|
|
{
|
|||
|
|
//<2F><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
|
|||
|
|
if (cbCardCount==0) return;
|
|||
|
|
if (cbSortType==ST_CUSTOM) return;
|
|||
|
|
|
|||
|
|
//ת<><D7AA><EFBFBD><EFBFBD>ֵ
|
|||
|
|
BYTE cbSortValue[MAX_COUNT];
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++) cbSortValue[i]=GetCardLogicValue(cbCardData[i]);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool bSorted=true;
|
|||
|
|
BYTE cbSwitchData=0,cbLast=cbCardCount-1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
bSorted=true;
|
|||
|
|
for (BYTE i=0;i<cbLast;i++)
|
|||
|
|
{
|
|||
|
|
if ((cbSortValue[i]<cbSortValue[i+1])||
|
|||
|
|
((cbSortValue[i]==cbSortValue[i+1])&&(cbCardData[i]<cbCardData[i+1])))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD>־
|
|||
|
|
bSorted=false;
|
|||
|
|
|
|||
|
|
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbSwitchData=cbCardData[i];
|
|||
|
|
cbCardData[i]=cbCardData[i+1];
|
|||
|
|
cbCardData[i+1]=cbSwitchData;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ȩλ
|
|||
|
|
cbSwitchData=cbSortValue[i];
|
|||
|
|
cbSortValue[i]=cbSortValue[i+1];
|
|||
|
|
cbSortValue[i+1]=cbSwitchData;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
cbLast--;
|
|||
|
|
} while(bSorted==false);
|
|||
|
|
|
|||
|
|
//<2F><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
|
|||
|
|
if (cbSortType==ST_COUNT)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardIndex=0;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult;
|
|||
|
|
AnalysebCardData(&cbCardData[cbCardIndex],cbCardCount-cbCardIndex,AnalyseResult);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD>˿<EFBFBD>
|
|||
|
|
for (BYTE i=0;i<CountArray(AnalyseResult.cbBlockCount);i++)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbIndex=CountArray(AnalyseResult.cbBlockCount)-i-1;
|
|||
|
|
CopyMemory(&cbCardData[cbCardIndex],AnalyseResult.cbCardData[cbIndex],AnalyseResult.cbBlockCount[cbIndex]*(cbIndex+1)*sizeof(BYTE));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbCardIndex+=AnalyseResult.cbBlockCount[cbIndex]*(cbIndex+1)*sizeof(BYTE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
VOID CGameLogic::RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><D7BC>
|
|||
|
|
BYTE cbCardData[CountArray(m_cbCardData)];
|
|||
|
|
CopyMemory(cbCardData,m_cbCardData,sizeof(m_cbCardData));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbRandCount=0,cbPosition=0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
cbPosition=rand()%(cbBufferCount-cbRandCount);
|
|||
|
|
cbCardBuffer[cbRandCount++]=cbCardData[cbPosition];
|
|||
|
|
cbCardData[cbPosition]=cbCardData[cbBufferCount-cbRandCount];
|
|||
|
|
} while (cbRandCount<cbBufferCount);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
|
|||
|
|
bool CGameLogic::RemoveCardList(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (cbDeleteCount!=cbRemoveCount) return false;
|
|||
|
|
|
|||
|
|
ZeroMemory(cbCardData,cbCardCount*sizeof(cbCardData[0]));
|
|||
|
|
//<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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
|
|||
|
|
bool CGameLogic::RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (cbDeleteCount!=cbRemoveCount) 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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
|
|||
|
|
bool CGameLogic::RemoveCardEx(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(cbRemoveCount <= cbCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbDeleteCount = 0;
|
|||
|
|
BYTE cbTempCardData[FULL_COUNT] = {0};
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (cbDeleteCount != cbRemoveCount) 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><C3B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void CGameLogic::GetGoodCardData(BYTE cbGoodCardData[NORMAL_COUNT])
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><D7BC>
|
|||
|
|
BYTE cbCardData[CountArray(m_cbGoodcardData)];
|
|||
|
|
BYTE cbCardBuffer[CountArray(m_cbGoodcardData)];
|
|||
|
|
CopyMemory(cbCardData, m_cbGoodcardData, sizeof(m_cbGoodcardData));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbRandCount = 0, cbPosition = 0;
|
|||
|
|
BYTE cbBufferCount = CountArray(m_cbGoodcardData);
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
cbPosition = rand() % (cbBufferCount - cbRandCount);
|
|||
|
|
cbCardBuffer[cbRandCount++] = cbCardData[cbPosition];
|
|||
|
|
cbCardData[cbPosition] = cbCardData[cbBufferCount - cbRandCount];
|
|||
|
|
} while (cbRandCount < cbBufferCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
|
|||
|
|
CopyMemory(cbGoodCardData, cbCardBuffer, NORMAL_COUNT);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
VOID CGameLogic::SortOutCardList(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardType = GetCardType(cbCardData,cbCardCount);
|
|||
|
|
|
|||
|
|
if( cbCardType == CT_THREE_TAKE_ONE || cbCardType == CT_THREE_TAKE_TWO )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult = {};
|
|||
|
|
AnalysebCardData( cbCardData,cbCardCount,AnalyseResult );
|
|||
|
|
|
|||
|
|
cbCardCount = AnalyseResult.cbBlockCount[2]*3;
|
|||
|
|
CopyMemory( cbCardData,AnalyseResult.cbCardData[2],sizeof(BYTE)*cbCardCount );
|
|||
|
|
for( int i = CountArray(AnalyseResult.cbBlockCount)-1; i >= 0; i-- )
|
|||
|
|
{
|
|||
|
|
if( i == 2 ) continue;
|
|||
|
|
|
|||
|
|
if( AnalyseResult.cbBlockCount[i] > 0 )
|
|||
|
|
{
|
|||
|
|
CopyMemory( &cbCardData[cbCardCount],AnalyseResult.cbCardData[i],
|
|||
|
|
sizeof(BYTE)*(i+1)*AnalyseResult.cbBlockCount[i] );
|
|||
|
|
cbCardCount += (i+1)*AnalyseResult.cbBlockCount[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if( cbCardType == CT_FOUR_TAKE_ONE || cbCardType == CT_FOUR_TAKE_TWO )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult = {};
|
|||
|
|
AnalysebCardData( cbCardData,cbCardCount,AnalyseResult );
|
|||
|
|
|
|||
|
|
cbCardCount = AnalyseResult.cbBlockCount[3]*4;
|
|||
|
|
CopyMemory( cbCardData,AnalyseResult.cbCardData[3],sizeof(BYTE)*cbCardCount );
|
|||
|
|
for( int i = CountArray(AnalyseResult.cbBlockCount)-1; i >= 0; i-- )
|
|||
|
|
{
|
|||
|
|
if( i == 3 ) continue;
|
|||
|
|
|
|||
|
|
if( AnalyseResult.cbBlockCount[i] > 0 )
|
|||
|
|
{
|
|||
|
|
CopyMemory( &cbCardData[cbCardCount],AnalyseResult.cbCardData[i],
|
|||
|
|
sizeof(BYTE)*(i+1)*AnalyseResult.cbBlockCount[i] );
|
|||
|
|
cbCardCount += (i+1)*AnalyseResult.cbBlockCount[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><EFBFBD><DFBC><EFBFBD>ֵ
|
|||
|
|
BYTE CGameLogic::GetCardLogicValue(BYTE cbCardData)
|
|||
|
|
{
|
|||
|
|
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardColor=GetCardColor(cbCardData);
|
|||
|
|
BYTE cbCardValue=GetCardValue(cbCardData);
|
|||
|
|
|
|||
|
|
if(cbCardValue<=0 || cbCardValue>(MASK_VALUE&0x4f))
|
|||
|
|
return 0 ;
|
|||
|
|
ASSERT(cbCardValue>0 && cbCardValue<=(MASK_VALUE&0x4f));
|
|||
|
|
|
|||
|
|
//ת<><D7AA><EFBFBD><EFBFBD>ֵ
|
|||
|
|
if (cbCardColor==0x40) return cbCardValue+2;
|
|||
|
|
return (cbCardValue<=2)?(cbCardValue+13):cbCardValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>
|
|||
|
|
bool CGameLogic::CompareCard(const BYTE cbFirstCard[], const BYTE cbNextCard[], BYTE cbFirstCount, BYTE cbNextCount)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbNextType=GetCardType(cbNextCard,cbNextCount);
|
|||
|
|
BYTE cbFirstType=GetCardType(cbFirstCard,cbFirstCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (cbNextType==CT_ERROR) return false;
|
|||
|
|
if (cbNextType==CT_MISSILE_CARD) return true;
|
|||
|
|
|
|||
|
|
//ը<><D5A8><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((cbFirstType!=CT_BOMB_CARD)&&(cbNextType==CT_BOMB_CARD)) return true;
|
|||
|
|
if ((cbFirstType==CT_BOMB_CARD)&&(cbNextType!=CT_BOMB_CARD)) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((cbFirstType!=cbNextType)||(cbFirstCount!=cbNextCount)) return false;
|
|||
|
|
|
|||
|
|
//<2F><>ʼ<EFBFBD>Ա<EFBFBD>
|
|||
|
|
switch (cbNextType)
|
|||
|
|
{
|
|||
|
|
case CT_SINGLE:
|
|||
|
|
case CT_DOUBLE:
|
|||
|
|
case CT_THREE:
|
|||
|
|
case CT_SINGLE_LINE:
|
|||
|
|
case CT_DOUBLE_LINE:
|
|||
|
|
case CT_THREE_LINE:
|
|||
|
|
case CT_BOMB_CARD:
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>ֵ
|
|||
|
|
BYTE cbNextLogicValue=GetCardLogicValue(cbNextCard[0]);
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(cbFirstCard[0]);
|
|||
|
|
|
|||
|
|
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>
|
|||
|
|
return cbNextLogicValue>cbFirstLogicValue;
|
|||
|
|
}
|
|||
|
|
case CT_THREE_TAKE_ONE:
|
|||
|
|
case CT_THREE_TAKE_TWO:
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult NextResult;
|
|||
|
|
tagAnalyseResult FirstResult;
|
|||
|
|
AnalysebCardData(cbNextCard,cbNextCount,NextResult);
|
|||
|
|
AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>ֵ
|
|||
|
|
BYTE cbNextLogicValue=GetCardLogicValue(NextResult.cbCardData[2][0]);
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(FirstResult.cbCardData[2][0]);
|
|||
|
|
|
|||
|
|
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>
|
|||
|
|
return cbNextLogicValue>cbFirstLogicValue;
|
|||
|
|
}
|
|||
|
|
case CT_FOUR_TAKE_ONE:
|
|||
|
|
case CT_FOUR_TAKE_TWO:
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult NextResult;
|
|||
|
|
tagAnalyseResult FirstResult;
|
|||
|
|
AnalysebCardData(cbNextCard,cbNextCount,NextResult);
|
|||
|
|
AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>ֵ
|
|||
|
|
BYTE cbNextLogicValue=GetCardLogicValue(NextResult.cbCardData[3][0]);
|
|||
|
|
BYTE cbFirstLogicValue=GetCardLogicValue(FirstResult.cbCardData[3][0]);
|
|||
|
|
|
|||
|
|
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>
|
|||
|
|
return cbNextLogicValue>cbFirstLogicValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE CGameLogic::MakeCardData(BYTE cbValueIndex, BYTE cbColorIndex)
|
|||
|
|
{
|
|||
|
|
return (cbColorIndex<<4)|(cbValueIndex+1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
VOID CGameLogic::AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
ZeroMemory(&AnalyseResult,sizeof(AnalyseResult));
|
|||
|
|
|
|||
|
|
//<2F>˿˷<CBBF><CBB7><EFBFBD>
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbSameCount=1,cbCardValueTemp=0;
|
|||
|
|
BYTE cbLogicValue=GetCardLogicValue(cbCardData[i]);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
for (BYTE j=i+1;j<cbCardCount;j++)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD>˿<EFBFBD>
|
|||
|
|
if (GetCardLogicValue(cbCardData[j])!=cbLogicValue) break;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
cbSameCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(cbSameCount > 4)
|
|||
|
|
{
|
|||
|
|
ASSERT(FALSE);
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
BYTE cbIndex=AnalyseResult.cbBlockCount[cbSameCount-1]++;
|
|||
|
|
for (BYTE j=0;j<cbSameCount;j++) AnalyseResult.cbCardData[cbSameCount-1][cbIndex*cbSameCount+j]=cbCardData[i+j];
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
i+=cbSameCount-1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD>
|
|||
|
|
VOID CGameLogic::AnalysebDistributing(const BYTE cbCardData[], BYTE cbCardCount, tagDistributing & Distributing)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
ZeroMemory(&Distributing,sizeof(Distributing));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
if (cbCardData[i]==0) continue;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbCardColor=GetCardColor(cbCardData[i]);
|
|||
|
|
BYTE cbCardValue=GetCardValue(cbCardData[i]);
|
|||
|
|
|
|||
|
|
//<2F>ֲ<EFBFBD><D6B2><EFBFBD>Ϣ
|
|||
|
|
Distributing.cbCardCount++;
|
|||
|
|
Distributing.cbDistributing[cbCardValue-1][cbIndexCount]++;
|
|||
|
|
Distributing.cbDistributing[cbCardValue-1][cbCardColor>>4]++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::SearchOutCard( const BYTE cbHandCardData[], BYTE cbHandCardCount, const BYTE cbTurnCardData[], BYTE cbTurnCardCount,
|
|||
|
|
tagSearchCardResult *pSearchCardResult )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
ASSERT( pSearchCardResult != NULL );
|
|||
|
|
if( pSearchCardResult == NULL ) return 0;
|
|||
|
|
|
|||
|
|
ZeroMemory(pSearchCardResult,sizeof(tagSearchCardResult));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbResultCount = 0;
|
|||
|
|
tagSearchCardResult tmpSearchCardResult = {};
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCardData[MAX_COUNT];
|
|||
|
|
BYTE cbCardCount=cbHandCardCount;
|
|||
|
|
CopyMemory(cbCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
SortCardList(cbCardData,cbCardCount,ST_ORDER);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbTurnOutType=GetCardType(cbTurnCardData,cbTurnCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
|
|||
|
|
switch (cbTurnOutType)
|
|||
|
|
{
|
|||
|
|
case CT_ERROR: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
ASSERT( pSearchCardResult );
|
|||
|
|
if( !pSearchCardResult ) return 0;
|
|||
|
|
|
|||
|
|
//<2F>Ƿ<EFBFBD>һ<EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>
|
|||
|
|
if( GetCardType(cbCardData,cbCardCount) != CT_ERROR )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = cbCardCount;
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],cbCardData,
|
|||
|
|
sizeof(BYTE)*cbCardCount );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>Ʋ<EFBFBD><C6B2>ǵ<EFBFBD><C7B5>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|||
|
|
BYTE cbSameCount = 0;
|
|||
|
|
if( cbCardCount > 1 && GetCardValue(cbCardData[cbCardCount-1]) == GetCardValue(cbCardData[cbCardCount-2]) )
|
|||
|
|
{
|
|||
|
|
cbSameCount = 1;
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][0] = cbCardData[cbCardCount-1];
|
|||
|
|
BYTE cbCardValue = GetCardValue(cbCardData[cbCardCount-1]);
|
|||
|
|
for( int i = cbCardCount-2; i >= 0; i-- )
|
|||
|
|
{
|
|||
|
|
if( GetCardValue(cbCardData[i]) == cbCardValue )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][cbSameCount++] = cbCardData[i];
|
|||
|
|
}
|
|||
|
|
else break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = cbSameCount;
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbTmpCount = 0;
|
|||
|
|
if( cbSameCount != 1 )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = SearchSameCard( cbCardData,cbCardCount,0,1,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
if( cbSameCount != 2 )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = SearchSameCard( cbCardData,cbCardCount,0,2,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
if( cbSameCount != 3 )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = SearchSameCard( cbCardData,cbCardCount,0,3,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
cbTmpCount = SearchTakeCardType( cbCardData,cbCardCount,0,3,1,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
cbTmpCount = SearchTakeCardType( cbCardData,cbCardCount,0,3,2,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
cbTmpCount = SearchLineCardType( cbCardData,cbCardCount,0,1,0,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
cbTmpCount = SearchLineCardType( cbCardData,cbCardCount,0,2,0,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
cbTmpCount = SearchLineCardType( cbCardData,cbCardCount,0,3,0,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
////<2F>ɻ<EFBFBD>
|
|||
|
|
//cbTmpCount = SearchThreeTwoLine( cbCardData,cbCardCount,&tmpSearchCardResult );
|
|||
|
|
//if( cbTmpCount > 0 )
|
|||
|
|
//{
|
|||
|
|
// pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
// CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
// sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
// cbResultCount++;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//ը<><D5A8>
|
|||
|
|
if( cbSameCount != 4 )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = SearchSameCard( cbCardData,cbCardCount,0,4,&tmpSearchCardResult );
|
|||
|
|
if( cbTmpCount > 0 )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[0];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[0],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[0] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if ((cbCardCount>=2)&&(cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = 2;
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][0] = cbCardData[0];
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][1] = cbCardData[1];
|
|||
|
|
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
return cbResultCount;
|
|||
|
|
}
|
|||
|
|
case CT_SINGLE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case CT_DOUBLE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case CT_THREE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbReferCard=cbTurnCardData[0];
|
|||
|
|
BYTE cbSameCount = 1;
|
|||
|
|
if( cbTurnOutType == CT_DOUBLE ) cbSameCount = 2;
|
|||
|
|
else if( cbTurnOutType == CT_THREE ) cbSameCount = 3;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
cbResultCount = SearchSameCard( cbCardData,cbCardCount,cbReferCard,cbSameCount,pSearchCardResult );
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case CT_SINGLE_LINE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case CT_DOUBLE_LINE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case CT_THREE_LINE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbBlockCount = 1;
|
|||
|
|
if( cbTurnOutType == CT_DOUBLE_LINE ) cbBlockCount = 2;
|
|||
|
|
else if( cbTurnOutType == CT_THREE_LINE ) cbBlockCount = 3;
|
|||
|
|
|
|||
|
|
BYTE cbLineCount = cbTurnCardCount/cbBlockCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbResultCount = SearchLineCardType( cbCardData,cbCardCount,cbTurnCardData[0],cbBlockCount,cbLineCount,pSearchCardResult );
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case CT_THREE_TAKE_ONE: //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
case CT_THREE_TAKE_TWO: //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( cbCardCount < cbTurnCardCount ) break;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( cbTurnCardCount == 4 || cbTurnCardCount == 5 )
|
|||
|
|
{
|
|||
|
|
BYTE cbTakeCardCount = cbTurnOutType==CT_THREE_TAKE_ONE?1:2;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbResultCount = SearchTakeCardType( cbCardData,cbCardCount,cbTurnCardData[2],3,cbTakeCardCount,pSearchCardResult );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbBlockCount = 3;
|
|||
|
|
BYTE cbLineCount = cbTurnCardCount/(cbTurnOutType==CT_THREE_TAKE_ONE?4:5);
|
|||
|
|
BYTE cbTakeCardCount = cbTurnOutType==CT_THREE_TAKE_ONE?1:2;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbTmpTurnCard[MAX_COUNT] = {};
|
|||
|
|
CopyMemory( cbTmpTurnCard,cbTurnCardData,sizeof(BYTE)*cbTurnCardCount );
|
|||
|
|
SortOutCardList( cbTmpTurnCard,cbTurnCardCount );
|
|||
|
|
cbResultCount = SearchLineCardType( cbCardData,cbCardCount,cbTmpTurnCard[0],cbBlockCount,cbLineCount,pSearchCardResult );
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
bool bAllDistill = true;
|
|||
|
|
for( BYTE i = 0; i < cbResultCount; i++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbResultIndex = cbResultCount-i-1;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbTmpCardData[MAX_COUNT];
|
|||
|
|
BYTE cbTmpCardCount = cbCardCount;
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CopyMemory( cbTmpCardData,cbCardData,sizeof(BYTE)*cbCardCount );
|
|||
|
|
VERIFY( RemoveCard( pSearchCardResult->cbResultCard[cbResultIndex],pSearchCardResult->cbCardCount[cbResultIndex],
|
|||
|
|
cbTmpCardData,cbTmpCardCount ) );
|
|||
|
|
cbTmpCardCount -= pSearchCardResult->cbCardCount[cbResultIndex];
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagAnalyseResult TmpResult = {};
|
|||
|
|
AnalysebCardData( cbTmpCardData,cbTmpCardCount,TmpResult );
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>
|
|||
|
|
BYTE cbDistillCard[MAX_COUNT] = {};
|
|||
|
|
BYTE cbDistillCount = 0;
|
|||
|
|
for( BYTE j = cbTakeCardCount-1; j < CountArray(TmpResult.cbBlockCount); j++ )
|
|||
|
|
{
|
|||
|
|
if( TmpResult.cbBlockCount[j] > 0 )
|
|||
|
|
{
|
|||
|
|
if( j+1 == cbTakeCardCount && TmpResult.cbBlockCount[j] >= cbLineCount )
|
|||
|
|
{
|
|||
|
|
BYTE cbTmpBlockCount = TmpResult.cbBlockCount[j];
|
|||
|
|
CopyMemory( cbDistillCard,&TmpResult.cbCardData[j][(cbTmpBlockCount-cbLineCount)*(j+1)],
|
|||
|
|
sizeof(BYTE)*(j+1)*cbLineCount );
|
|||
|
|
cbDistillCount = (j+1)*cbLineCount;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
for( BYTE k = 0; k < TmpResult.cbBlockCount[j]; k++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbTmpBlockCount = TmpResult.cbBlockCount[j];
|
|||
|
|
CopyMemory( &cbDistillCard[cbDistillCount],&TmpResult.cbCardData[j][(cbTmpBlockCount-k-1)*(j+1)],
|
|||
|
|
sizeof(BYTE)*cbTakeCardCount );
|
|||
|
|
cbDistillCount += cbTakeCardCount;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == cbTakeCardCount*cbLineCount ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == cbTakeCardCount*cbLineCount ) break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == cbTakeCardCount*cbLineCount )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
|
|||
|
|
BYTE cbCount = pSearchCardResult->cbCardCount[cbResultIndex];
|
|||
|
|
CopyMemory( &pSearchCardResult->cbResultCard[cbResultIndex][cbCount],cbDistillCard,
|
|||
|
|
sizeof(BYTE)*cbDistillCount );
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultIndex] += cbDistillCount;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
bAllDistill = false;
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultIndex] = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( !bAllDistill )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
cbResultCount = 0;
|
|||
|
|
for( BYTE i = 0; i < pSearchCardResult->cbSearchCount; i++ )
|
|||
|
|
{
|
|||
|
|
if( pSearchCardResult->cbCardCount[i] != 0 )
|
|||
|
|
{
|
|||
|
|
tmpSearchCardResult.cbCardCount[cbResultCount] = pSearchCardResult->cbCardCount[i];
|
|||
|
|
CopyMemory( tmpSearchCardResult.cbResultCard[cbResultCount],pSearchCardResult->cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*pSearchCardResult->cbCardCount[i] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
tmpSearchCardResult.cbSearchCount = cbResultCount;
|
|||
|
|
CopyMemory( pSearchCardResult,&tmpSearchCardResult,sizeof(tagSearchCardResult) );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case CT_FOUR_TAKE_ONE: //<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case CT_FOUR_TAKE_TWO: //<2F>Ĵ<EFBFBD><C4B4><EFBFBD>˫
|
|||
|
|
{
|
|||
|
|
BYTE cbTakeCount = cbTurnOutType==CT_FOUR_TAKE_ONE?1:2;
|
|||
|
|
|
|||
|
|
BYTE cbTmpTurnCard[MAX_COUNT] = {};
|
|||
|
|
CopyMemory( cbTmpTurnCard,cbTurnCardData,sizeof(BYTE)*cbTurnCardCount );
|
|||
|
|
SortOutCardList( cbTmpTurnCard,cbTurnCardCount );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbResultCount = SearchTakeCardType( cbCardData,cbCardCount,cbTmpTurnCard[0],4,cbTakeCount,pSearchCardResult );
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ը<EFBFBD><D5A8>
|
|||
|
|
if ((cbCardCount>=4)&&(cbTurnOutType!=CT_MISSILE_CARD))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbReferCard = 0;
|
|||
|
|
if (cbTurnOutType==CT_BOMB_CARD) cbReferCard=cbTurnCardData[0];
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ը<EFBFBD><D5A8>
|
|||
|
|
BYTE cbTmpResultCount = SearchSameCard( cbCardData,cbCardCount,cbReferCard,4,&tmpSearchCardResult );
|
|||
|
|
for( BYTE i = 0; i < cbTmpResultCount; i++ )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSearchCardResult.cbCardCount[i];
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSearchCardResult.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*tmpSearchCardResult.cbCardCount[i] );
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (cbTurnOutType!=CT_MISSILE_CARD&&(cbCardCount>=2)&&(cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = 2;
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][0] = cbCardData[0];
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][1] = cbCardData[1];
|
|||
|
|
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
return cbResultCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::SearchSameCard( const BYTE cbHandCardData[], BYTE cbHandCardCount, BYTE cbReferCard, BYTE cbSameCardCount,
|
|||
|
|
tagSearchCardResult *pSearchCardResult )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
ZeroMemory(pSearchCardResult,sizeof(tagSearchCardResult));
|
|||
|
|
BYTE cbResultCount = 0;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCardData[MAX_COUNT];
|
|||
|
|
BYTE cbCardCount=cbHandCardCount;
|
|||
|
|
CopyMemory(cbCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
SortCardList(cbCardData,cbCardCount,ST_ORDER);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult = {};
|
|||
|
|
AnalysebCardData( cbCardData,cbCardCount,AnalyseResult );
|
|||
|
|
|
|||
|
|
BYTE cbReferLogicValue = cbReferCard==0?0:GetCardLogicValue(cbReferCard);
|
|||
|
|
BYTE cbBlockIndex = cbSameCardCount-1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
for( BYTE i = 0; i < AnalyseResult.cbBlockCount[cbBlockIndex]; i++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbIndex = (AnalyseResult.cbBlockCount[cbBlockIndex]-i-1)*(cbBlockIndex+1);
|
|||
|
|
if( GetCardLogicValue(AnalyseResult.cbCardData[cbBlockIndex][cbIndex]) > cbReferLogicValue )
|
|||
|
|
{
|
|||
|
|
if( pSearchCardResult == NULL ) return 1;
|
|||
|
|
|
|||
|
|
ASSERT( cbResultCount < CountArray(pSearchCardResult->cbCardCount) );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],&AnalyseResult.cbCardData[cbBlockIndex][cbIndex],
|
|||
|
|
cbSameCardCount*sizeof(BYTE) );
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = cbSameCardCount;
|
|||
|
|
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
cbBlockIndex++;
|
|||
|
|
}while( cbBlockIndex < CountArray(AnalyseResult.cbBlockCount) );
|
|||
|
|
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
return cbResultCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ĵ<EFBFBD>һ<EFBFBD><D2BB>)
|
|||
|
|
BYTE CGameLogic::SearchTakeCardType( const BYTE cbHandCardData[], BYTE cbHandCardCount, BYTE cbReferCard, BYTE cbSameCount, BYTE cbTakeCardCount,
|
|||
|
|
tagSearchCardResult *pSearchCardResult )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
ZeroMemory(pSearchCardResult,sizeof(tagSearchCardResult));
|
|||
|
|
BYTE cbResultCount = 0;
|
|||
|
|
|
|||
|
|
//Ч<><D0A7>
|
|||
|
|
ASSERT( cbSameCount == 3 || cbSameCount == 4 );
|
|||
|
|
ASSERT( cbTakeCardCount == 1 || cbTakeCardCount == 2 );
|
|||
|
|
if( cbSameCount != 3 && cbSameCount != 4 )
|
|||
|
|
return cbResultCount;
|
|||
|
|
if( cbTakeCardCount != 1 && cbTakeCardCount != 2 )
|
|||
|
|
return cbResultCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if( cbSameCount == 4 && cbHandCardCount<cbSameCount+cbTakeCardCount*2 ||
|
|||
|
|
cbHandCardCount < cbSameCount+cbTakeCardCount )
|
|||
|
|
return cbResultCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCardData[MAX_COUNT];
|
|||
|
|
BYTE cbCardCount=cbHandCardCount;
|
|||
|
|
CopyMemory(cbCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
SortCardList(cbCardData,cbCardCount,ST_ORDER);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
tagSearchCardResult SameCardResult = {};
|
|||
|
|
BYTE cbSameCardResultCount = SearchSameCard( cbCardData,cbCardCount,cbReferCard,cbSameCount,&SameCardResult );
|
|||
|
|
|
|||
|
|
if( cbSameCardResultCount > 0 )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagAnalyseResult AnalyseResult;
|
|||
|
|
AnalysebCardData(cbCardData,cbCardCount,AnalyseResult);
|
|||
|
|
|
|||
|
|
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbNeedCount = cbSameCount+cbTakeCardCount;
|
|||
|
|
if( cbSameCount == 4 ) cbNeedCount += cbTakeCardCount;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
for( BYTE i = 0; i < cbSameCardResultCount; i++ )
|
|||
|
|
{
|
|||
|
|
bool bMerge = false;
|
|||
|
|
|
|||
|
|
for( BYTE j = cbTakeCardCount-1; j < CountArray(AnalyseResult.cbBlockCount); j++ )
|
|||
|
|
{
|
|||
|
|
for( BYTE k = 0; k < AnalyseResult.cbBlockCount[j]; k++ )
|
|||
|
|
{
|
|||
|
|
//<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbIndex = (AnalyseResult.cbBlockCount[j]-k-1)*(j+1);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
if( GetCardValue(SameCardResult.cbResultCard[i][0]) ==
|
|||
|
|
GetCardValue(AnalyseResult.cbCardData[j][cbIndex]) )
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
|
|||
|
|
BYTE cbCount = SameCardResult.cbCardCount[i];
|
|||
|
|
CopyMemory( &SameCardResult.cbResultCard[i][cbCount],&AnalyseResult.cbCardData[j][cbIndex],
|
|||
|
|
sizeof(BYTE)*cbTakeCardCount );
|
|||
|
|
SameCardResult.cbCardCount[i] += cbTakeCardCount;
|
|||
|
|
|
|||
|
|
if( SameCardResult.cbCardCount[i] < cbNeedCount ) continue;
|
|||
|
|
|
|||
|
|
if( pSearchCardResult == NULL ) return 1;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],SameCardResult.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*SameCardResult.cbCardCount[i] );
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = SameCardResult.cbCardCount[i];
|
|||
|
|
cbResultCount++;
|
|||
|
|
|
|||
|
|
bMerge = true;
|
|||
|
|
|
|||
|
|
//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( bMerge ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
return cbResultCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::SearchLineCardType( const BYTE cbHandCardData[], BYTE cbHandCardCount, BYTE cbReferCard, BYTE cbBlockCount, BYTE cbLineCount,
|
|||
|
|
tagSearchCardResult *pSearchCardResult )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
ZeroMemory(pSearchCardResult,sizeof(tagSearchCardResult));
|
|||
|
|
BYTE cbResultCount = 0;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbLessLineCount = 0;
|
|||
|
|
if( cbLineCount == 0 )
|
|||
|
|
{
|
|||
|
|
if( cbBlockCount == 1 )
|
|||
|
|
cbLessLineCount = 5;
|
|||
|
|
else if( cbBlockCount == 2 )
|
|||
|
|
cbLessLineCount = 3;
|
|||
|
|
else cbLessLineCount = 2;
|
|||
|
|
}
|
|||
|
|
else cbLessLineCount = cbLineCount;
|
|||
|
|
|
|||
|
|
BYTE cbReferIndex = 2;
|
|||
|
|
if( cbReferCard != 0 )
|
|||
|
|
{
|
|||
|
|
ASSERT( GetCardLogicValue(cbReferCard)-cbLessLineCount>=2 );
|
|||
|
|
cbReferIndex = GetCardLogicValue(cbReferCard)-cbLessLineCount+1;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>A
|
|||
|
|
if( cbReferIndex+cbLessLineCount > 14 ) return cbResultCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if( cbHandCardCount < cbLessLineCount*cbBlockCount ) return cbResultCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCardData[MAX_COUNT];
|
|||
|
|
BYTE cbCardCount=cbHandCardCount;
|
|||
|
|
CopyMemory(cbCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
SortCardList(cbCardData,cbCardCount,ST_ORDER);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
tagDistributing Distributing = {};
|
|||
|
|
AnalysebDistributing(cbCardData,cbCardCount,Distributing);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>
|
|||
|
|
BYTE cbTmpLinkCount = 0;
|
|||
|
|
BYTE cbValueIndex = cbReferIndex;
|
|||
|
|
for (;cbValueIndex<13;cbValueIndex++)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ( Distributing.cbDistributing[cbValueIndex][cbIndexCount]<cbBlockCount )
|
|||
|
|
{
|
|||
|
|
if( cbTmpLinkCount < cbLessLineCount )
|
|||
|
|
{
|
|||
|
|
cbTmpLinkCount=0;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else cbValueIndex--;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cbTmpLinkCount++;
|
|||
|
|
//Ѱ<><D1B0><EFBFBD><EFBFBD><EEB3A4>
|
|||
|
|
if( cbLineCount == 0 ) continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( cbTmpLinkCount >= cbLessLineCount )
|
|||
|
|
{
|
|||
|
|
if( pSearchCardResult == NULL ) return 1;
|
|||
|
|
|
|||
|
|
ASSERT( cbResultCount < CountArray(pSearchCardResult->cbCardCount) );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCount = 0;
|
|||
|
|
for( BYTE cbIndex = cbValueIndex+1-cbTmpLinkCount; cbIndex <= cbValueIndex; cbIndex++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbTmpCount = 0;
|
|||
|
|
for (BYTE cbColorIndex=0;cbColorIndex<4;cbColorIndex++)
|
|||
|
|
{
|
|||
|
|
for( BYTE cbColorCount = 0; cbColorCount < Distributing.cbDistributing[cbIndex][3-cbColorIndex]; cbColorCount++ )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][cbCount++]=MakeCardData(cbIndex,3-cbColorIndex);
|
|||
|
|
|
|||
|
|
if( ++cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
if( cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = cbCount;
|
|||
|
|
cbResultCount++;
|
|||
|
|
|
|||
|
|
if( cbLineCount != 0 )
|
|||
|
|
{
|
|||
|
|
cbTmpLinkCount--;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cbTmpLinkCount = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>
|
|||
|
|
if( cbTmpLinkCount >= cbLessLineCount-1 && cbValueIndex == 13 )
|
|||
|
|
{
|
|||
|
|
if( Distributing.cbDistributing[0][cbIndexCount] >= cbBlockCount ||
|
|||
|
|
cbTmpLinkCount >= cbLessLineCount )
|
|||
|
|
{
|
|||
|
|
if( pSearchCardResult == NULL ) return 1;
|
|||
|
|
|
|||
|
|
ASSERT( cbResultCount < CountArray(pSearchCardResult->cbCardCount) );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE cbCount = 0;
|
|||
|
|
BYTE cbTmpCount = 0;
|
|||
|
|
for( BYTE cbIndex = cbValueIndex-cbTmpLinkCount; cbIndex < 13; cbIndex++ )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = 0;
|
|||
|
|
for (BYTE cbColorIndex=0;cbColorIndex<4;cbColorIndex++)
|
|||
|
|
{
|
|||
|
|
for( BYTE cbColorCount = 0; cbColorCount < Distributing.cbDistributing[cbIndex][3-cbColorIndex]; cbColorCount++ )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][cbCount++]=MakeCardData(cbIndex,3-cbColorIndex);
|
|||
|
|
|
|||
|
|
if( ++cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
if( cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>A
|
|||
|
|
if( Distributing.cbDistributing[0][cbIndexCount] >= cbBlockCount )
|
|||
|
|
{
|
|||
|
|
cbTmpCount = 0;
|
|||
|
|
for (BYTE cbColorIndex=0;cbColorIndex<4;cbColorIndex++)
|
|||
|
|
{
|
|||
|
|
for( BYTE cbColorCount = 0; cbColorCount < Distributing.cbDistributing[0][3-cbColorIndex]; cbColorCount++ )
|
|||
|
|
{
|
|||
|
|
pSearchCardResult->cbResultCard[cbResultCount][cbCount++]=MakeCardData(0,3-cbColorIndex);
|
|||
|
|
|
|||
|
|
if( ++cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
if( cbTmpCount == cbBlockCount ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = cbCount;
|
|||
|
|
cbResultCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
pSearchCardResult->cbSearchCount = cbResultCount;
|
|||
|
|
return cbResultCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD>
|
|||
|
|
BYTE CGameLogic::SearchThreeTwoLine( const BYTE cbHandCardData[], BYTE cbHandCardCount, tagSearchCardResult *pSearchCardResult )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
if( pSearchCardResult )
|
|||
|
|
ZeroMemory(pSearchCardResult,sizeof(tagSearchCardResult));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSearchCardResult tmpSearchResult = {};
|
|||
|
|
tagSearchCardResult tmpSingleWing = {};
|
|||
|
|
tagSearchCardResult tmpDoubleWing = {};
|
|||
|
|
BYTE cbTmpResultCount = 0;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cbTmpResultCount = SearchLineCardType( cbHandCardData,cbHandCardCount,0,3,0,&tmpSearchResult );
|
|||
|
|
|
|||
|
|
if( cbTmpResultCount > 0 )
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
for( BYTE i = 0; i < cbTmpResultCount; i++ )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbTmpCardData[MAX_COUNT];
|
|||
|
|
BYTE cbTmpCardCount = cbHandCardCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( cbHandCardCount-tmpSearchResult.cbCardCount[i] < tmpSearchResult.cbCardCount[i]/3 )
|
|||
|
|
{
|
|||
|
|
BYTE cbNeedDelCount = 3;
|
|||
|
|
while( cbHandCardCount+cbNeedDelCount-tmpSearchResult.cbCardCount[i] < (tmpSearchResult.cbCardCount[i]-cbNeedDelCount)/3 )
|
|||
|
|
cbNeedDelCount += 3;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( (tmpSearchResult.cbCardCount[i]-cbNeedDelCount)/3 < 2 )
|
|||
|
|
{
|
|||
|
|
//<2F>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
RemoveCard( tmpSearchResult.cbResultCard[i],cbNeedDelCount,tmpSearchResult.cbResultCard[i],
|
|||
|
|
tmpSearchResult.cbCardCount[i] );
|
|||
|
|
tmpSearchResult.cbCardCount[i] -= cbNeedDelCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pSearchCardResult == NULL ) return 1;
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CopyMemory( cbTmpCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount );
|
|||
|
|
VERIFY( RemoveCard( tmpSearchResult.cbResultCard[i],tmpSearchResult.cbCardCount[i],
|
|||
|
|
cbTmpCardData,cbTmpCardCount ) );
|
|||
|
|
cbTmpCardCount -= tmpSearchResult.cbCardCount[i];
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>Ϸɻ<CFB7>
|
|||
|
|
BYTE cbNeedCount = tmpSearchResult.cbCardCount[i]/3;
|
|||
|
|
ASSERT( cbNeedCount <= cbTmpCardCount );
|
|||
|
|
|
|||
|
|
BYTE cbResultCount = tmpSingleWing.cbSearchCount++;
|
|||
|
|
CopyMemory( tmpSingleWing.cbResultCard[cbResultCount],tmpSearchResult.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*tmpSearchResult.cbCardCount[i] );
|
|||
|
|
CopyMemory( &tmpSingleWing.cbResultCard[cbResultCount][tmpSearchResult.cbCardCount[i]],
|
|||
|
|
&cbTmpCardData[cbTmpCardCount-cbNeedCount],sizeof(BYTE)*cbNeedCount );
|
|||
|
|
tmpSingleWing.cbCardCount[i] = tmpSearchResult.cbCardCount[i]+cbNeedCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( cbTmpCardCount < tmpSearchResult.cbCardCount[i]/3*2 )
|
|||
|
|
{
|
|||
|
|
BYTE cbNeedDelCount = 3;
|
|||
|
|
while( cbTmpCardCount+cbNeedDelCount-tmpSearchResult.cbCardCount[i] < (tmpSearchResult.cbCardCount[i]-cbNeedDelCount)/3*2 )
|
|||
|
|
cbNeedDelCount += 3;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if( (tmpSearchResult.cbCardCount[i]-cbNeedDelCount)/3 < 2 )
|
|||
|
|
{
|
|||
|
|
//<2F>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
RemoveCard( tmpSearchResult.cbResultCard[i],cbNeedDelCount,tmpSearchResult.cbResultCard[i],
|
|||
|
|
tmpSearchResult.cbCardCount[i] );
|
|||
|
|
tmpSearchResult.cbCardCount[i] -= cbNeedDelCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CopyMemory( cbTmpCardData,cbHandCardData,sizeof(BYTE)*cbHandCardCount );
|
|||
|
|
VERIFY( RemoveCard( tmpSearchResult.cbResultCard[i],tmpSearchResult.cbCardCount[i],
|
|||
|
|
cbTmpCardData,cbTmpCardCount ) );
|
|||
|
|
cbTmpCardCount = cbHandCardCount-tmpSearchResult.cbCardCount[i];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagAnalyseResult TmpResult = {};
|
|||
|
|
AnalysebCardData( cbTmpCardData,cbTmpCardCount,TmpResult );
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbDistillCard[MAX_COUNT] = {};
|
|||
|
|
BYTE cbDistillCount = 0;
|
|||
|
|
BYTE cbLineCount = tmpSearchResult.cbCardCount[i]/3;
|
|||
|
|
for( BYTE j = 1; j < CountArray(TmpResult.cbBlockCount); j++ )
|
|||
|
|
{
|
|||
|
|
if( TmpResult.cbBlockCount[j] > 0 )
|
|||
|
|
{
|
|||
|
|
if( j+1 == 2 && TmpResult.cbBlockCount[j] >= cbLineCount )
|
|||
|
|
{
|
|||
|
|
BYTE cbTmpBlockCount = TmpResult.cbBlockCount[j];
|
|||
|
|
CopyMemory( cbDistillCard,&TmpResult.cbCardData[j][(cbTmpBlockCount-cbLineCount)*(j+1)],
|
|||
|
|
sizeof(BYTE)*(j+1)*cbLineCount );
|
|||
|
|
cbDistillCount = (j+1)*cbLineCount;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
for( BYTE k = 0; k < TmpResult.cbBlockCount[j]; k++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbTmpBlockCount = TmpResult.cbBlockCount[j];
|
|||
|
|
CopyMemory( &cbDistillCard[cbDistillCount],&TmpResult.cbCardData[j][(cbTmpBlockCount-k-1)*(j+1)],
|
|||
|
|
sizeof(BYTE)*2 );
|
|||
|
|
cbDistillCount += 2;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == 2*cbLineCount ) break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == 2*cbLineCount ) break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if( cbDistillCount == 2*cbLineCount )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>
|
|||
|
|
cbResultCount = tmpDoubleWing.cbSearchCount++;
|
|||
|
|
CopyMemory( tmpDoubleWing.cbResultCard[cbResultCount],tmpSearchResult.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*tmpSearchResult.cbCardCount[i] );
|
|||
|
|
CopyMemory( &tmpDoubleWing.cbResultCard[cbResultCount][tmpSearchResult.cbCardCount[i]],
|
|||
|
|
cbDistillCard,sizeof(BYTE)*cbDistillCount );
|
|||
|
|
tmpDoubleWing.cbCardCount[i] = tmpSearchResult.cbCardCount[i]+cbDistillCount;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
|
|||
|
|
for( BYTE i = 0; i < tmpDoubleWing.cbSearchCount; i++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbResultCount = pSearchCardResult->cbSearchCount++;
|
|||
|
|
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpDoubleWing.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*tmpDoubleWing.cbCardCount[i] );
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpDoubleWing.cbCardCount[i];
|
|||
|
|
}
|
|||
|
|
for( BYTE i = 0; i < tmpSingleWing.cbSearchCount; i++ )
|
|||
|
|
{
|
|||
|
|
BYTE cbResultCount = pSearchCardResult->cbSearchCount++;
|
|||
|
|
|
|||
|
|
CopyMemory( pSearchCardResult->cbResultCard[cbResultCount],tmpSingleWing.cbResultCard[i],
|
|||
|
|
sizeof(BYTE)*tmpSingleWing.cbCardCount[i] );
|
|||
|
|
pSearchCardResult->cbCardCount[cbResultCount] = tmpSingleWing.cbCardCount[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pSearchCardResult==NULL?0:pSearchCardResult->cbSearchCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|