📄 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;nI<rect.right+1;nI=nI+2)
ClientDC.SetPixel(nI,rect.bottom+1,RGB(0,0,0));
for(nI=rect.top;nI<rect.bottom+1;nI=nI+2)
ClientDC.SetPixel(rect.right+1,nI,RGB(0,0,0));
if(bFail && m_nStatus==MS_FLAG && m_nMineNum!=-1)
{
ClientDC.SelectObject(Pen4);
ClientDC.MoveTo(rect.left+1,rect.top+1);
ClientDC.LineTo(rect.right-1,rect.bottom-1);
ClientDC.MoveTo(rect.right-1,rect.top+1);
ClientDC.LineTo(rect.left+1,rect.bottom-1);
}
return;
}
if(bFail==1 && m_nMineNum==-1)
{
CBitmap Bitmap;
if(m_nStatus!=MS_EXPLODE)
Bitmap.LoadBitmap(IDB_MINE);
else
Bitmap.LoadBitmap(IDB_MINEEXPLODE);
// draw the whole button
CDC memDC;
memDC.CreateCompatibleDC(&ClientDC);
CBitmap* pOld = memDC.SelectObject(&Bitmap);
if (pOld == NULL)
return; // destructors will clean up
ClientDC.BitBlt(rect.left, rect.top,16,16,
&memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
int nI;
for(nI=rect.left;nI<rect.right+1;nI=nI+2)
ClientDC.SetPixel(nI,rect.bottom+1,RGB(0,0,0));
for(nI=rect.top;nI<rect.bottom+1;nI=nI+2)
ClientDC.SetPixel(rect.right+1,nI,RGB(0,0,0));
return;
}
if (m_nStatus == MS_QUEST)
{
ClientDC.SetTextColor(RGB(0,0,128));
ClientDC.SetBkColor(RGB(198,198,198));
ClientDC.DrawText("?",1,&rect,DT_CENTER|DT_VCENTER);
}
else
{
if(m_nStatus == MS_FLAG)
{
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_FLAG);
// draw the whole button
CDC memDC;
memDC.CreateCompatibleDC(&ClientDC);
CBitmap* pOld = memDC.SelectObject(&Bitmap);
if (pOld == NULL)
return; // destructors will clean up
ClientDC.BitBlt(rect.left, rect.top,14,14,
&memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
}
}
ClientDC.SelectObject(Pen3);
ClientDC.MoveTo(rect.right,rect.top);
ClientDC.LineTo(rect.left,rect.top);
ClientDC.LineTo(rect.left,rect.bottom);
ClientDC.SelectObject(Pen7);
ClientDC.LineTo(rect.right,rect.bottom);
ClientDC.LineTo(rect.right,rect.top);
}
void CMineButton::ButtonDown(int Status)
{
RECT rect;
rect.left = m_nX;
rect.top = m_nY;
rect.right = m_nX+15;
rect.bottom = m_nY+15;
CClientDC ClientDC(m_pParent);
if(Status==1)
{
ClientDC.SelectObject(Pen6);
ClientDC.SetBkColor(RGB(198,198,198));
ClientDC.SelectStockObject(NULL_BRUSH);
ClientDC.Rectangle(&rect);
int nI;
for(nI=rect.left;nI<rect.right;nI=nI+2)
ClientDC.SetPixel(nI,rect.bottom,RGB(0,0,0));
for(nI=rect.top;nI<rect.bottom;nI=nI+2)
ClientDC.SetPixel(rect.right,nI,RGB(0,0,0));
}
else
{
ClientDC.SelectObject(Pen6);
ClientDC.MoveTo(rect.left,rect.bottom);
ClientDC.LineTo(rect.right,rect.bottom);
ClientDC.LineTo(rect.right,rect.top+1);
DrawItem(FALSE);
}
}
int CMineButton::OpenMine()
{
if(m_nStatus==MS_NORMAL || m_nStatus==MS_QUEST)
{
if (m_nMineNum != -1)
{
m_nStatus = MS_OPEN;
DrawItem(FALSE);
if(m_nMineNum == 0)
return 0;
else
return 1;
}
else
{
m_nStatus = MS_EXPLODE;
DrawItem(TRUE); //Fail
return -1;
}
}
return 1;
};
void CLandMine::Create(int nRow,int nCol,int nMineNum,int nX,int nY,CWnd *pParent)
{
m_pParent = pParent;
m_nX = nX;
m_nY = nY;
Reset(nRow,nCol,nMineNum);
}
void CLandMine::ReDraw(int bFail)
{
int nI;
for(nI=0;nI<m_nRow*m_nCol;nI++)
m_aLandMine[nI]->DrawItem(bFail);
}
void CLandMine::Reset(int nRow,int nCol,int nMineNum)
{
int nI;
RECT rect;
for(nI=0;nI<m_nRow*m_nCol;nI++)
{
if (m_aLandMine[nI]!=NULL)
delete m_aLandMine[nI];
}
for(nI=0;nI<nRow*nCol;nI++)
{
rect.left = m_nX+nI%nCol*16+1;
rect.top = m_nY+nI/nCol*16+1;
//rect.right = m_nX+nI/nCol*16+15;
//rect.bottom = m_nY+nI%nCol*16+15;
m_aLandMine[nI] = new CMineButton;
m_aLandMine[nI]->Create(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(nCurMines<m_nMineNum)
{
nCurMine=rand()%(m_nRow*m_nCol);
if(m_aLandMine[nCurMine]->GetMineNum() != -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.x<m_nX || point.y<m_nY )
{
m_nOldMine = -1;
return;
}
if(nCol<m_nCol && nRow<m_nRow
&& (m_aLandMine[nCurMine]->GetStatus()==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.x<m_nX || point.y<m_nY)
return 0;
BOOL nStatus = OpenMine(nCurMine);
if(nStatus==FALSE)
{ int nI;
for(nI=0;nI<m_nRow*m_nCol;nI++)
{
if(m_aLandMine[nI]->GetMineNum() == -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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -