285 lines
6.7 KiB
C++
285 lines
6.7 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "GameLogic.h"
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::m_cbCardListData[52]=
|
|||
|
|
{
|
|||
|
|
//0x1C,0x1D,0x3B,0x3C,0x3D,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0A,0x0B,0x0C,0x0D, //<2F><><EFBFBD><EFBFBD> A - K
|
|||
|
|
//0x3A,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B, //÷<><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 //<2F><><EFBFBD><EFBFBD> A - K
|
|||
|
|
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
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CGameLogic::CGameLogic()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CGameLogic::~CGameLogic()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::GetCardType(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
ASSERT(cbCardCount==MAX_COUNT);
|
|||
|
|
|
|||
|
|
////ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//BYTE bSameCount = 0;
|
|||
|
|
//SortCardList(cbCardData,cbCardCount);
|
|||
|
|
//BYTE bSecondValue = GetCardValue(cbCardData[MAX_COUNT/2]);
|
|||
|
|
//for(BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
//{
|
|||
|
|
// if(bSecondValue == GetCardValue(cbCardData[i]))
|
|||
|
|
// {
|
|||
|
|
// bSameCount++;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
//if(bSameCount==4)return OX_FOUR_SAME;
|
|||
|
|
|
|||
|
|
BYTE bKingCount=0,bTenCount=0;
|
|||
|
|
for(BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
if(GetCardValue(cbCardData[i])>10)
|
|||
|
|
{
|
|||
|
|
bKingCount++;
|
|||
|
|
}
|
|||
|
|
else if(GetCardValue(cbCardData[i])==10)
|
|||
|
|
{
|
|||
|
|
bTenCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(bKingCount==MAX_COUNT) return OX_FIVEKING;
|
|||
|
|
else if(bKingCount==MAX_COUNT-1 && bTenCount==1) return OX_FOURKING;
|
|||
|
|
|
|||
|
|
////<2F><>«<EFBFBD><C2AB><EFBFBD><EFBFBD>
|
|||
|
|
//if(bSameCount==3)
|
|||
|
|
//{
|
|||
|
|
// if((bSecondValue!=GetCardValue(cbCardData[3]) && GetCardValue(cbCardData[3])==GetCardValue(cbCardData[4]))
|
|||
|
|
// ||(bSecondValue!=GetCardValue(cbCardData[1]) && GetCardValue(cbCardData[1])==GetCardValue(cbCardData[0])))
|
|||
|
|
// return OX_THREE_SAME;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
BYTE bTemp[MAX_COUNT];
|
|||
|
|
BYTE bSum=0;
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
bTemp[i]=GetCardLogicValue(cbCardData[i]);
|
|||
|
|
bSum+=bTemp[i];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (BYTE i=0;i<cbCardCount-1;i++)
|
|||
|
|
{
|
|||
|
|
for (BYTE j=i+1;j<cbCardCount;j++)
|
|||
|
|
{
|
|||
|
|
if((bSum-bTemp[i]-bTemp[j])%10==0)
|
|||
|
|
{
|
|||
|
|
return ((bTemp[i]+bTemp[j])>10)?(bTemp[i]+bTemp[j]-10):(bTemp[i]+bTemp[j]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return OX_VALUE0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE CGameLogic::GetTimes(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
if(cbCardCount!=MAX_COUNT)return 0;
|
|||
|
|
|
|||
|
|
BYTE bTimes=GetCardType(cbCardData,MAX_COUNT);
|
|||
|
|
if(bTimes<7)return 1;
|
|||
|
|
else if(bTimes==7)return 2;
|
|||
|
|
else if(bTimes==8)return 3;
|
|||
|
|
else if(bTimes==9)return 4;
|
|||
|
|
else if(bTimes==10)return 5;
|
|||
|
|
else if(bTimes==OX_THREE_SAME)return 5;
|
|||
|
|
else if(bTimes==OX_FOUR_SAME)return 5;
|
|||
|
|
else if(bTimes==OX_FOURKING)return 5;
|
|||
|
|
else if(bTimes==OX_FIVEKING)return 5;
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡţţ
|
|||
|
|
bool CGameLogic::GetOxCard(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
ASSERT(cbCardCount==MAX_COUNT);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
BYTE bTemp[MAX_COUNT],bTempData[MAX_COUNT];
|
|||
|
|
CopyMemory(bTempData,cbCardData,sizeof(bTempData));
|
|||
|
|
BYTE bSum=0;
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
bTemp[i]=GetCardLogicValue(cbCardData[i]);
|
|||
|
|
bSum+=bTemp[i];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ţţ
|
|||
|
|
for (BYTE i=0;i<cbCardCount-1;i++)
|
|||
|
|
{
|
|||
|
|
for (BYTE j=i+1;j<cbCardCount;j++)
|
|||
|
|
{
|
|||
|
|
if((bSum-bTemp[i]-bTemp[j])%10==0)
|
|||
|
|
{
|
|||
|
|
BYTE bCount=0;
|
|||
|
|
for (BYTE k=0;k<cbCardCount;k++)
|
|||
|
|
{
|
|||
|
|
if(k!=i && k!=j)
|
|||
|
|
{
|
|||
|
|
cbCardData[bCount++] = bTempData[k];
|
|||
|
|
}
|
|||
|
|
}ASSERT(bCount==3);
|
|||
|
|
|
|||
|
|
cbCardData[bCount++] = bTempData[i];
|
|||
|
|
cbCardData[bCount++] = bTempData[j];
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
bool CGameLogic::IsIntValue(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
BYTE sum=0;
|
|||
|
|
for(BYTE i=0;i<cbCardCount;i++)
|
|||
|
|
{
|
|||
|
|
sum+=GetCardLogicValue(cbCardData[i]);
|
|||
|
|
}
|
|||
|
|
ASSERT(sum>0);
|
|||
|
|
return (sum%10==0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
void CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount)
|
|||
|
|
{
|
|||
|
|
//ת<><D7AA><EFBFBD><EFBFBD>ֵ
|
|||
|
|
BYTE cbLogicValue[MAX_COUNT];
|
|||
|
|
for (BYTE i=0;i<cbCardCount;i++) cbLogicValue[i]=GetCardValue(cbCardData[i]);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool bSorted=true;
|
|||
|
|
BYTE cbTempData,bLast=cbCardCount-1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
bSorted=true;
|
|||
|
|
for (BYTE i=0;i<bLast;i++)
|
|||
|
|
{
|
|||
|
|
if ((cbLogicValue[i]<cbLogicValue[i+1])||
|
|||
|
|
((cbLogicValue[i]==cbLogicValue[i+1])&&(cbCardData[i]<cbCardData[i+1])))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
cbTempData=cbCardData[i];
|
|||
|
|
cbCardData[i]=cbCardData[i+1];
|
|||
|
|
cbCardData[i+1]=cbTempData;
|
|||
|
|
cbTempData=cbLogicValue[i];
|
|||
|
|
cbLogicValue[i]=cbLogicValue[i+1];
|
|||
|
|
cbLogicValue[i+1]=cbTempData;
|
|||
|
|
bSorted=false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
bLast--;
|
|||
|
|
} while(bSorted==false);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
void CGameLogic::RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount)
|
|||
|
|
{
|
|||
|
|
//CopyMemory(cbCardBuffer,m_cbCardListData,cbBufferCount);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><D7BC>
|
|||
|
|
BYTE cbCardData[CountArray(m_cbCardListData)];
|
|||
|
|
CopyMemory(cbCardData,m_cbCardListData,sizeof(m_cbCardListData));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
BYTE bRandCount=0,bPosition=0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
bPosition=rand()%(CountArray(m_cbCardListData)-bRandCount);
|
|||
|
|
cbCardBuffer[bRandCount++]=cbCardData[bPosition];
|
|||
|
|
cbCardData[bPosition]=cbCardData[CountArray(m_cbCardListData)-bRandCount];
|
|||
|
|
} while (bRandCount<cbBufferCount);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><EFBFBD><DFBC><EFBFBD>ֵ
|
|||
|
|
BYTE CGameLogic::GetCardLogicValue(BYTE cbCardData)
|
|||
|
|
{
|
|||
|
|
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BYTE bCardColor=GetCardColor(cbCardData);
|
|||
|
|
BYTE bCardValue=GetCardValue(cbCardData);
|
|||
|
|
|
|||
|
|
//ת<><D7AA><EFBFBD><EFBFBD>ֵ
|
|||
|
|
return (bCardValue>10)?(10):bCardValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>
|
|||
|
|
bool CGameLogic::CompareCard(BYTE cbFirstData[], BYTE cbNextData[], BYTE cbCardCount,BOOL FirstOX,BOOL NextOX)
|
|||
|
|
{
|
|||
|
|
if(FirstOX!=NextOX)return (FirstOX>NextOX);
|
|||
|
|
|
|||
|
|
//<2F>Ƚ<EFBFBD>ţ<EFBFBD><C5A3>С
|
|||
|
|
if(FirstOX==TRUE)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
BYTE cbNextType=GetCardType(cbNextData,cbCardCount);
|
|||
|
|
BYTE cbFirstType=GetCardType(cbFirstData,cbCardCount);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (cbFirstType!=cbNextType) return (cbFirstType>cbNextType);
|
|||
|
|
|
|||
|
|
switch(cbNextType)
|
|||
|
|
{
|
|||
|
|
case OX_FOUR_SAME: //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case OX_THREE_SAME: //<2F><>«<EFBFBD><C2AB><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
BYTE bFirstTemp[MAX_COUNT],bNextTemp[MAX_COUNT];
|
|||
|
|
CopyMemory(bFirstTemp,cbFirstData,cbCardCount);
|
|||
|
|
CopyMemory(bNextTemp,cbNextData,cbCardCount);
|
|||
|
|
SortCardList(bFirstTemp,cbCardCount);
|
|||
|
|
SortCardList(bNextTemp,cbCardCount);
|
|||
|
|
|
|||
|
|
return GetCardValue(bFirstTemp[MAX_COUNT/2])>GetCardValue(bNextTemp[MAX_COUNT/2]);
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
BYTE bFirstTemp[MAX_COUNT],bNextTemp[MAX_COUNT];
|
|||
|
|
CopyMemory(bFirstTemp,cbFirstData,cbCardCount);
|
|||
|
|
CopyMemory(bNextTemp,cbNextData,cbCardCount);
|
|||
|
|
SortCardList(bFirstTemp,cbCardCount);
|
|||
|
|
SortCardList(bNextTemp,cbCardCount);
|
|||
|
|
|
|||
|
|
//<2F>Ƚ<EFBFBD><C8BD><EFBFBD>ֵ
|
|||
|
|
BYTE cbNextMaxValue=GetCardValue(bNextTemp[0]);
|
|||
|
|
BYTE cbFirstMaxValue=GetCardValue(bFirstTemp[0]);
|
|||
|
|
if(cbNextMaxValue!=cbFirstMaxValue)return cbFirstMaxValue>cbNextMaxValue;
|
|||
|
|
|
|||
|
|
//<2F>Ƚ<EFBFBD><C8BD><EFBFBD>ɫ
|
|||
|
|
return GetCardColor(bFirstTemp[0]) > GetCardColor(bNextTemp[0]);
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|