Files
wnmj/Servers/游戏组件/上饶打炸/游戏服务器/GameLogic.cpp

1191 lines
31 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "GameLogic.h"
#define IS_BOME_TYPE(x,y) (((x)>>(y))>0)
//////////////////////////////////////////////////////////////////////////
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
//<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,
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,
};
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
const BYTE CGameLogic::m_cbNoJokerCardData[NO_JOKER_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
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()
{
}
int CGameLogic::GetCardType(const BYTE cbCardData[], BYTE cbCardCount, bool isLastCard)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (cbCardCount)
{
case 0: //<2F><><EFBFBD><EFBFBD>
{
return CT_ERROR;
}
case 1: //<2F><><EFBFBD><EFBFBD>
{
return TransListToInt(0,CT_SINGLE);
}
case 2: //<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//if ((cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E)) return TransListToInt(0,CT_MISSILE_CARD);
if (GetCardLogicValue(cbCardData[0])==GetCardLogicValue(cbCardData[1])) return TransListToInt(0,CT_DOUBLE);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(GetCardLogicValue(cbCardData[0])!=GetCardLogicValue(cbCardData[1]))
{
if (IsLaiZiCard(cbCardData[0]) && !IsLaiZiCard(cbCardData[1]))
{
return TransListToInt(0, CT_DOUBLE);
}
else if (!IsLaiZiCard(cbCardData[0]) && IsLaiZiCard(cbCardData[1]))
{
return TransListToInt(0, CT_DOUBLE);
}
//if (IsLaiZiCard(cbCardData[0]) || IsLaiZiCard(cbCardData[1]))
//{
// if((cbCardData[0]!=0x4F) && (cbCardData[0]!=0x4E) && (cbCardData[0]!=0x4F) && (cbCardData[1]!=0x4E))
// {
// return TransListToInt(0,CT_DOUBLE);
// }
//}
}
return CT_ERROR;
}
case 4: //<2F><>ը;
{
if ((cbCardData[0] == 0x4F) && (cbCardData[1] == 0x4F) && (cbCardData[2] == 0x4E) && (cbCardData[3] == 0x4E))
{
return TransListToInt(0, CT_BOMB_8);
}
}
}
int dCardType = CT_ERROR;
// ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (cbCardCount >= 4 && cbCardCount <= 12)
{
bool isSameCard = true;
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>;
BYTE cbValue = GetCardValue(cbCardData[cbCardCount - 1]);
for (BYTE i = 0; i < cbCardCount; i++)
{
ASSERT(IsValidCard(cbCardData[i]));
if (cbValue != GetCardValue(cbCardData[i]) && !IsLaiZiCard(cbCardData[i]))
{
isSameCard = false;
break;
}
}
// ͬ<><CDAC><EFBFBD>ж<EFBFBD>
if (isSameCard)
{
// 4<><34>ը<EFBFBD><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E2B4A6>;
if (isLastCard && (cbCardCount == 4))
{
dCardType = TransListToInt(dCardType, CT_THREE_TAKE_TWO);
}
BYTE cbCardType = CT_BOMB_4 + cbCardCount - 4;
cbCardType = (cbCardType > CT_BOMB_10) ? CT_BOMB_10 : cbCardType;
dCardType = TransListToInt(dCardType, cbCardType);
return dCardType;// TransListToInt(0, cbCardType);
}
}
// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>;
BYTE cbNormalCard[MAX_COUNT] = {0};
BYTE cbMagicCardCount = 0; // <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
BYTE cbNormalCardCount = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
for (BYTE i = 0; i < cbCardCount; i++)
{
if (IsLaiZiCard(cbCardData[i]))
{
cbMagicCardCount++;
}
else
{
cbNormalCard[cbNormalCardCount++] = cbCardData[i];
}
}
// û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (cbMagicCardCount == 0)
{
BYTE bCardDataTemp[MAX_COUNT] = { 0 };
CopyMemory(bCardDataTemp, cbCardData, sizeof(BYTE)*cbCardCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
tagAnalyseResult AnalyseResult;
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
BYTE cbMaxCardData = 0, cbBlockCount = 0;
int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, cbMaxCardData, cbBlockCount, isLastCard);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD>;
if ((dCardType&(1 << iCardType)) == 0)
{
dCardType = TransListToInt(dCardType, iCardType);
}
}
else
{
if (cbMagicCardCount >= 1)
{
tagAnalyseResult AnalyseResult;
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
BYTE bCardDataTemp[MAX_COUNT] = { 0 };
CopyMemory(&bCardDataTemp[cbMagicCardCount], cbNormalCard, sizeof(BYTE)*cbNormalCardCount);
for (BYTE i = 0; i < 13; i++)
{
bCardDataTemp[0] = m_cbCardData[i];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount >= 2)
{
for (BYTE z = 0; z < 13; z++)
{
bCardDataTemp[1] = m_cbCardData[z];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount >= 3)
{
for (BYTE f = 0; f < 13; f++)
{
bCardDataTemp[2] = m_cbCardData[f];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount == 4)
{
for (BYTE l = 0; l < 13; l++)
{
bCardDataTemp[3] = m_cbCardData[l];
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbMaxCardData = 0, cbBlockCount = 0;
int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, cbMaxCardData, cbBlockCount, isLastCard);
if (iCardType == 0) continue;
if ((dCardType&(1 << iCardType)) == 0)
{
dCardType = TransListToInt(dCardType, iCardType);
}
}
}
else
{
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbMaxCardData = 0, cbBlockCount = 0;
int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, cbMaxCardData, cbBlockCount, isLastCard);
if (iCardType == 0) continue;
if ((dCardType&(1 << iCardType)) == 0)
{
dCardType = TransListToInt(dCardType, iCardType);
}
}
}
}
else
{
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbMaxCardData = 0, cbBlockCount = 0;
int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, cbMaxCardData, cbBlockCount, isLastCard);
if (iCardType == 0) continue;
if ((dCardType&(1 << iCardType)) == 0)
{
dCardType = TransListToInt(dCardType, iCardType);
}
}
}
}
else
{
ZeroMemory(&AnalyseResult, sizeof(AnalyseResult));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbMaxCardData = 0, cbBlockCount = 0;
int iCardType = GetType(AnalyseResult, bCardDataTemp, cbCardCount, cbMaxCardData, cbBlockCount, isLastCard);
if (iCardType == 0) continue;
if ((dCardType&(1 << iCardType)) == 0)
{
dCardType = TransListToInt(dCardType, iCardType);
}
}
}
}
}
return dCardType;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
int CGameLogic::GetType(tagAnalyseResult& AnalyseResult, const BYTE cbCardData[], BYTE cbCardCount, BYTE& cbMaxCardData, BYTE &cbBlockCount, bool isLastCard)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ;
cbMaxCardData = 0x0;
cbBlockCount = 0x0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (cbCardCount)
{
case 0: //<2F><><EFBFBD><EFBFBD>
{
return CT_ERROR;
}
case 1: //<2F><><EFBFBD><EFBFBD>
{
cbMaxCardData = cbCardData[0];
return CT_SINGLE;
}
case 2: //<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//if ((cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E)) return TransListToInt(0,CT_MISSILE_CARD);
if (GetCardLogicValue(cbCardData[0]) == GetCardLogicValue(cbCardData[1]))
{
cbMaxCardData = cbCardData[0];
return CT_DOUBLE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (GetCardLogicValue(cbCardData[0]) != GetCardLogicValue(cbCardData[1]))
{
if (IsLaiZiCard(cbCardData[0]) || IsLaiZiCard(cbCardData[1]))
{
if ((cbCardData[0] != 0x4F) && (cbCardData[0] != 0x4E) && (cbCardData[0] != 0x4F) && (cbCardData[1] != 0x4E))
{
cbMaxCardData = cbCardData[cbCardCount - 1];
return CT_DOUBLE;
}
}
}
return CT_ERROR;
}
case 4: //<2F><>ը;
{
if ((cbCardData[0] == 0x4F) && (cbCardData[1] == 0x4F) && (cbCardData[2] == 0x4E) && (cbCardData[3] == 0x4E))
{
cbMaxCardData = cbCardData[0];
return CT_BOMB_8;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((AnalyseResult.cbBlockCount[BLOCK_ONE] >= 5) && (AnalyseResult.cbBlockCount[BLOCK_ONE] == cbCardCount))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbFirstLogicValue = GetCardLogicValue(AnalyseResult.cbCardData[BLOCK_ONE][0]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbFirstLogicValue > 14) return CT_ERROR;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
for (BYTE i = 1; i < AnalyseResult.cbBlockCount[BLOCK_ONE]; i++)
{
BYTE cbTmpCardData = AnalyseResult.cbCardData[BLOCK_ONE][i];
if (cbFirstLogicValue != (GetCardLogicValue(cbTmpCardData) + i))
return CT_ERROR;
}
cbMaxCardData = cbCardData[0];
return CT_SINGLE_LINE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((AnalyseResult.cbBlockCount[BLOCK_TWO] >= 2) && (AnalyseResult.cbBlockCount[BLOCK_TWO] * 2 == cbCardCount))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbFirstLogicValue = GetCardLogicValue(AnalyseResult.cbCardData[BLOCK_TWO][0]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbFirstLogicValue > 14) return CT_ERROR;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
for (BYTE i = 1; i < AnalyseResult.cbBlockCount[BLOCK_TWO]; i++)
{
BYTE cbTmpCardData = AnalyseResult.cbCardData[BLOCK_TWO][i * 2];
if (cbFirstLogicValue != (GetCardLogicValue(cbTmpCardData) + i))
return CT_ERROR;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((AnalyseResult.cbBlockCount[BLOCK_TWO] * 2) == cbCardCount)
{
cbMaxCardData = cbCardData[0];
return CT_DOUBLE_LINE;
}
return CT_ERROR;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>CT_ERROR;
for (int i = BLOCK_FIVE; i <= BLOCK_TWELVE; i++)
{
if (AnalyseResult.cbBlockCount[i] > 0)
{
return CT_ERROR;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (AnalyseResult.cbBlockCount[BLOCK_THREE] == 1 && cbCardCount == 5)
{
cbMaxCardData = AnalyseResult.cbCardData[BLOCK_THREE][0];
return CT_THREE_TAKE_TWO;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (isLastCard && AnalyseResult.cbBlockCount[BLOCK_THREE] == 1 && cbCardCount <= 5)
{
cbMaxCardData = AnalyseResult.cbCardData[BLOCK_THREE][0];
return CT_THREE_TAKE_TWO;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((AnalyseResult.cbBlockCount[BLOCK_FOUR] == 1) && (cbCardCount == 5))
{
cbMaxCardData = AnalyseResult.cbCardData[BLOCK_FOUR][0];
return CT_THREE_TAKE_TWO;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (isLastCard && AnalyseResult.cbBlockCount[BLOCK_FOUR] == 1 && cbCardCount <= 5)
{
cbMaxCardData = AnalyseResult.cbCardData[BLOCK_FOUR][0];
return CT_THREE_TAKE_TWO;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
if (AnalyseResult.cbBlockCount[BLOCK_THREE] + AnalyseResult.cbBlockCount[BLOCK_FOUR] > 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>;
if (!isLastCard && (cbCardCount % 5 != 0)) return CT_ERROR;
BYTE cbCardType = CT_ERROR;
BYTE cbLineCardData[MAX_COUNT] = { 0 };
BYTE cbLineLength = 0;
// Ŀǰֻ<C7B0><D6BB><33><C8A1>5<EFBFBD><35><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>(<28><>3<EFBFBD><33>5<EFBFBD><35><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ʒŵ<C6B7>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
for (BYTE i = BLOCK_THREE; i <= BLOCK_FOUR; i++)
{
if (AnalyseResult.cbBlockCount[i] > 0)
{
for (BYTE j = 0; j < AnalyseResult.cbBlockCount[i]; j++)
{
BYTE cbTmpCardDate = AnalyseResult.cbCardData[i][j*(i + 1)];
// <20><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>2;
if (GetCardLogicValue(cbTmpCardDate) > 14) continue;
cbLineCardData[cbLineLength] = cbTmpCardDate;
cbLineLength++;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
SortCardList(cbLineCardData, cbLineLength, ST_ORDER);
BYTE cbLastValue = GetCardLogicValue(cbLineCardData[0]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(3~A)
if (cbLastValue > 14) return CT_ERROR;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
BYTE cbMaxThreeLength = 1;
BYTE cbThreeLength = 1;
BYTE cbMaxThreeCardData = cbLineCardData[0];
for (BYTE i = 1; i < cbLineLength; i++)
{
BYTE cbTmpValue = GetCardLogicValue(cbLineCardData[i]);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbLastValue != (cbTmpValue + 1))
{
if (cbMaxThreeLength < cbThreeLength)
{
cbMaxThreeLength = cbThreeLength;
cbMaxThreeCardData = cbLineCardData[i - cbMaxThreeLength];
}
cbThreeLength = 1;
}
else
{
cbThreeLength++;
}
cbLastValue = cbTmpValue;
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
if (cbMaxThreeLength < cbThreeLength)
{
cbMaxThreeLength = cbThreeLength;
cbMaxThreeCardData = cbLineCardData[cbLineLength - cbMaxThreeLength];
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>;
if (isLastCard && (cbMaxThreeLength * 5 >= cbCardCount))
{
cbBlockCount = cbMaxThreeLength;
cbMaxCardData = cbMaxThreeCardData;
cbCardType = CT_THREE_LINE;
}
else if (!isLastCard)
{
// <20><><EFBFBD><EFBFBD><E3BCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbTmpBlockCount = cbCardCount / 5;
//if (cbMaxThreeLength == cbTmpBlockCount)
if ((cbTmpBlockCount * 5 == cbCardCount) && (cbMaxThreeLength >= cbTmpBlockCount))
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData = cbMaxThreeCardData;
cbCardType = CT_THREE_LINE;
}
}
return cbCardType;
}
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_ORDER)
{
//ת<><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>
else if (cbSortType == ST_COUNT)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardIndex = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
tagAnalyseResult AnalyseResult;
ZeroMemory(&AnalyseResult, sizeof(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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void CGameLogic::RandNoJokerCardList(BYTE cbCardBuffer[], BYTE cbBufferCount)
{
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
BYTE cbCardData[CountArray(m_cbNoJokerCardData)];
CopyMemory(cbCardData, m_cbNoJokerCardData, sizeof(m_cbNoJokerCardData));
//<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::RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(cbRemoveCount<=cbCardCount);
if(cbRemoveCount>cbCardCount)
return false ;
//<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;
}
//<2F><>Ч<EFBFBD>ж<EFBFBD>
bool CGameLogic::IsValidCard(BYTE cbCardData)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
BYTE cbCardColor=GetCardColor(cbCardData);
BYTE cbCardValue=GetCardValue(cbCardData);
//<2F><>Ч<EFBFBD>ж<EFBFBD>
if ((cbCardData==0x4E)||(cbCardData==0x4F)) return true;
if ((cbCardColor<=0x30)&&(cbCardValue>=0x01)&&(cbCardValue<=0x0D)) return true;
return false;
}
//<2F>߼<EFBFBD><DFBC><EFBFBD>ֵ
BYTE CGameLogic::GetCardLogicValue(BYTE cbCardData)
{
if (!IsValidCard(cbCardData)) return 0;
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardColor=GetCardColor(cbCardData);
BYTE cbCardValue=GetCardValue(cbCardData);
//#ifdef _DEBUG
// if(cbCardValue<=0 || cbCardValue>(MASK_VALUE&0x4f))
// return 0 ;
//#endif
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 CMD_C_OutCard* pFirstOutCard, CMD_C_OutCard* pNextOutCard)
{
if (pFirstOutCard == nullptr || pNextOutCard == nullptr) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
int cbFirstType = pFirstOutCard->cbCardType;
int cbNextType = pNextOutCard->cbCardType;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (cbNextType == CT_ERROR) return false;
BYTE cbFirstCount = pFirstOutCard->cbCardCount;
BYTE cbNextCount = pNextOutCard->cbCardCount;
bool isFirstLastCard = pFirstOutCard->isLastCard;
bool isNextLastCard = pNextOutCard->isLastCard;
BYTE cbFirstCard[MAX_COUNT] = { 0 };
BYTE cbNextCard[MAX_COUNT] = { 0 };
CopyMemory(cbFirstCard, pFirstOutCard->cbCardData, sizeof(BYTE)*cbFirstCount);
CopyMemory(cbNextCard, pNextOutCard->cbCardData, sizeof(BYTE)*cbNextCount);
//ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int cbTmpFirstType = (cbFirstType >> CT_BOMB_4);
int cbTmpNextType = (cbNextType >> CT_BOMB_4);
if (cbTmpFirstType > 0 || cbTmpNextType > 0)
{
// <20><>ǰ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>ը<EFBFBD><D5A8><EFBFBD><EFBFBD><EFBFBD>򲻵<EFBFBD><F2B2BBB5><EFBFBD>һ<EFBFBD><D2BB>ը<EFBFBD><D5A8><EFBFBD><EFBFBD>;
if (cbTmpNextType < 0) return false;
//if (cbTmpFirstType > 0) return true;
//<2F>Ǽ<EFBFBD><C7BC>Ƚ<EFBFBD>
if (cbTmpFirstType != cbTmpNextType)
{
if (cbTmpNextType > cbTmpFirstType)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (cbTmpNextType << CT_BOMB_4);
return true;
}
else
{
return false;
}
}
else
{
// ȡ<><C8A1><EFBFBD><EFBFBD>һ<EFBFBD>ţ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>Ǿ<EFBFBD><C7BE><EFBFBD>4<EFBFBD><34>ը;
BYTE cbConsultNext = GetCardLogicValue(cbNextCard[cbNextCount - 1]);
BYTE cbConsultFirst = GetCardLogicValue(cbFirstCard[cbFirstCount - 1]);
if (cbConsultNext > cbConsultFirst)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (cbTmpNextType << CT_BOMB_4);
return true;
}
else
{
return false;
}
//return cbConsultNext > cbConsultFirst;
}
}
//<2F><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>
if (cbFirstType != cbNextType) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
BYTE cbNextLogicValue = 0;
BYTE cbFirstLogicValue = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE NextResult[CT_COUNT] = {0};
BYTE FirstResult[CT_COUNT] = { 0 };
// <20><><EFBFBD><EFBFBD>;
if ((cbNextType&(1 << CT_SINGLE)) != 0 && cbFirstCount == cbNextCount)
{
if (cbFirstCount != 1) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(cbNextCard[0]);
cbFirstLogicValue = GetCardLogicValue(cbFirstCard[0]);
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_SINGLE);
return true;
}
}
else if ((cbNextType&(1 << CT_DOUBLE)) != 0 && cbFirstCount == cbNextCount)
{
if (cbFirstCount != 2) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(cbNextCard[1]);
cbFirstLogicValue = GetCardLogicValue(cbFirstCard[1]);
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_DOUBLE);
return true;
}
}
else if ((cbNextType&(1 << CT_THREE_TAKE_TWO)) != 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
if (cbFirstCount < 3 || cbFirstCount > 5) return false;
if (cbNextCount < 3 || cbNextCount > 5) return false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><35>;
if (!isFirstLastCard && cbFirstCount != 5) return false;
if (!isNextLastCard && cbNextCount != 5) return false;
BYTE cbNextBlockCount = 0, cbFirstBlockCount = 0;
if (!AnalysebCompare(cbNextCard, cbNextCount, NextResult, cbNextBlockCount, CT_THREE_TAKE_TWO, isNextLastCard))return false;
if (!AnalysebCompare(cbFirstCard, cbFirstCount, FirstResult, cbFirstBlockCount, CT_THREE_TAKE_TWO, isFirstLastCard))return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(NextResult[CT_THREE_TAKE_TWO]);
cbFirstLogicValue = GetCardLogicValue(FirstResult[CT_THREE_TAKE_TWO]);
//if (cbNextLogicValue > cbFirstLogicValue) return true;
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_THREE_TAKE_TWO);
return true;
}
}
else if ((cbNextType&(1 << CT_SINGLE_LINE)) != 0 && cbFirstCount == cbNextCount)
{
if (cbFirstCount < 5) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(cbNextCard[cbNextCount - 1]);
cbFirstLogicValue = GetCardLogicValue(cbFirstCard[cbFirstCount - 1]);
//if (cbNextLogicValue > cbFirstLogicValue) return true;
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_SINGLE_LINE);
return true;
}
}
else if ((cbNextType&(1 << CT_DOUBLE_LINE)) != 0 && cbFirstCount == cbNextCount)
{
if ((cbFirstCount < 4) || (cbFirstCount%2)!=0) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(cbNextCard[cbNextCount - 1]);
cbFirstLogicValue = GetCardLogicValue(cbFirstCard[cbFirstCount - 1]);
//if (cbNextLogicValue > cbFirstLogicValue) return true;
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_DOUBLE_LINE);
return true;
}
}
else if ((cbNextType&(1 << CT_THREE_LINE)) != 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
if (cbFirstCount < 6 || cbNextCount < 6) return false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>;
if (!isFirstLastCard && (cbFirstCount%5) != 0) return false;
if (!isNextLastCard && (cbNextCount%5) != 0) return false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ;
if (!isFirstLastCard &&!isNextLastCard && (cbNextCount != cbFirstCount)) return false;
BYTE cbNextBlockCount = 0, cbFirstBlockCount = 0;
if (!AnalysebCompare(cbNextCard, cbNextCount, NextResult, cbNextBlockCount, CT_THREE_LINE, isNextLastCard))return false;
if (!AnalysebCompare(cbFirstCard, cbFirstCount, FirstResult, cbFirstBlockCount, CT_THREE_LINE, isFirstLastCard))return false;
if (cbNextBlockCount != cbFirstBlockCount) return false;
//<2F><>ȡ<EFBFBD><C8A1>ֵ
cbNextLogicValue = GetCardLogicValue(NextResult[CT_THREE_LINE]);
cbFirstLogicValue = GetCardLogicValue(FirstResult[CT_THREE_LINE]);
//if (cbNextLogicValue > cbFirstLogicValue) return true;
if (cbNextLogicValue > cbFirstLogicValue)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
pNextOutCard->cbCardType = (1 << CT_THREE_LINE);
return true;
}
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
BYTE CGameLogic::GetLaiZiCount(const BYTE cbHandCardData[], BYTE cbHandCardCount)
{
BYTE bLaiZiCount=0;
for(BYTE i=0;i<cbHandCardCount;i++)
{
if (IsLaiZiCard(cbHandCardData[i]))
bLaiZiCount++;
}
return bLaiZiCount;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CGameLogic::IsLaiZiCard(BYTE cbCard)
{
ASSERT(IsValidCard(cbCard));
if (0x40 == GetCardColor(cbCard))
{
return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void CGameLogic::AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
BYTE cbTmpCardData[MAX_COUNT] = { 0 };
CopyMemory(cbTmpCardData, cbCardData, sizeof(BYTE)*cbCardCount);
SortCardList(cbTmpCardData, cbCardCount, ST_ORDER);
//<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(cbTmpCardData[i]);
//<2F><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
for (BYTE j = i + 1; j < cbCardCount; j++)
{
//<2F><>ȡ<EFBFBD>˿<EFBFBD>
if (GetCardLogicValue(cbTmpCardData[j]) != cbLogicValue) break;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
cbSameCount++;
}
//<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] = cbTmpCardData[i + j];
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i += cbSameCount - 1;
}
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>
bool CGameLogic::AnalysebCompare(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbMaxCardData[CT_COUNT], BYTE &cbBlockCount, int dCardType, bool isLastCard)
{
// <20><><EFBFBD><EFBFBD>;
cbBlockCount = 0;
ZeroMemory(cbMaxCardData, sizeof(cbMaxCardData));
// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>;
BYTE cbNormalCard[MAX_COUNT] = { 0 };
BYTE cbMagicCardCount = 0; // <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
BYTE cbNormalCardCount = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
for (BYTE i = 0; i < cbCardCount; i++)
{
if (IsLaiZiCard(cbCardData[i]))
{
cbMagicCardCount++;
}
else
{
cbNormalCard[cbNormalCardCount++] = cbCardData[i];
}
}
int dCardTypeTemp = CT_ERROR;
dCardTypeTemp = 1 << dCardType;
// û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (cbMagicCardCount == 0)
{
BYTE bCardDataTemp[MAX_COUNT] = { 0 };
CopyMemory(bCardDataTemp, cbCardData, sizeof(BYTE)*cbCardCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
tagAnalyseResult AnalyseResultTemp;
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResultTemp);
//int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbTmpMaxCardData = 0, cbTmpBlockCount = 0;
int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, cbTmpMaxCardData, cbTmpBlockCount, isLastCard);
if ((dCardTypeTemp&(1 << iCardType)) != 0)
{
//AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
if (cbMaxCardData[iCardType] < cbTmpMaxCardData)
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData[iCardType] = cbTmpMaxCardData;
}
}
}
else
{
if (cbMagicCardCount >= 1)
{
tagAnalyseResult AnalyseResultTemp;
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
BYTE bCardDataTemp[MAX_COUNT] = { 0 };
CopyMemory(&bCardDataTemp[cbMagicCardCount], cbNormalCard, sizeof(BYTE)*cbNormalCardCount);
for (BYTE i = 0; i < 13; i++)
{
bCardDataTemp[0] = m_cbCardData[i];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount >= 2)
{
for (BYTE z = 0; z < 13; z++)
{
bCardDataTemp[1] = m_cbCardData[z];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount >= 3)
{
for (BYTE f = 0; f < 13; f++)
{
bCardDataTemp[2] = m_cbCardData[f];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cbMagicCardCount == 4)
{
for (BYTE l = 0; l < 13; l++)
{
bCardDataTemp[3] = m_cbCardData[l];
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResultTemp);
//int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbTmpMaxCardData = 0, cbTmpBlockCount = 0;
int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, cbTmpMaxCardData, cbTmpBlockCount,isLastCard);
if ((dCardTypeTemp&(1 << iCardType)) != 0)
{
//AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//if (cbMaxCardData[iCardType] < cbTmpMaxCardData)
if (GetCardLogicValue(cbMaxCardData[iCardType]) < GetCardLogicValue(cbTmpMaxCardData))
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData[iCardType] = cbTmpMaxCardData;
}
}
}
}
else
{
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResultTemp);
//int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbTmpMaxCardData = 0, cbTmpBlockCount = 0;
int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, cbTmpMaxCardData, cbTmpBlockCount, isLastCard);
if ((dCardTypeTemp&(1 << iCardType)) != 0)
{
//AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//if (cbMaxCardData[iCardType] < cbTmpMaxCardData)
if (GetCardLogicValue(cbMaxCardData[iCardType]) < GetCardLogicValue(cbTmpMaxCardData))
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData[iCardType] = cbTmpMaxCardData;
}
}
}
}
}
else
{
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResultTemp);
//int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbTmpMaxCardData = 0, cbTmpBlockCount = 0;
int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, cbTmpMaxCardData, cbTmpBlockCount, isLastCard);
if ((dCardTypeTemp&(1 << iCardType)) != 0)
{
//AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//if (cbMaxCardData[iCardType] < cbTmpMaxCardData)
if (GetCardLogicValue(cbMaxCardData[iCardType]) < GetCardLogicValue(cbTmpMaxCardData))
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData[iCardType] = cbTmpMaxCardData;
}
}
}
}
}
else
{
ZeroMemory(&AnalyseResultTemp, sizeof(AnalyseResultTemp));
AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResultTemp);
//int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, isLastCard);
BYTE cbTmpMaxCardData = 0, cbTmpBlockCount = 0;
int iCardType = GetType(AnalyseResultTemp, bCardDataTemp, cbCardCount, cbTmpMaxCardData, cbTmpBlockCount, isLastCard);
if ((dCardTypeTemp&(1 << iCardType)) != 0)
{
//AnalysebCardData(bCardDataTemp, cbCardCount, AnalyseResult);
//if (cbMaxCardData[iCardType] < cbTmpMaxCardData)
if (GetCardLogicValue(cbMaxCardData[iCardType]) < GetCardLogicValue(cbTmpMaxCardData))
{
cbBlockCount = cbTmpBlockCount;
cbMaxCardData[iCardType] = cbTmpMaxCardData;
}
}
}
}
}
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE CGameLogic::GetRandomCard(void)
{
size_t cbIndex = rand()%(sizeof(m_cbCardData)) ;
return m_cbCardData[cbIndex] ;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void CGameLogic::SortOutCardList(BYTE cbCardData[], BYTE cbCardCount, int nCardType, bool isLastCard)
{
return;
}
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA> (<28><>32<33><32><EFBFBD>Ƶ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊһ<CEAA><D2BB>32λ<32><CEBB><EFBFBD><EFBFBD>)
int CGameLogic::TransListToInt(int iOldType,int iNewType)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
if(iNewType == 0) return 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nList = 0;
ASSERT(iNewType != -1);
nList |= (1<<iNewType);
return iOldType|nList;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CGameLogic::IsHasCardType(int iCardType, CART_TYPE ct_value)
{
if (iCardType == CT_ERROR) return false;
return ((iCardType&(1 << ct_value)) != 0);
}