www.pudn.com > gamec11 > LandMine.cpp


#include "stdafx.h" 
#include "Resource.h" 
#include "LandMine.h" 
extern CPen Pen1,Pen2,Pen3,Pen4,Pen5,Pen6,Pen7; 
 
void CMineButton::DrawItem(BOOL bFail) 
{ 
	 
	RECT rect; 
	rect.left = m_nX; 
	rect.top = m_nY; 
	rect.right = m_nX+14; 
	rect.bottom = m_nY+14; 
	CClientDC ClientDC(m_pParent); 
	ClientDC.SetBkColor(RGB(198,198,198)); 
 
	ClientDC.SelectStockObject(LTGRAY_BRUSH); 
	ClientDC.SelectObject(Pen6); 
	ClientDC.Rectangle(&rect); 
 
	if(m_nStatus==MS_OPEN || bFail && m_nStatus==MS_FLAG && m_nMineNum>=0) 
	{ 
		switch(m_nMineNum) 
		{ 
		case 1: 
			ClientDC.SetTextColor(RGB(0,128,0)); 
			break; 
 
		case 2: 
			ClientDC.SetTextColor(RGB(0,128,128)); 
			break; 
			 
		case 3: 
			ClientDC.SetTextColor(RGB(0,0,128)); 
			break; 
			 
		case 4: 
			ClientDC.SetTextColor(RGB(0,128,0)); 
			break; 
			 
		case 5: 
			ClientDC.SetTextColor(RGB(128,0,0)); 
			break; 
			 
		case 6: 
			ClientDC.SetTextColor(RGB(0,255,0)); 
			break; 
			 
		case 7: 
			ClientDC.SetTextColor(RGB(128,128,0)); 
			break; 
			 
		case 8: 
			ClientDC.SetTextColor(RGB(255,0,255)); 
			break; 
		} 
		char cTmp[2]={0,0}; 
		if(m_nMineNum>0) 
		{ 
			cTmp[0]=m_nMineNum+'0'; 
			ClientDC.DrawText(cTmp,-1,&rect,DT_CENTER|DT_VCENTER); 
		} 
		int nI; 
 
		ClientDC.SelectObject(Pen6); 
		ClientDC.SetBkColor(RGB(198,198,198)); 
		ClientDC.SelectStockObject(NULL_BRUSH); 
		ClientDC.Rectangle(rect.left,rect.top,rect.right+1,rect.bottom+1); 
		for(nI=rect.left;nIDrawItem(bFail); 
} 
void CLandMine::Reset(int nRow,int nCol,int nMineNum) 
{ 
	int nI; 
	RECT rect; 
	for(nI=0;nICreate(m_pParent,rect.left,rect.top); 
		m_aLandMine[nI]->SetStatus(MS_NORMAL); 
	//	m_aLandMine[nI]->SetMineNum(0); 
	} 
	m_nRow = nRow; 
	m_nCol = nCol; 
	m_nMineNum = nMineNum; 
	 
	int nCurMines=0; 
	int nCurMine; 
	srand( (unsigned)time( NULL )); 
//	srand(1); 
	while(nCurMinesGetMineNum() != -1) 
		{ 
			m_aLandMine[nCurMine]->SetMineNum(-1); 
			int nMineRound,nMineRound1; 
			//right; 
			nMineRound = GetRight(nCurMine); 
			if(nMineRound>=0) 
			{ 
				if (m_aLandMine[nMineRound]->GetMineNum() != -1) 
					++(*m_aLandMine[nMineRound]); 
				//right top 
				nMineRound1 = GetTop(nMineRound); 
				if(nMineRound1>=0 && m_aLandMine[nMineRound1]->GetMineNum() != -1) 
				{ 
					++(*m_aLandMine[nMineRound1]); 
				} 
				//right bottom 
				nMineRound1 = GetBot(nMineRound); 
				if(nMineRound1>=0 && m_aLandMine[nMineRound1]->GetMineNum() != -1) 
				{ 
					++(*m_aLandMine[nMineRound1]); 
				} 
			}			 
			//left 
			nMineRound = GetLeft(nCurMine); 
			if(nMineRound>=0) 
			{ 
				if(m_aLandMine[nMineRound]->GetMineNum() != -1) 
					++(*m_aLandMine[nMineRound]); 
		 
				//Left top 
				nMineRound1 = GetTop(nMineRound); 
				if(nMineRound1>=0 && m_aLandMine[nMineRound1]->GetMineNum() != -1) 
				{ 
					++(*m_aLandMine[nMineRound1]); 
				} 
				 
				//Left bottom 
				nMineRound1 = GetBot(nMineRound); 
				if(nMineRound1>=0 && m_aLandMine[nMineRound1]->GetMineNum() != -1) 
				{ 
					++(*m_aLandMine[nMineRound1]); 
				} 
			} 
			//Top 
			nMineRound = GetTop(nCurMine); 
			if(nMineRound>=0 && m_aLandMine[nMineRound]->GetMineNum() != -1) 
			{ 
				++(*m_aLandMine[nMineRound]); 
			} 
 
			//Bottom 
			nMineRound = GetBot(nCurMine); 
			if(nMineRound>=0 && m_aLandMine[nMineRound]->GetMineNum() != -1) 
			{ 
				++(*m_aLandMine[nMineRound]); 
			} 
			nCurMines++; 
		} 
	} 
} 
void CLandMine::LButtonDown(CPoint point) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if (nRow >= m_nRow || nCol>=m_nCol || point.xGetStatus()==MS_NORMAL || m_aLandMine[nCurMine]->GetStatus()==MS_QUEST)) 
	{ 
		m_aLandMine[nCurMine]->ButtonDown(1); 
		m_nOldMine = nCurMine; 
	} 
}; 
int CLandMine::LButtonUp(CPoint point) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if (nRow >= m_nRow || nCol>=m_nCol || point.xGetMineNum() == -1) 
				m_aLandMine[nI]->DrawItem(TRUE); 
			if(m_aLandMine[nI]->GetStatus() == MS_FLAG) 
				m_aLandMine[nI]->DrawItem(TRUE); 
		} 
		return -1; 
	} 
	return 1; 
 
} 
 
