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