Files

1443 lines
40 KiB
C++
Raw Permalink Normal View History

2026-03-03 13:56:44 +08:00
#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;
}
//////////////////////////////////////////////////////////////////////////////////