BOOL CLandMine::OpenMine(int nCurMine) 
{ 
	int nRoundMine,nRoundMine1; 
	int aMine[500]; 
	int nTop=0,nTail=0; 
	 
	aMine[nTop++] = nCurMine; 
	 
	while(nTop!=nTail) 
	{ 
		int nCurrent=aMine[nTail]; 
		nTail = (nTail+1)%500; 
		switch(m_aLandMine[nCurrent]->OpenMine()) 
		{ 
		case 0:		// Mine number is zero 
			nRoundMine = GetLeft(nCurrent); 
			if(nRoundMine!=-1) 
			{ 
				aMine[nTop] = nRoundMine; 
				nTop = (nTop+1)%500; 
				nRoundMine1 = GetTop(nRoundMine); 
				if(nRoundMine1!=-1) 
				{ 
					aMine[nTop] = nRoundMine1; 
					nTop = (nTop+1)%500; 
					nRoundMine1 = GetTop(nRoundMine); 
				} 
				nRoundMine1 = GetBot(nRoundMine); 
				if(nRoundMine1!=-1) 
				{ 
					aMine[nTop] = nRoundMine1; 
					nTop = (nTop+1)%500; 
					nRoundMine1 = GetTop(nRoundMine); 
				} 
			} 
			nRoundMine = GetRight(nCurrent); 
			if(nRoundMine!=-1) 
			{	 
				aMine[nTop] = nRoundMine; 
				nTop = (nTop+1)%500; 
				nRoundMine1 = GetTop(nRoundMine); 
				if(nRoundMine1!=-1) 
				{ 
					aMine[nTop] = nRoundMine1; 
					nTop = (nTop+1)%500; 
					nRoundMine1 = GetTop(nRoundMine); 
				} 
				nRoundMine1 = GetBot(nRoundMine); 
				if(nRoundMine1!=-1) 
				{ 
					aMine[nTop] = nRoundMine1; 
					nTop = (nTop+1)%500; 
					nRoundMine1 = GetTop(nRoundMine); 
				} 
			} 
			nRoundMine = GetTop(nCurrent); 
			if(nRoundMine!=-1) 
			{	 
				aMine[nTop] = nRoundMine; 
				nTop = (nTop+1)%500; 
			} 
			nRoundMine = GetBot(nCurrent); 
			if(nRoundMine!=-1) 
			{ 
				aMine[nTop] = nRoundMine; 
				nTop = (nTop+1)%500; 
			} 
			break; 
		case 1: 
			break; 
		case -1: 
			return FALSE;		// fail 
		} 
	} 
	return TRUE; 
} 
 
