#include "StdAfx.h" #include "GameLogic.h" BYTE CGameLogic::m_cbCardList[FULL_COUNT] = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D, //方块 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D, //梅花 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D, //红桃 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, //黑桃 }; bool CGameLogic::IsValidCard(BYTE cbCard) { const BYTE cbColor = GetCardColor(cbCard); const BYTE cbValue = GetCardValue(cbCard); return (cbColor<=3 && cbValue>=0x01 && cbValue<=0x0D) ? true : false; } BYTE CGameLogic::GetLogicValue(BYTE cbCard) { ASSERT(IsValidCard(cbCard)); const BYTE cbValue = GetCardValue(cbCard); return (cbValue>10) ? 10 : cbValue; } void CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount) { ASSERT((MAX_COUNT-2)==cbCardCount || MAX_COUNT==cbCardCount); if ((MAX_COUNT-2)!=cbCardCount && MAX_COUNT!=cbCardCount) return; BYTE cbCardValue[MAX_COUNT] = { 0 }; for (BYTE i=0; i cbCardCount) return false; BYTE cbDeleteCount = 0, cbDeleteCard[FULL_COUNT] = { 0 }; ASSERT(cbCardCount <= sizeof(cbDeleteCard) / sizeof(cbDeleteCard[0])); if (cbCardCount > sizeof(cbDeleteCard) / sizeof(cbDeleteCard[0])) return false; CopyMemory(cbDeleteCard, cbCardData, sizeof(cbCardData[0])*cbCardCount); for (BYTE i = 0; i < cbRemoveCount; ++i) { for (BYTE j = 0; j < cbCardCount; ++j) { if (cbRemoveCard[i] == cbDeleteCard[j]) { cbDeleteCount++; cbDeleteCard[j] = 0; break; } } } ASSERT(cbDeleteCount == cbRemoveCount); if (cbDeleteCount != cbRemoveCount) return false; BYTE cbCardPos = 0; for (BYTE i = 0; i < cbCardCount; ++i) { if (0 != cbDeleteCard[i]) { cbCardData[cbCardPos++] = cbDeleteCard[i]; } } return true; } BYTE CGameLogic::GetCardType(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbSortCard[], bool IsHasWHN, bool IsHasBomb, bool IsHasWXN) { ASSERT((MAX_COUNT-2)==cbCardCount || MAX_COUNT==cbCardCount); BYTE cbTempData[MAX_COUNT] = { 0 }; CopyMemory(cbTempData, cbCardData, sizeof(BYTE)*cbCardCount); // 有特殊牛; //if (IsSpeical) { if (IsHasWHN && (MAX_COUNT == cbCardCount) && IsWuHuaNiu(cbTempData, cbCardCount)) { if (nullptr != cbSortCard) { CopyMemory(cbSortCard, cbCardData, sizeof(BYTE)*cbCardCount); } return NIU_TYPE_WHN; } if (IsHasWXN && (MAX_COUNT == cbCardCount) && IsWuXiaoNiu(cbTempData, cbCardCount)) { if (nullptr != cbSortCard) { CopyMemory(cbSortCard, cbCardData, sizeof(BYTE)*cbCardCount); } return NIU_TYPE_WXN; } if (IsHasBomb && (MAX_COUNT == cbCardCount) && IsZhaDan(cbTempData, cbCardCount)) { if (nullptr != cbSortCard) { CopyMemory(cbSortCard, cbCardData, sizeof(BYTE)*cbCardCount); } return NIU_TYPE_SHN; } } BYTE cbValueSum = 0; BYTE cbLogicValue[MAX_COUNT] = { 0 }; for (BYTE i=0; i10) ? cbCowValue-10 : cbCowValue; } } } } if (nullptr != cbSortCard) { CopyMemory(cbSortCard, cbCardData, sizeof(BYTE)*cbCardCount); } return NIU_TYPE_0; } BYTE CGameLogic::GetWinNiuFan(const BYTE cbCardType) { switch (cbCardType) { case NIU_TYPE_WXN: return 6; case NIU_TYPE_SHN: return 5; case NIU_TYPE_WHN: return 4; case NIU_TYPE_10: return 3; case NIU_TYPE_9: case NIU_TYPE_8: case NIU_TYPE_7: return 2; } ASSERT(cbCardType >= NIU_TYPE_0 && cbCardType < NIU_TYPE_7); return 1; } BYTE CGameLogic::GetMaxCard(const BYTE cbCardData[], const BYTE cbCardCount) { BYTE cbTempData[MAX_COUNT] = { 0 }; CopyMemory(cbTempData, cbCardData, sizeof(BYTE)*cbCardCount); SortCardList(cbTempData, cbCardCount); return cbTempData[0]; } bool CGameLogic::CompareCard(const tagOpenCardRlt stFirstData, const tagOpenCardRlt stNextData) { if (stFirstData.cbCardType != stNextData.cbCardType) { return (stFirstData.cbCardType > stNextData.cbCardType) ? true : false; } BYTE cbFirstValue = GetCardValue(stFirstData.cbMaxCard); BYTE cbNextValue = GetCardValue(stNextData.cbMaxCard); if (cbFirstValue != cbNextValue) { return (cbFirstValue > cbNextValue) ? true : false; } BYTE cbFirstColor = GetCardColor(stFirstData.cbMaxCard); BYTE cbNextColor = GetCardColor(stNextData.cbMaxCard); return (cbFirstColor > cbNextColor) ? true : false; } bool CGameLogic::IsWuHuaNiu(const BYTE cbCardData[], const BYTE cbCardCount) { ASSERT(MAX_COUNT==cbCardCount || (MAX_COUNT-2)==cbCardCount); if (MAX_COUNT!=cbCardCount && (MAX_COUNT-2)!=cbCardCount) return false; for (BYTE i=0; i= 5) { return false; } cbValueSum += cbCardValue; } return (cbValueSum<=10) ? true : false; } //是否是炸弹; bool CGameLogic::IsZhaDan(const BYTE cbCardData[], const BYTE cbCardCount) { ASSERT(MAX_COUNT == cbCardCount || (MAX_COUNT - 2) == cbCardCount); if (MAX_COUNT != cbCardCount && (MAX_COUNT - 2) != cbCardCount) return false; BYTE aryCardCount[14] = {0}; for (BYTE i = 0; i < cbCardCount; ++i) { BYTE cbCardValue = GetCardValue(cbCardData[i]); aryCardCount[cbCardValue]++; } for (BYTE j = 0; j < 14; j++) { if (4 == aryCardCount[j]) { return true; } } return false; }