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; 
}