Files

285 lines
6.7 KiB
C++
Raw Permalink Normal View History

2026-02-13 14:34:15 +08:00
#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;
}
//////////////////////////////////////////////////////////////////////////