BOOL CLandMine::IsSuccess() 
{ 
	int nI,nStatus; 
	for(nI=0;nIGetStatus(); 
		if(nStatus != MS_OPEN) 
		{ 
			if(!(nStatus==MS_FLAG && m_aLandMine[nI]->GetMineNum()==-1)) 
				return 0;			// not finish 
		} 
		 
	} 
	return 1;		// success 
} 
void CLandMine::MouseMove(CPoint point,int bBothDown) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if(nRow>=m_nRow || nCol>=m_nCol || point.x=0) 
				m_aLandMine[m_nOldMine]->ButtonDown(0); 
			if (nCurMine>=0) 
			{ 
				m_aLandMine[nCurMine]->ButtonDown(1); 
				 
			} 
			m_nOldMine = nCurMine; 
		} 
	} 
	else 
		if(bBothDown==2)		 
		{ 
			if (m_nOldMine != nCurMine) 
			{ 
				int aOldMineTest[9],nOldMineTest=m_nMineTest; 
				int nI,nJ; 
				for(nI=0;nI=0) 
				{ 
					BOOL bFound;							 
					RndBtShdDn(nCurMine); 
					 
					for(nI=0;nIButtonDown(1); 
					}; 
				} 
				else 
					m_nMineTest = 0; 
				if(m_nOldMine>=0) 
				{ 
					for(nI=0;nIButtonDown(0); 
					} 
				} 
				m_nOldMine = nCurMine; 
			} 
		} 
		 
} 
void CLandMine::BothButtonDown(CPoint point) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if (nRow >= m_nRow || nCol>=m_nCol || point.x0) 
		{ 
			int nI; 
			for(nI=0;nIButtonDown(1); 
			} 
		} 
		m_nOldMine = nCurMine; 
	} 
	else 
		m_nOldMine = -1; 
} 
int CLandMine::BothButtonUp(CPoint point) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if (nRow >= m_nRow || nCol>=m_nCol || point.xGetStatus()==MS_OPEN) 
	{ 
		 
		int nMineRound,nMineRound1,nMineLeft=0,nNotOpen=0; 
		int aMineWillOpen[8]; 
		nMineRound = GetLeft(nCurMine); 
		if(nMineRound>=0) 
		{ 
			if(m_aLandMine[nMineRound]->GetStatus()==MS_FLAG) 
				nMineLeft++; 
			aMineWillOpen[nNotOpen++] = nMineRound; 
			nMineRound1 = GetTop(nMineRound); 
			if(nMineRound1>=0) 
			{ 
				if(m_aLandMine[nMineRound1]->GetStatus()==MS_FLAG) 
					nMineLeft++; 
				aMineWillOpen[nNotOpen++] = nMineRound1; 
			} 
			nMineRound1 = GetBot(nMineRound); 
			if(nMineRound1>=0) 
			{ 
				if(m_aLandMine[nMineRound1]->GetStatus()==MS_FLAG) 
					nMineLeft++; 
				aMineWillOpen[nNotOpen++] = nMineRound1; 
			} 
		} 
		nMineRound = GetRight(nCurMine); 
		if(nMineRound>=0) 
		{ 
			if(m_aLandMine[nMineRound]->GetStatus()==MS_FLAG) 
				nMineLeft++; 
			aMineWillOpen[nNotOpen++] = nMineRound; 
			nMineRound1 = GetTop(nMineRound); 
			if(nMineRound1>=0) 
			{ 
				if(m_aLandMine[nMineRound1]->GetStatus()==MS_FLAG) 
					nMineLeft++; 
				aMineWillOpen[nNotOpen++] = nMineRound1; 
			} 
			nMineRound1 = GetBot(nMineRound); 
			if(nMineRound1>=0) 
			{ 
				if(m_aLandMine[nMineRound1]->GetStatus()==MS_FLAG) 
					nMineLeft++; 
				aMineWillOpen[nNotOpen++] = nMineRound1; 
			} 
		} 
		nMineRound = GetTop(nCurMine); 
		if(nMineRound>=0) 
		{ 
			if(nMineRound>=0 && m_aLandMine[nMineRound]->GetStatus()==MS_FLAG) 
				nMineLeft++; 
			aMineWillOpen[nNotOpen++] = nMineRound; 
		} 
		nMineRound = GetBot(nCurMine); 
		if(nMineRound>=0) 
		{ 
			 
			if(nMineRound>=0 && m_aLandMine[nMineRound]->GetStatus()==MS_FLAG) 
				nMineLeft++; 
			aMineWillOpen[nNotOpen++] = nMineRound; 
		} 
		if (nMineLeft>=m_aLandMine[nCurMine]->GetMineNum()) 
		{ 
			int nI,nStatus; 
			for(nI=0;nIGetMineNum() == -1) 
							m_aLandMine[nI]->DrawItem(TRUE); 
						if(m_aLandMine[nI]->GetStatus() == MS_FLAG) 
							m_aLandMine[nI]->DrawItem(TRUE); 
					} 
					return -1; 
				} 
 
			} 
		} 
		else 
		{ 
			int nI; 
			for(nI=0;nIButtonDown(0); 
			} 
		} 
	} 
	else 
	{ 
		int nI; 
		for(nI=0;nIButtonDown(0); 
		} 
	} 
	return 0; 
} 
int CLandMine::RButtonDown(CPoint point) 
{ 
	int nCol=(point.x-m_nX)/16; 
	int nRow=(point.y-m_nY)/16; 
	int nCurMine = nCol+nRow*m_nCol; 
	if (nRow >= m_nRow || nCol>=m_nCol || point.xGetStatus() != MS_OPEN) 
	{ 
		MINESTATUS nStatus; 
		nStatus = m_aLandMine[nCurMine]->GetStatus(); 
		switch(nStatus) 
		{ 
		case MS_FLAG: 
			m_aLandMine[nCurMine]->SetStatus(MS_QUEST); 
			m_aLandMine[nCurMine]->DrawItem(FALSE); 
			return 1; 
		case MS_QUEST: 
			m_aLandMine[nCurMine]->SetStatus(MS_NORMAL); 
			m_aLandMine[nCurMine]->DrawItem(FALSE); 
			return 0; 
		case MS_NORMAL: 
			m_aLandMine[nCurMine]->SetStatus(MS_FLAG); 
			m_aLandMine[nCurMine]->DrawItem(FALSE); 
			return -1; 
		} 
		 
	} 
	return 0; 
} 
 
 
void CLandMine::RndBtShdDn(int nCurMine) 
{ 
	m_nMineTest = 0; 
	int nMineRound,nMineRound1,nMineRound2; 
	 
	nMineRound1 = GetLeft(nCurMine); 
	nMineRound2 = GetRight(nCurMine); 
	if(nMineRound1>=0) 
	{ 
		nMineRound = GetTop(nMineRound1); 
		if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
		{ 
			m_aMineTest[m_nMineTest++] = nMineRound;		//left top 
		} 
	} 
	nMineRound = GetTop(nCurMine); 
	if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
	{ 
		m_aMineTest[m_nMineTest++] = nMineRound;		//top 
	} 
	 
	if(nMineRound2>=0) 
	{ 
		nMineRound = GetTop(nMineRound2); 
		if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
		{ 
			m_aMineTest[m_nMineTest++] = nMineRound;		//right top 
		} 
	} 
	if(nMineRound1>=0 && (m_aLandMine[nMineRound1]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound1]->GetStatus()==MS_QUEST)) 
		m_aMineTest[m_nMineTest++] = nMineRound1;		//left 
	if(m_aLandMine[nCurMine]->GetStatus() == MS_NORMAL ||m_aLandMine[nCurMine]->GetStatus() == MS_QUEST) 
		m_aMineTest[m_nMineTest++] = nCurMine;			//current 
	if(nMineRound2>=0 && (m_aLandMine[nMineRound2]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound2]->GetStatus()==MS_QUEST)) 
		m_aMineTest[m_nMineTest++] = nMineRound2;		//right 
	 
	if(nMineRound1>=0) 
	{ 
		nMineRound = GetBot(nMineRound1); 
		if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
		{ 
			m_aMineTest[m_nMineTest++] = nMineRound;		//left bot 
		} 
		 
	} 
	 
	nMineRound = GetBot(nCurMine); 
	if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
	{ 
		m_aMineTest[m_nMineTest++] = nMineRound;		//bot 
	} 
	 
	if(nMineRound2>=0) 
	{ 
		nMineRound = GetBot(nMineRound2); 
		if(nMineRound>=0 && (m_aLandMine[nMineRound]->GetStatus()==MS_NORMAL || m_aLandMine[nMineRound]->GetStatus()==MS_QUEST)) 
		{ 
			m_aMineTest[m_nMineTest++] = nMineRound;		//right bot 
		} 
	} 
		 
};