www.pudn.com > mytest.rar > GameEngine.cpp
// GameEngine.cpp: implementation of the CGameEngine class. // ////////////////////////////////////////////////////////////////////// #pragma warning(disable: 4786) #include "stdafx.h" #include "mytest.h" #include "GameEngine.h" #include#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif const int VECTOR_SIZE = 54 ; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGameEngine::CGameEngine(int iNo) { initGameEngine(); } CGameEngine::~CGameEngine() { } void CGameEngine::initGameEngine() { m_iFirPlayer = 0; m_iSecPlayer = 0; m_iThiPlayer = 0; m_iBottomCards = 0; m_iTotal = VECTOR_SIZE; } int CGameEngine::Rand(int n) { srand((unsigned)time(NULL)); return rand() % n; } int CGameEngine::bitTotal(__int64 iNumber, int iBit) { switch(iBit) { case ZERO: return getZeroTotal(iNumber); case ONE: return getOneTotal(iNumber); default: break; } return -1; } int CGameEngine::getOneTotal(__int64 iNumber) { int iTotal = 0; while(iNumber) { iTotal++; iNumber &= (iNumber-1); } return iTotal; } int CGameEngine::getZeroTotal(__int64 iNumber) { int iTotal = 0; while(iNumber != (unsigned __int64)-1) { iTotal++; iNumber |= (iNumber + 1); } return iTotal; } int CGameEngine::initCards(IntVector& vNumbers, __int64& iPlayer, int iCardNum) { IntVectorIt it; __int64 iOne = 1; for(int i = 0; i < iCardNum; i++) { int iSelect = Rand(m_iTotal--); it = vNumbers.begin() + iSelect; iPlayer += (iOne << (*it)); vNumbers.erase(it); } return getOneTotal(iPlayer); } void CGameEngine::Shuffle() { __int64 iOne = 1; IntVector Numbers(VECTOR_SIZE) ; for(int i = 0; i < VECTOR_SIZE; i++) { Numbers[i] = i; } int iCardNum; iCardNum = initCards(Numbers, m_iFirPlayer, 17); iCardNum = initCards(Numbers, m_iSecPlayer, 17); iCardNum = initCards(Numbers, m_iBottomCards, 3); IntVectorIt it; iCardNum = Numbers.size(); for(it = Numbers.begin(); it < Numbers.end(); it++) { m_iThiPlayer += (iOne << (*it)); } } __int64 CGameEngine::getPlayerCards(int iPlayerNo) { switch(iPlayerNo) { case FIRSTPLAYER: return m_iFirPlayer; case SECONDPLAYER: return m_iSecPlayer; case THIRDPLAYER: return m_iThiPlayer; case BOTTOMCARDS: return m_iBottomCards; default: return 0; } } // parse all the cards to get the type int CGameEngine::ParseTwo(__int64 iCards) { int iTemp, iNum = 0; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: return 0; break; case 2: if(i == 13) { return 3; } else { return 2; } break; default: break; } iCards >>= 4; } return 0; } int CGameEngine::ParseThree(__int64 iCards) { int iTemp; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); if(getOneTotal(iTemp) == 3) { return 4; } iCards >>= 4; } return 0; } int CGameEngine::ParseFour(__int64 iCards) { int iTemp; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 2: return 0; case 3: return 6; case 4: return 5; default: break; } iCards >>= 4; } return 0; } int CGameEngine::ParseFive(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; bool bSeparate = false; bool b2 = false, b3 = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 5) { return 7; } break; case 2: b2 = true; if(b3) return 8; break; case 3: b3 = true; if(b2) return 8; break; case 4: return 9; default: break; } iCards >>= 4; } return 0; } int CGameEngine::ParseSix(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; int iNumPair = 0, iPair; int iNumThree = 0, iThree; bool bFour = false; bool bSeparater = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(bFour) { return 12; } if(iNumSingle > 1 && iSingle != i -1) { bSeparater = true; } if(iNumSingle > 2 && bSeparater || i > 11) { return 0; } iSingle = i; if(iNumSingle == 6) { return 10; } break; case 2: iNumPair++; if(bFour) { return 13; } if(iNumPair > 1 && iPair != i -1 || i > 11) { return 0; } iPair = i; if(iNumPair == 3) return 11; break; case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 2) return 14; break; case 4: if(iNumSingle) { return 12; } if(iNumPair) { return 13; } bFour = true; break; default: break; } iCards >>= 4; } return 0; } int CGameEngine::ParseSeven(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 7) { return 15; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseEight(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; int iNumPair = 0, iPair; int iNumThree = 0, iThree; bool bSeparate = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1) { bSeparate = true; } if(iNumSingle > 2 && bSeparate || i > 11) { return 0; } iSingle = i; if(iNumSingle == 8) { return 16; } break; case 2: iNumPair++; if(iNumPair > 1 && iPair != i -1 || i > 11) { return 0; } iPair = i; if(iNumPair == 4) { return 17; } break; case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 2) { return 18; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseNine(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; int iNumThree = 0, iThree; bool bSeparate = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 9) { return 19; } break; case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 3) { return 20; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseTen(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; int iNumPair = 0, iPair; int iNumThree = 0, iThree; bool bSeparate = false; bool bIsThree = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 10) { return 21; } break; case 2: iNumPair++; if(iNumPair > 1 && iPair != i -1) { bSeparate = true; } if(iNumPair == 2 && bIsThree) { return 23; } if(iNumPair > 2 && i > 11) { return 0; } iPair = i; if(iNumPair == 5) { return 22; } break; case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 2) { if(iNumPair == 2) return 23; else bIsThree = true; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseElevent(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 11) { return 24; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseTwelve(__int64 iCards) { int iTemp; int iNumSingle = 0, iSingle; int iNumPair = 0, iPair; int iNumThree = 0, iThree; bool bSeparate = false; bool bIsThree = false; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 1: iNumSingle++; if(iNumSingle > 1 && iSingle != i -1 || i > 11) { return 0; } iSingle = i; if(iNumSingle == 12) { return 25; } break; case 2: iNumPair++; if(iNumPair > 1 && iPair != i -1 || i > 11) { return 0; } iPair = i; if(iNumPair == 6) { return 26; } break; case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 4) { return 27; } break; default: if(!iNumSingle) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseForteen(__int64 iCards) { int iTemp; int iNumPair = 0, iPair; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 2: iNumPair++; if(iNumPair > 1 && iPair != i -1 || i > 11) { return 0; } iPair = i; if(iNumPair == 7) { return 28; } break; default: if(!iNumPair) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseFifteen(__int64 iCards) { int iTemp; int iNumThree = 0, iThree; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 5) { return 29; } break; default: if(!iNumThree) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseSixteen(__int64 iCards) { int iTemp; int iNumThree = 0, iThree; for(int i = 0; i < 14; i++) { iTemp = int(iCards & 0xf); switch(getOneTotal(iTemp)) { case 3: iNumThree++; if(iNumThree > 1 && iThree != i -1 || i > 11) { return 0; } iThree = i; if(iNumThree == 4) { return 30; } break; default: if(!iNumThree) break; return 0; } iCards >>= 4; } return 0; } int CGameEngine::ParseType(__int64 iCards) { int iOneTotal = getOneTotal(iCards); switch(iOneTotal) { case 1: return 1; case 2: return ParseTwo(iCards); case 3: return ParseThree(iCards); case 4: return ParseFour(iCards); case 5: return ParseFive(iCards); case 6: return ParseSix(iCards); case 7: return ParseSeven(iCards); case 8: return ParseEight(iCards); case 9: return ParseNine(iCards); case 10: return ParseTen(iCards); case 11: return ParseElevent(iCards); case 12: return ParseTwelve(iCards); case 14: return ParseForteen(iCards); case 15: return ParseFifteen(iCards); case 16: return ParseSixteen(iCards); default: break; } return 0; }