想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
#include "StdAfx.h"
#include "GameLogic.h"
//////////////////////////////////////////////////////////////////////////
//扑克数据
BYTE CGameLogic::m_cbCardListData[52] =
{
//0x1C,0x1D,0x3B,0x3C,0x3D,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0A,0x0B,0x0C,0x0D, //方块 A - K
//0x3A,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B, //梅花 A - K
//0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, //红桃 A - K
//0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39 //黑桃 A - K
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, //方块 A - K
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, //梅花 A - K
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, //红桃 A - K
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D //黑桃 A - K
};
//////////////////////////////////////////////////////////////////////////
//构造函数
CGameLogic::CGameLogic()
{
}
//析构函数
CGameLogic::~CGameLogic()
{
}
//获取类型
BYTE CGameLogic::GetCardType(BYTE cbCardData[], BYTE cbCardCount)
{
ASSERT(cbCardCount == MAX_COUNT);
////炸弹牌型
//BYTE bSameCount = 0;
//SortCardList(cbCardData,cbCardCount);
//BYTE bSecondValue = GetCardValue(cbCardData[MAX_COUNT/2]);
//for(BYTE i=0;i<cbCardCount;i++)
//{
// if(bSecondValue == GetCardValue(cbCardData))
// {
// bSameCount++;
// }
//}
//if(bSameCount==4)return OX_FOUR_SAME;
BYTE bKingCount = 0,bTenCount = 0;
for (BYTE i = 0; i < cbCardCount; i++)
{
if (GetCardValue(cbCardData) > 10)
{
bKingCount++;
}
else if (GetCardValue(cbCardData) == 10)
{
bTenCount++;
}
}
if (bKingCount == MAX_COUNT)
return OX_FIVEKING;
else if (bKingCount == MAX_COUNT - 1 && bTenCount == 1)
return OX_FOURKING;
////葫芦牌型
//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 = GetCardLogicValue(cbCardData);
bSum += bTemp;
}
for (BYTE i = 0; i < cbCardCount - 1; i++)
{
for (BYTE j = i + 1; j < cbCardCount; j++)
{
if ((bSum - bTemp - bTemp[j]) % 10 == 0)
{
return ((bTemp + bTemp[j]) > 10) ? (bTemp + bTemp[j] - 10) : (bTemp + bTemp[j]);
}
}
}
return OX_VALUE0;
}
//获取倍数
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;
}
//获取牛牛
bool CGameLogic::GetOxCard(BYTE cbCardData[], BYTE cbCardCount)
{
ASSERT(cbCardCount == MAX_COUNT);
//设置变量
BYTE bTemp[MAX_COUNT], bTempData[MAX_COUNT];
CopyMemory(bTempData, cbCardData, sizeof(bTempData));
BYTE bSum = 0;
for (BYTE i = 0; i < cbCardCount; i++)
{
bTemp = GetCardLogicValue(cbCardData);
bSum += bTemp;
}
//查找牛牛
for (BYTE i = 0; i < cbCardCount - 1; i++)
{
for (BYTE j = i + 1; j < cbCardCount; j++)
{
if ((bSum - bTemp - 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;
cbCardData[bCount++] = bTempData[j];
return true;
}
}
}
return false;
}
//获取整数
bool CGameLogic::IsIntValue(BYTE cbCardData[], BYTE cbCardCount)
{
BYTE sum = 0;
for (BYTE i = 0; i < cbCardCount; i++)
{
sum += GetCardLogicValue(cbCardData);
}
ASSERT(sum > 0);
return (sum % 10 == 0);
}
//排列扑克
void CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount)
{
//转换数值
BYTE cbLogicValue[MAX_COUNT];
for (BYTE i = 0; i < cbCardCount; i++)
cbLogicValue = GetCardValue(cbCardData);
//排序操作
bool bSorted = true;
BYTE cbTempData,bLast = cbCardCount - 1;
do
{
bSorted = true;
for (BYTE i = 0; i < bLast; i++)
{
if ((cbLogicValue < cbLogicValue[i + 1]) ||
((cbLogicValue == cbLogicValue[i + 1]) && (cbCardData < cbCardData[i + 1])))
{
//交换位置
cbTempData = cbCardData;
cbCardData = cbCardData[i + 1];
cbCardData[i + 1] = cbTempData;
cbTempData = cbLogicValue;
cbLogicValue = cbLogicValue[i + 1];
cbLogicValue[i + 1] = cbTempData;
bSorted = false;
}
}
bLast--;
}
while (bSorted == false);
return;
}
//混乱扑克
void CGameLogic::RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount)
{
//CopyMemory(cbCardBuffer,m_cbCardListData,cbBufferCount);
//混乱准备
BYTE cbCardData[CountArray(m_cbCardListData)];
CopyMemory(cbCardData, m_cbCardListData, sizeof(m_cbCardListData));
//混乱扑克
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;
}
//逻辑数值
BYTE CGameLogic::GetCardLogicValue(BYTE cbCardData)
{
//扑克属性
BYTE bCardColor = GetCardColor(cbCardData);
BYTE bCardValue = GetCardValue(cbCardData);
//转换数值
return (bCardValue > 10) ? (10) : bCardValue;
}
//对比扑克
bool CGameLogic::CompareCard(BYTE cbFirstData[], BYTE cbNextData[], BYTE cbCardCount, BOOL FirstOX, BOOL NextOX)
{
if (FirstOX != NextOX)
return (FirstOX > NextOX);
//比较牛大小
if (FirstOX == TRUE)
{
//获取点数
BYTE cbNextType = GetCardType(cbNextData, cbCardCount);
BYTE cbFirstType = GetCardType(cbFirstData, cbCardCount);
//点数判断
if (cbFirstType != cbNextType)
return (cbFirstType > cbNextType);
switch (cbNextType)
{
case OX_FOUR_SAME:
//炸弹牌型
case OX_THREE_SAME:
//葫芦牌型
{
//排序大小
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;
}
}
}
//排序大小
BYTE bFirstTemp[MAX_COUNT], bNextTemp[MAX_COUNT];
CopyMemory(bFirstTemp, cbFirstData, cbCardCount);
CopyMemory(bNextTemp, cbNextData, cbCardCount);
SortCardList(bFirstTemp, cbCardCount);
SortCardList(bNextTemp, cbCardCount);
//比较数值
BYTE cbNextMaxValue = GetCardValue(bNextTemp[0]);
BYTE cbFirstMaxValue = GetCardValue(bFirstTemp[0]);
if (cbNextMaxValue != cbFirstMaxValue)
return cbFirstMaxValue > cbNextMaxValue;
//比较颜色
return GetCardColor(bFirstTemp[0]) > GetCardColor(bNextTemp[0]);
return false;
}
//////////////////////////////////////////////////////////////////////////
|