扫雷游戏核心实现
工程名:MineSweeping,添加了一个类CMineInfo,游戏的实现主要在View类中,MainFrame中调节尺寸。
// MineSweepingView.h : interface of the CMineSweepingView class
//
/
#if !defined(AFX_MINESWEEPINGVIEW_H__C5720F41_F7E0_48E3_8E70_C531BD939C60__INCLUDED_)
#define AFX_MINESWEEPINGVIEW_H__C5720F41_F7E0_48E3_8E70_C531BD939C60__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "MineInfo.h"
class CMineSweepingView : public CView
{
protected: // create from serialization only
CMineSweepingView();
DECLARE_DYNCREATE(CMineSweepingView)
// Attributes
public:
CMineSweepingDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMineSweepingView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
public:
void DrawImage();
void LineTo();
virtual ~CMineSweepingView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CMineSweepingView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
afx_msg void OnStart();
afx_msg void OnEasy();
afx_msg void OnMiddle();
afx_msg void OnHard();
afx_msg void OnUpdateStart(CCmdUI* pCmdUI);
afx_msg void OnUpdateEasy(CCmdUI* pCmdUI);
afx_msg void OnUpdateMiddle(CCmdUI* pCmdUI);
afx_msg void OnUpdateHard(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int count;
CPoint m_ptOrigin;
int minenum;
int leftnum;
bool end;
int second;
int secondstart;
CBitmap m_Bitmap[13];
CBitmap m_Button[4];
int m_RowCount;
int m_ColCount;
CMineInfo mine[50][50];
};
#ifndef _DEBUG // debug version in MineSweepingView.cpp
inline CMineSweepingDoc* CMineSweepingView::GetDocument()
{ return (CMineSweepingDoc*)m_pDocument; }
#endif
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MINESWEEPINGVIEW_H__C5720F41_F7E0_48E3_8E70_C531BD939C60__INCLUDED_)
// MineSweepingView.cpp
#include "stdafx.h"
#include "MineSweeping.h"
#include "MainFrm.h"
#include "MineSweepingDoc.h"
#include "MineSweepingView.h"
#include "stack.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CMineSweepingView
IMPLEMENT_DYNCREATE(CMineSweepingView, CView)
BEGIN_MESSAGE_MAP(CMineSweepingView, CView)
//{{AFX_MSG_MAP(CMineSweepingView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
ON_WM_ERASEBKGND()
ON_COMMAND(IDM_START, OnStart)
ON_COMMAND(IDM_EASY, OnEasy)
ON_COMMAND(IDM_MIDDLE, OnMiddle)
ON_COMMAND(IDM_HARD, OnHard)
ON_UPDATE_COMMAND_UI(IDM_START, OnUpdateStart)
ON_UPDATE_COMMAND_UI(IDM_EASY, OnUpdateEasy)
ON_UPDATE_COMMAND_UI(IDM_MIDDLE, OnUpdateMiddle)
ON_UPDATE_COMMAND_UI(IDM_HARD, OnUpdateHard)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/
// CMineSweepingView construction/destruction
CMineSweepingView::CMineSweepingView()
{
// TODO: add construction code here
for(int i = 0;i < 13;i++)
m_Bitmap[i].LoadBitmap(IDB_BITMAP1+i);
for(i = 0;i < 4;i++)
m_Button[i].LoadBitmap(IDB_ANNIU1+i);
count = 0;
second = secondstart = 0;
leftnum = minenum = 100;
m_RowCount = 25;
m_ColCount = 16;
end = false;
for(i = 0;i < m_RowCount;i++)
for(int j = 0;j < m_ColCount;j++)
{
mine[i][j].minenum = 0;
mine[i][j].weitu = 0;
}
srand(time(0));
int a,b;
for(i = 0;i < minenum;i++)
{
a = rand()%m_RowCount;
b = rand()%m_ColCount;
if(mine[a][b].minenum != -1)
{
mine[a][b].minenum = -1;
if(a-1 >= 0 && b-1 >= 0 && mine[a-1][b-1].minenum != -1)
mine[a-1][b-1].minenum++;
if(b-1 >= 0 && mine[a][b-1].minenum != -1)
mine[a][b-1].minenum++;
if(a+1 < m_RowCount && b-1 >= 0 && mine[a+1][b-1].minenum != -1)
mine[a+1][b-1].minenum++;
if(a-1 >= 0 && mine[a-1][b].minenum != -1)
mine[a-1][b].minenum++;
if(a+1 < m_RowCount && mine[a+1][b].minenum != -1)
mine[a+1][b].minenum++;
if(a-1 >= 0 && b+1 < m_ColCount && mine[a-1][b+1].minenum != -1)
mine[a-1][b+1].minenum++;
if(b+1 < m_ColCount && mine[a][b+1].minenum != -1)
mine[a][b+1].minenum++;
if(a+1 < m_RowCount && b+1 < m_ColCount && mine[a+1][b+1].minenum != -1)
mine[a+1][b+1].minenum++;
}
else i--;
}
}
CMineSweepingView::~CMineSweepingView()
{
}
BOOL CMineSweepingView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/
// CMineSweepingView drawing
void CMineSweepingView::OnDraw(CDC* pDC)
{
CMineSweepingDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//先画背景与黑框
AfxGetMainWnd()->CenterWindow();
LineTo(); //画雷区边框
DrawImage(); //显示每一小方块图像
}
/
// CMineSweepingView printing
BOOL CMineSweepingView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMineSweepingView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMineSweepingView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/
// CMineSweepingView diagnostics
#ifdef _DEBUG
void CMineSweepingView::AssertValid() const
{
CView::AssertValid();
}
void CMineSweepingView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMineSweepingDoc* CMineSweepingView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMineSweepingDoc)));
return (CMineSweepingDoc*)m_pDocument;
}
#endif //_DEBUG
/
// CMineSweepingView message handlers
void CMineSweepingView::LineTo()
{
CDC *pDC = GetDC();
//双缓冲
CDC dcMem;
CBitmap bitmap;
dcMem.CreateCompatibleDC(pDC);
CRect rect;
GetClientRect(&rect);
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
dcMem.SelectObject(&bitmap);
dcMem.FillSolidRect(0,0,1200,800,RGB(192,192,192));
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(0,0,0));
CRect rect2(15,10,65,40);
dcMem.FillRect(rect2,&mybrush1);
CRect rect3(rect.Width()-65,10,rect.Width()-15,40);
dcMem.FillRect(rect3,&mybrush1);
CPen mypen;
mypen.CreatePen(PS_SOLID,2,RGB(255,255,255));
CPen *oldpen = dcMem.SelectObject(&mypen);
//画黑框的边界
dcMem.MoveTo(15,40);
dcMem.LineTo(65,40);
dcMem.LineTo(65,10);
dcMem.MoveTo(rect.Width()-65,40);
dcMem.LineTo(rect.Width()-15,40);
dcMem.LineTo(rect.Width()-15,10);
//结束
//画雷区
for(int i = 0;i < m_RowCount;i++)
for(int j = 0;j < m_ColCount;j++)
{
dcMem.MoveTo(10+15*i,50+15*j+14);
dcMem.LineTo(10+15*i,50+15*j);
dcMem.LineTo(10+15*i+14,50+15*j);
}
dcMem.SelectObject(oldpen);
CPen mypen1;
mypen1.CreatePen(PS_SOLID,2,RGB(0,0,0));
CPen *oldpen1;
oldpen1 = dcMem.SelectObject(&mypen1);
for(i = 1;i <= m_RowCount;i++)
for(int j = 1;j <= m_ColCount;j++)
{
dcMem.MoveTo(10+15*i-14,50+15*j);
dcMem.LineTo(10+15*i,50+15*j);
dcMem.LineTo(10+15*i,50+15*j-14);
}
dcMem.SelectObject(oldpen1);
pDC->BitBlt(0,0,400,350,&dcMem,0,0,SRCCOPY); //贴图
//结束
ReleaseDC(pDC);
/*CPen mypen;
mypen.CreatePen(PS_SOLID,2,RGB(255,255,255));
CPen *oldpen = pDC->SelectObject(&mypen);
//画黑框的边界
pDC->MoveTo(20,40);
pDC->LineTo(70,40);
pDC->LineTo(70,10);
pDC->MoveTo(325,40);
pDC->LineTo(375,40);
pDC->LineTo(375,10);
//结束
//画雷区
for(int i = 0;i < m_RowCount;i++)
for(int j = 0;j < m_ColCount;j++)
{
pDC->MoveTo(10+15*i,50+15*j+14);
pDC->LineTo(10+15*i,50+15*j);
pDC->LineTo(10+15*i+14,50+15*j);
}
pDC->SelectObject(oldpen);
CPen mypen1;
mypen1.CreatePen(PS_SOLID,2,RGB(0,0,0));
CPen *oldpen1;
oldpen1 = pDC->SelectObject(&mypen1);
for(i = 1;i <= m_RowCount;i++)
for(int j = 1;j <= m_ColCount;j++)
{
pDC->MoveTo(10+15*i-14,50+15*j);
pDC->LineTo(10+15*i,50+15*j);
pDC->LineTo(10+15*i,50+15*j-14);
}
pDC->SelectObject(oldpen1);
//结束
ReleaseDC(pDC);*/
}
void CMineSweepingView::DrawImage()
{
CDC *pDC = GetDC();
CDC dc;
CRect rect;
GetClientRect(&rect); //获得客户区相关信息
if(dc.CreateCompatibleDC(pDC) == false)
MessageBox("Can't create dc!");
dc.SelectObject(m_Button[0]);
pDC->BitBlt(rect.Width()/2-15,10,160,160,&dc,0,0,SRCCOPY);
for(int i = 0;i < m_RowCount;i++)
for(int j = 0;j < m_ColCount;j++)
{
if(mine[i][j].weitu == 4)
{
dc.SelectObject(&m_Bitmap[0]);
pDC->BitBlt(10+15*i,50+15*j,160,160,&dc,0,0,SRCCOPY);
}
if(mine[i][j].weitu == 1)
{
dc.SelectObject(&m_Bitmap[mine[i][j].minenum]);
pDC->BitBlt(10+15*i,50+15*j,160,160,&dc,0,0,SRCCOPY);
}
if(mine[i][j].weitu == 2)
{
dc.SelectObject(&m_Bitmap[9]);
pDC->BitBlt(10+15*i,50+15*j,160,160,&dc,0,0,SRCCOPY);
}
if(mine[i][j].weitu == 3)
{
dc.SelectObject(&m_Bitmap[10]);
pDC->BitBlt(10+15*i,50+15*j,160,160,&dc,0,0,SRCCOPY);
}
if(end == true && mine[i][j].minenum == -1)
{
dc.SelectObject(&m_Bitmap[11]);
pDC->BitBlt(10+15*i,50+15*j,160,160,&dc,0,0,SRCCOPY);
dc.SelectObject(&m_Button[2]);
pDC->BitBlt(rect.Width()/2-15,10,160,160,&dc,0,0,SRCCOPY);
}
}
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,0));
CFont font;
if(0 == font.CreatePointFont(160,"Comic Sans MS"))
MessageBox("Can't create font!");
pDC->SelectObject(&font);
CString str;
if(leftnum < 10)
str.Format("00%d",leftnum);
else
str.Format("0%d",leftnum);
pDC->TextOut(15,10,str);
if(second<10)
str.Format("00%d",second);
else if(second<100)
str.Format("0%d" ,second);
else
str.Format("%d" ,second);
pDC->TextOut(rect.Width()-65,10,str);
}
void CMineSweepingView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int a,b;
CDC *pDC = GetDC();
CDC dc;
CRect rect;
GetClientRect(&rect);
if(false == dc.CreateCompatibleDC(pDC))
MessageBox("Can't create dc!");
if(point.x>rect.Width()/2-15 && point.x<rect.Width()/2+15 && point.y>10 && point.y<40 && end == false)
{
dc.SelectObject(&m_Button[3]);
pDC->BitBlt(rect.Width()/2-15,10,160,160,&dc,0,0,SRCCOPY);
}
else if(point.x > 10 && point.x < 10+15*m_RowCount && point.y > 50 && point.y < 50+15*m_ColCount)
{
a = (point.x-10)/15;
b = (point.y-50)/15;
if(end == false && mine[a][b].weitu != 1 && mine[a][b].weitu != 4 && mine[a][b].weitu != 2)
{//限定了在一些情况下,左键不能按下
dc.SelectObject(&m_Bitmap[12]);
pDC->BitBlt(10+15*a,50+15*b,160,160,&dc,0,0,SRCCOPY);
dc.SelectObject(&m_Button[1]);
pDC->BitBlt(rect.Width()/2-15,10,160,160,&dc,0,0,SRCCOPY);
}
}
else if(end == false)
{
dc.SelectObject(&m_Button[1]);
pDC->BitBlt(rect.Width()/2-15,10,160,160,&dc,0,0,SRCCOPY);
}
m_ptOrigin.x = (point.x-10)/15;
m_ptOrigin.y = (point.y-50)/15;
ReleaseDC(pDC);
CView::OnLButtonDown(nFlags, point);
}
void CMineSweepingView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(secondstart == 0) {SetTimer(1,1000,NULL);secondstart = 1;}
int i,j;
int a = (point.x-10)/15;
int b = (point.y-50)/15;
CRect rect;
GetClientRect(&rect);
if(point.x >= 10 && point.x <= 10+15*m_RowCount && point.y >= 50 && point.y <= 50+15*m_ColCount)
{
if(mine[a][b].minenum == -1 && end == false && mine[a][b].weitu != 2)
{//某些情况下左键弹起不起作用,对点中雷的处理
KillTimer(1);
end = true;
for(i = 0;i < m_RowCount;i++)
for(j = 0;j < m_ColCount;j++)
{
if(mine[i][j].minenum != 0 && mine[i][j].minenum != -1)
mine[i][j].weitu = 1;
else if(mine[i][j].minenum == 0)
mine[i][j].weitu = 4;
}
Invalidate();
}
else if(mine[a][b].minenum == 0 && end == false && mine[a][b].weitu == 0)
{//对点中空白的处理
stack<int> stack1,stack2;
stack1.InitStack();
stack2.InitStack();
stack1.Push(a);
stack2.Push(b);
mine[a][b].weitu = 4;
while(!stack1.StackEmpty())
{
int i,j;
count++;
stack1.Pop(i);
stack2.Pop(j);
InvalidateRect(CRect(10+15*i,50+15*j,10+15*i+15,50+15*j+15));
for(int k = i-1;k < i+2;k++)
for(int l = j-1;l < j+2;l++)
{
if(((k >= 0 && k <= m_RowCount-1 && l == j) || (l >= 0
&& l <= m_ColCount-1 && k == i)) && mine[k][l].weitu != 2
&& mine[k][l].weitu != 3
&& mine[k][l].minenum == 0 && mine[k][l].weitu != 4)
{
stack1.Push(k);
stack2.Push(l);
mine[k][l].weitu = 4;
}
if(k >= 0 && k <= m_RowCount-1 && l >= 0
&& l <= m_ColCount-1 && mine[k][l].weitu != 2
&& mine[k][l].weitu != 3
&& mine[k][l].minenum > 0 && mine[k][l].weitu != 1)
{
count++;
mine[k][l].weitu = 1;
InvalidateRect(CRect(10+15*k,50+15*l,25+15*k,65+15*l));
}
}
}
stack1.DestroyStack();
stack2.DestroyStack();
}
else if(end == false && mine[a][b].minenum > 0 && mine[a][b].weitu == 0)
{//点中数字的处理
count++;
mine[a][b].weitu = 1;
InvalidateRect(CRect(10+15*a,50+15*b,10+15*a+15,50+15*b+15));
}
if(m_ptOrigin != CPoint(a,b))//左键点下与弹起不在同一位置的处理
InvalidateRect(CRect(10+15*m_ptOrigin.x,50+15*m_ptOrigin.y,25+15*m_ptOrigin.x,65+15*m_ptOrigin.y));
}
else
InvalidateRect(CRect(rect.Width()/2-15,10,rect.Width()/2+15,40));
if(count == m_RowCount*m_ColCount-minenum)
{
leftnum = 0;
for(i = 0;i < m_RowCount;i++)
for(j = 0;j < m_ColCount;j++)
if(mine[i][j].minenum == -1)
mine[i][j].weitu = 2;
Invalidate();
KillTimer(1);
if(point.x >= 10 && point.x <= 10+15*m_RowCount && point.y >= 50 && point.y <= 50+15*m_ColCount)
MessageBox("Congratulations!You win!");
//只弹出一次框
}
if(point.x>rect.Width()/2-15&&point.x<rect.Width()/2+15&&point.y>10&&point.y<40)
OnStart();
CView::OnLButtonUp(nFlags, point);
}
void CMineSweepingView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(secondstart == 0) {SetTimer(1,1000,NULL);secondstart = 1;}
if(point.x > 10 && point.x < 10+15*m_RowCount && point.y > 50 && point.y < 50+15*m_ColCount)
{
int a = (point.x-10)/15;
int b = (point.y-50)/15;
if(mine[a][b].weitu != 1 && mine[a][b].weitu != 4) //右键不能在已出现数字和空白的情况点
{
switch(mine[a][b].weitu)
{
case 0:
if(leftnum > 0)
{
mine[a][b].weitu = 2; //变红旗
leftnum--;
}
break;
case 2:
mine[a][b].weitu = 3; //变问号
leftnum++;
break;
case 3:
mine[a][b].weitu = 0; //还原
break;
}
InvalidateRect(CRect(10+15*a,50+15*b,25+15*a,65+15*b));
}
}
CView::OnRButtonDown(nFlags, point);
}
void CMineSweepingView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
second++;
CRect rect;
GetClientRect(&rect);
InvalidateRect(CRect(rect.Width()-65,10,rect.Width()-15,40));
CView::OnTimer(nIDEvent);
}
BOOL CMineSweepingView::OnEraseBkgnd(CDC *pDC)
{
return true;
//return CView::OnEraseBkgnd(pDC);
}
void CMineSweepingView::OnStart()
{
// TODO: Add your command handler code here
KillTimer(1);
leftnum = minenum;
second = secondstart = 0;
count = 0;
end = false;
for(int i = 0;i < m_RowCount;i++)
for(int j = 0;j < m_ColCount;j++)
{
mine[i][j].minenum = 0;
mine[i][j].weitu = 0;
}
srand(time(0));
int a,b;
for(i = 0;i < minenum;i++)
{
a = rand()%m_RowCount;
b = rand()%m_ColCount;
if(mine[a][b].minenum != -1)
{
mine[a][b].minenum = -1;
if(a-1 >= 0 && b-1 >= 0 && mine[a-1][b-1].minenum != -1)
mine[a-1][b-1].minenum++;
if(b-1 >= 0 && mine[a][b-1].minenum != -1)
mine[a][b-1].minenum++;
if(a+1 < m_RowCount && b-1 >= 0 && mine[a+1][b-1].minenum != -1)
mine[a+1][b-1].minenum++;
if(a-1 >= 0 && mine[a-1][b].minenum != -1)
mine[a-1][b].minenum++;
if(a+1 < m_RowCount && mine[a+1][b].minenum != -1)
mine[a+1][b].minenum++;
if(a-1 >= 0 && b+1 < m_ColCount && mine[a-1][b+1].minenum != -1)
mine[a-1][b+1].minenum++;
if(b+1 < m_ColCount && mine[a][b+1].minenum != -1)
mine[a][b+1].minenum++;
if(a+1 < m_RowCount && b+1 < m_ColCount && mine[a+1][b+1].minenum != -1)
mine[a+1][b+1].minenum++;
}
else i--;
}
Invalidate();
}
void CMineSweepingView::OnEasy()
{
// TODO: Add your command handler code here
leftnum = minenum = 20;
m_RowCount = m_ColCount = 12;
((CMainFrame *)GetParent())->MoveWindow(40,40,203,290);
OnStart();
}
void CMineSweepingView::OnMiddle()
{
// TODO: Add your command handler code here
leftnum = minenum = 60;
m_RowCount = 18;
m_ColCount = 15;
((CMainFrame *)GetParent())->MoveWindow(40,40,293,335);
OnStart();
}
void CMineSweepingView::OnHard()
{
// TODO: Add your command handler code here
leftnum = minenum = 80;
m_RowCount = 25;
m_ColCount = 16;
((CMainFrame *)GetParent())->MoveWindow(40,40,398,350);
OnStart();
}
void CMineSweepingView::OnUpdateStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(minenum == 100);
}
void CMineSweepingView::OnUpdateEasy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(minenum == 20);
}
void CMineSweepingView::OnUpdateMiddle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(minenum == 60);
}
void CMineSweepingView::OnUpdateHard(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(minenum == 80);
}
// MainFrm.h : interface of the CMainFrame class
//
/
#if !defined(AFX_MAINFRM_H__16F74B0B_D392_4CC4_9A53_8D2DAD54D57E__INCLUDED_)
#define AFX_MAINFRM_H__16F74B0B_D392_4CC4_9A53_8D2DAD54D57E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAINFRM_H__16F74B0B_D392_4CC4_9A53_8D2DAD54D57E__INCLUDED_)
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "MineSweeping.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
/*if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);*/
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.dwExStyle |= WS_EX_TOPMOST;
cs.style = WS_SYSMENU | WS_OVERLAPPED | WS_MINIMIZEBOX;
cs.cx = 400;
cs.cy = 350;
return TRUE;
}
/
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/
// CMainFrame message handlers
// MineInfo.h: interface for the CMineInfo class.
//
//
#if !defined(AFX_MINEINFO_H__7E15E2CD_D4D2_4E35_BBA2_557869756C25__INCLUDED_)
#define AFX_MINEINFO_H__7E15E2CD_D4D2_4E35_BBA2_557869756C25__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMineInfo
{
public:
int minenum;
int weitu;
CMineInfo();
CMineInfo(int x,int y);
virtual ~CMineInfo();
};
#endif // !defined(AFX_MINEINFO_H__7E15E2CD_D4D2_4E35_BBA2_557869756C25__INCLUDED_)
// MineInfo.cpp: implementation of the CMineInfo class.
//
//
#include "stdafx.h"
#include "MineSweeping.h"
#include "MineInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
CMineInfo::CMineInfo()
{
}
CMineInfo::CMineInfo(int x,int y)
{
weitu = x;
minenum = y;
}
CMineInfo::~CMineInfo()
{
}
//*****stack.h
#ifndef _STACK_H
#define _STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
template<class QElemType>
class stack
{
public:
void InitStack();
void DestroyStack();
void ClearStack();
Status StackEmpty();
Status StackLength();
int GetTop(QElemType & e);
void Push(QElemType e);
int Pop(QElemType & e);
private:
struct SqStack{
QElemType *base;
QElemType *top;
int stacksize;
}S;
};
//******stack.cpp------
template<class QElemType>
void stack<QElemType>::InitStack()
{
S.base = (QElemType *)malloc(STACK_INIT_SIZE * sizeof(QElemType));
if(!S.base) exit(0);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
template <class QElemType>
void stack<QElemType>::DestroyStack()
{
free(S.base);
}
template <class QElemType>
void stack<QElemType>::ClearStack()
{
S.top = S.base;
}
template <class QElemType>
Status stack<QElemType>::StackEmpty()
{
if(S.top == S.base) return 1;
else return 0;
}
template <class QElemType>
Status stack<QElemType>::StackLength()
{
return (S.top - S.base);
}
template <class QElemType>
int stack<QElemType>::GetTop(QElemType & e)
{
if(S.top != S.base)
{
e = *(S.top - 1);
return 1;
}
else return 0;
}
template <class QElemType>
void stack<QElemType>::Push(QElemType e)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (QElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(QElemType));
if(!S.base) exit(0);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
}
template <class QElemType>
int stack<QElemType>::Pop(QElemType & e)
{
if(S.top == S.base) return 0;
else
e = * --S.top;
return 1;
}
//**********stack.cpp
#endif //stack.h ****
添加了十七个位图资源和一个菜单资源,在此略过不提