扫雷游戏(VC实现)

 

                       扫雷游戏核心实现

工程名: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 ****

 

 

添加了十七个位图资源和一个菜单资源,在此略过不提

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值