367 lines
8.2 KiB
C++
367 lines
8.2 KiB
C++
|
|
#include "ZJH_GameLogic.h"
|
|||
|
|
|
|||
|
|
bool CZJHGameLogic::IsValidCard(uint8 cbCard)
|
|||
|
|
{
|
|||
|
|
uint8 cbColor = GetCardColorEx(cbCard);
|
|||
|
|
uint8 cbValue = GetCardValue(cbCard);
|
|||
|
|
if ((cbValue >= 1 && cbValue <= 13) && (cbColor >= 0 && cbColor <= 3))
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
CC_ASSERT(0);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><EFBFBD><DFBC><EFBFBD>ֵ;
|
|||
|
|
uint8 CZJHGameLogic::GetCardLogicValue(const uint8 cbCard)
|
|||
|
|
{
|
|||
|
|
if (!IsValidCard(cbCard)) return 0;
|
|||
|
|
|
|||
|
|
uint8 cbValue = GetCardValue(cbCard);
|
|||
|
|
return (cbValue == 1) ? (cbValue + 13) : cbValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CZJHGameLogic::SortCardList(uint8 cbCardBuffer[], const uint8 cbBufferCount)
|
|||
|
|
{
|
|||
|
|
CC_ASSERT(cbBufferCount == ZJH_MAX_COUNT);
|
|||
|
|
if (cbBufferCount != ZJH_MAX_COUNT)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint8 cbLogicValue[ZJH_MAX_COUNT] = { 0 };
|
|||
|
|
for (uint8 i = 0; i < cbBufferCount; i++)
|
|||
|
|
{
|
|||
|
|
cbLogicValue[i] = GetCardLogicValue(cbCardBuffer[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
bool bSorted = true;
|
|||
|
|
uint8 bSwapData = 0, bLast = cbBufferCount - 1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
bSorted = true;
|
|||
|
|
for (uint8 i = 0; i < bLast; ++i)
|
|||
|
|
{
|
|||
|
|
if ((cbLogicValue[i] < cbLogicValue[i + 1]) || (cbLogicValue[i] == cbLogicValue[i + 1] && cbCardBuffer[i] < cbCardBuffer[i + 1]))
|
|||
|
|
{
|
|||
|
|
bSwapData = cbCardBuffer[i];
|
|||
|
|
cbCardBuffer[i] = cbCardBuffer[i + 1];
|
|||
|
|
cbCardBuffer[i + 1] = bSwapData;
|
|||
|
|
bSwapData = cbLogicValue[i];
|
|||
|
|
cbLogicValue[i] = cbLogicValue[i + 1];
|
|||
|
|
cbLogicValue[i + 1] = bSwapData;
|
|||
|
|
bSorted = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
bLast--;
|
|||
|
|
} while (!bSorted);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint8 CZJHGameLogic::GetCardType(const uint8 cbCardData[], const uint8 cbCardCount)
|
|||
|
|
{
|
|||
|
|
CC_ASSERT(cbCardCount == ZJH_MAX_COUNT);
|
|||
|
|
if (ZJH_MAX_COUNT != cbCardCount)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint8 cbTempList[ZJH_MAX_COUNT] = { 0 };
|
|||
|
|
memcpy(cbTempList, cbCardData, sizeof(uint8)*ZJH_MAX_COUNT);
|
|||
|
|
SortCardList(cbTempList, cbCardCount);
|
|||
|
|
|
|||
|
|
if (cbCardCount == ZJH_MAX_COUNT)
|
|||
|
|
{
|
|||
|
|
uint8 cbSameCount = 1;
|
|||
|
|
bool b235Card = false, bLineCard = true, bSameColor = true;
|
|||
|
|
uint8 cbFirstColor = GetCardColor(cbTempList[0]);
|
|||
|
|
uint8 cbFirstValue = GetCardLogicValue(cbTempList[0]);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>η<EFBFBD><CEB7><EFBFBD>;
|
|||
|
|
for (uint8 i = 1; i < cbCardCount; ++i)
|
|||
|
|
{
|
|||
|
|
uint8 cbNextColor = GetCardColor(cbTempList[i]);
|
|||
|
|
uint8 cbNextValue = GetCardLogicValue(cbTempList[i]);
|
|||
|
|
if (cbNextColor != cbFirstColor)
|
|||
|
|
{
|
|||
|
|
bSameColor = false;
|
|||
|
|
}
|
|||
|
|
if (cbFirstValue != (cbNextValue + i))
|
|||
|
|
{
|
|||
|
|
bLineCard = false;
|
|||
|
|
}
|
|||
|
|
if (cbFirstValue == cbNextValue)
|
|||
|
|
{
|
|||
|
|
cbSameCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>;
|
|||
|
|
bool bFindCard123[3] = { false, false, false };
|
|||
|
|
bool bFindCard235[3] = { false, false, false };
|
|||
|
|
for (uint8 i = 0; i < cbCardCount; ++i)
|
|||
|
|
{
|
|||
|
|
uint8 cbCardValue = GetCardValue(cbTempList[i]);
|
|||
|
|
if (1 == cbCardValue)
|
|||
|
|
{
|
|||
|
|
bFindCard123[0] = true;
|
|||
|
|
}
|
|||
|
|
else if (2 == cbCardValue)
|
|||
|
|
{
|
|||
|
|
bFindCard123[1] = true;
|
|||
|
|
bFindCard235[0] = true;
|
|||
|
|
}
|
|||
|
|
else if (3 == cbCardValue)
|
|||
|
|
{
|
|||
|
|
bFindCard123[2] = true;
|
|||
|
|
bFindCard235[1] = true;
|
|||
|
|
}
|
|||
|
|
else if (5 == cbCardValue)
|
|||
|
|
{
|
|||
|
|
bFindCard235[2] = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>235
|
|||
|
|
if (bFindCard235[0] && bFindCard235[1] && bFindCard235[2])
|
|||
|
|
{
|
|||
|
|
b235Card = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>A32
|
|||
|
|
if (!bLineCard && bFindCard123[0] && bFindCard123[1] && bFindCard123[2])
|
|||
|
|
{
|
|||
|
|
bLineCard = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
if (cbSameCount == ZJH_MAX_COUNT)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_BAO_ZI;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
if (bSameColor && bLineCard)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_SHUN_JIN;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
if (bSameColor && !bLineCard)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_JIN_HUA;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
if (!bSameColor && bLineCard)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_SHUN_ZI;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
if (cbSameCount == ZJH_MAX_COUNT - 1 || GetCardValue(cbTempList[1]) == GetCardValue(cbTempList[2]))
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_DOUBLE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>235;
|
|||
|
|
if (b235Card && !bSameColor)
|
|||
|
|
{
|
|||
|
|
return ZJH_CT_SPECIAL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ZJH_CT_SINGLE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ZJH_CT_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CZJHGameLogic::CompareCard(const uint8 cbFirstData[], const uint8 cbNextData[], const uint8 cbCardCount)
|
|||
|
|
{
|
|||
|
|
CC_ASSERT(ZJH_MAX_COUNT == cbCardCount);
|
|||
|
|
if (ZJH_MAX_COUNT != cbCardCount)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>;
|
|||
|
|
uint8 cbFirstTemp[ZJH_MAX_COUNT] = { 0 };
|
|||
|
|
CopyMemory(cbFirstTemp, cbFirstData, sizeof(cbFirstTemp));
|
|||
|
|
SortCardList(cbFirstTemp, cbCardCount);
|
|||
|
|
uint8 cbFirstType = GetCardType(cbFirstTemp, cbCardCount);
|
|||
|
|
uint8 cbFirstColor = GetCardColor(cbFirstTemp[0]);
|
|||
|
|
|
|||
|
|
//<2F>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
uint8 cbNextTemp[ZJH_MAX_COUNT] = { 0 };
|
|||
|
|
CopyMemory(cbNextTemp, cbNextData, sizeof(cbNextTemp));
|
|||
|
|
SortCardList(cbNextTemp, cbCardCount);
|
|||
|
|
uint8 cbNextType = GetCardType(cbNextTemp, cbCardCount);
|
|||
|
|
uint8 cbNextColor = GetCardColor(cbNextTemp[0]);
|
|||
|
|
//235 > <20><><EFBFBD><EFBFBD>
|
|||
|
|
if ((cbNextType + cbFirstType) == (ZJH_CT_SPECIAL + ZJH_CT_BAO_ZI))
|
|||
|
|
{
|
|||
|
|
return (cbFirstType > cbNextType) ? true : false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cbNextType == ZJH_CT_SPECIAL)
|
|||
|
|
{
|
|||
|
|
cbNextType = ZJH_CT_SINGLE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cbFirstType == ZJH_CT_SPECIAL)
|
|||
|
|
{
|
|||
|
|
cbFirstType = ZJH_CT_SINGLE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cbFirstType != cbNextType)
|
|||
|
|
{
|
|||
|
|
return (cbFirstType > cbNextType) ? true : false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (cbFirstType)
|
|||
|
|
{
|
|||
|
|
case ZJH_CT_BAO_ZI:
|
|||
|
|
case ZJH_CT_SINGLE:
|
|||
|
|
case ZJH_CT_JIN_HUA:
|
|||
|
|
{
|
|||
|
|
for (uint8 i = 0; i < cbCardCount; ++i)
|
|||
|
|
{
|
|||
|
|
uint8 cbNextValue = GetCardLogicValue(cbNextTemp[i]);
|
|||
|
|
uint8 cbFirstValue = GetCardLogicValue(cbFirstTemp[i]);
|
|||
|
|
if (cbFirstValue != cbNextValue)
|
|||
|
|
{
|
|||
|
|
return (cbFirstValue > cbNextValue) ? true : false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
case ZJH_CT_SHUN_ZI:
|
|||
|
|
case ZJH_CT_SHUN_JIN:
|
|||
|
|
{
|
|||
|
|
uint8 cbNextValue = GetCardLogicValue(cbNextTemp[0]);
|
|||
|
|
uint8 cbFirstValue = GetCardLogicValue(cbFirstTemp[0]);
|
|||
|
|
if (cbNextValue == 14 && GetCardLogicValue(cbNextTemp[cbCardCount - 1]) == 2)
|
|||
|
|
{
|
|||
|
|
cbNextValue = 3;
|
|||
|
|
cbNextColor = GetCardColor(cbNextTemp[1]);
|
|||
|
|
}
|
|||
|
|
if (cbFirstValue == 14 && GetCardLogicValue(cbFirstTemp[cbCardCount - 1]) == 2)
|
|||
|
|
{
|
|||
|
|
cbFirstValue = 3;
|
|||
|
|
cbFirstColor = GetCardColor(cbFirstTemp[1]);
|
|||
|
|
}
|
|||
|
|
if (cbFirstValue != cbNextValue)
|
|||
|
|
{
|
|||
|
|
return (cbFirstValue > cbNextValue) ? true : false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
case ZJH_CT_DOUBLE:
|
|||
|
|
{
|
|||
|
|
uint8 cbNextValue = GetCardLogicValue(cbNextTemp[0]);
|
|||
|
|
uint8 cbFirstValue = GetCardLogicValue(cbFirstTemp[0]);
|
|||
|
|
uint8 cbNextValue2 = 0, cbNextValue1 = 0, cbFirstValue2 = 0, cbFirstValue1 = 0;
|
|||
|
|
uint8 cbNextColor2 = 0x00, cbFirstColor1 = 0x00;
|
|||
|
|
if (cbNextValue == GetCardLogicValue(cbNextTemp[1]))
|
|||
|
|
{
|
|||
|
|
cbNextValue2 = cbNextValue;
|
|||
|
|
cbNextValue1 = GetCardLogicValue(cbNextTemp[2]);
|
|||
|
|
cbNextColor2 = __max(GetCardColor(cbNextTemp[0]), GetCardColor(cbNextTemp[1]));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cbNextValue2 = GetCardLogicValue(cbNextTemp[2]);
|
|||
|
|
cbNextValue1 = cbNextValue;
|
|||
|
|
cbNextColor2 = __max(GetCardColor(cbNextTemp[1]), GetCardColor(cbNextTemp[2]));
|
|||
|
|
}
|
|||
|
|
if (cbFirstValue == GetCardLogicValue(cbFirstTemp[1]))
|
|||
|
|
{
|
|||
|
|
cbFirstValue2 = cbFirstValue;
|
|||
|
|
cbFirstValue1 = GetCardLogicValue(cbFirstTemp[2]);
|
|||
|
|
cbFirstColor1 = __max(GetCardColor(cbFirstTemp[0]), GetCardColor(cbFirstTemp[1]));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
cbFirstValue2 = GetCardLogicValue(cbFirstTemp[2]);
|
|||
|
|
cbFirstValue1 = cbFirstValue;
|
|||
|
|
cbFirstColor1 = __max(GetCardColor(cbFirstTemp[1]), GetCardColor(cbFirstTemp[2]));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cbNextValue2 != cbFirstValue2)
|
|||
|
|
{
|
|||
|
|
return (cbFirstValue2 > cbNextValue2) ? true : false;
|
|||
|
|
}
|
|||
|
|
if (cbNextValue1 != cbFirstValue1)
|
|||
|
|
{
|
|||
|
|
return (cbFirstValue1 > cbNextValue1) ? true : false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͼƬ·<C6AC><C2B7>;
|
|||
|
|
std::string CZJHGameLogic::getCardTypeImagePath(uint8 cbCardType)
|
|||
|
|
{
|
|||
|
|
switch (cbCardType)
|
|||
|
|
{
|
|||
|
|
case ZJH_CT_SINGLE:
|
|||
|
|
return "Games/ZJH/CardType/SanPai.png";
|
|||
|
|
case ZJH_CT_DOUBLE:
|
|||
|
|
return "Games/ZJH/CardType/YiDui.png";
|
|||
|
|
case ZJH_CT_SHUN_ZI:
|
|||
|
|
return "Games/ZJH/CardType/ShunZi.png";
|
|||
|
|
case ZJH_CT_JIN_HUA:
|
|||
|
|
return "Games/ZJH/CardType/TongHua.png";
|
|||
|
|
case ZJH_CT_SHUN_JIN:
|
|||
|
|
return "Games/ZJH/CardType/TongHuaShun.png";
|
|||
|
|
case ZJH_CT_BAO_ZI:
|
|||
|
|
return "Games/ZJH/CardType/SanTiao.png";
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>;
|
|||
|
|
std::string CZJHGameLogic::getCardTypeSoundPath(uint8 cbGender, uint8 cbCardType)
|
|||
|
|
{
|
|||
|
|
std::string strPath = "Games/ZJH/Sound/";
|
|||
|
|
if (0==cbGender)
|
|||
|
|
{
|
|||
|
|
strPath += "man/m_";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
strPath += "woman/f_";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (cbCardType)
|
|||
|
|
{
|
|||
|
|
case ZJH_CT_SINGLE:
|
|||
|
|
strPath += "wulong.mp3";
|
|||
|
|
break;
|
|||
|
|
case ZJH_CT_DOUBLE:
|
|||
|
|
strPath += "duizi.mp3";
|
|||
|
|
break;
|
|||
|
|
case ZJH_CT_SHUN_ZI:
|
|||
|
|
strPath += "shunzi.mp3";
|
|||
|
|
break;
|
|||
|
|
case ZJH_CT_JIN_HUA:
|
|||
|
|
strPath += "tonghua.mp3";
|
|||
|
|
break;
|
|||
|
|
case ZJH_CT_SHUN_JIN:
|
|||
|
|
strPath += "tonghuashun.mp3";
|
|||
|
|
break;
|
|||
|
|
case ZJH_CT_BAO_ZI:
|
|||
|
|
strPath += "santiao.mp3";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
return "";
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return strPath;
|
|||
|
|
}
|