扫雷游戏程序设计课程设计报告

时间:2024.4.21


课 程 设 计

  扫雷游戏程序设计     

                                       

                     

                     

                     

2013  年  11 月  5  日

合肥工业大学课程设计任务书

一. 设计任务

(1)鼠标左击排雷,右击插小旗,打问号;

(2)方格里面的数字表示方格周围的雷数;

(3)能够显示未标记雷数和游戏用时;

(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏;

(5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;

(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。

二. 具体设计

(一)、设计思路

扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。

(二)、设计表示:

(三)、实现功能

1、鼠标左击排雷,右击插小旗,打问号;

2、方格里面的数字表示方格周围的雷数;

3、能够显示未标记雷数和游戏用时;

4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏;

5、可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数);

6、任何时候开始游戏第一次点击不会扫到雷。

由于时间等原因未完成功能:

排行榜和自行定义雷区行数,列数和雷数功能。

(四)、详细设计

       1、添加位图

    前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。分别表示游戏进行的状态、结果胜利或触雷。

2、预设等级方格数雷数变化


void CMywqq20112074View::OnEasy() /////////////////////////////初级

{

m_RowCount=10;//行数10

        m_ColCount=10;//列数10

     leinum=10;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置10个雷

      

CMywqq20112074View::OnMiddle() //////////////////////////////////中级

{

m_RowCount=15;//行数15

        m_ColCount=15;//列数15

     leinum=40;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置40个雷

      

void CMywqq20112074View::OnHard() ///////////////////////////////////////////高级

{

m_RowCount=25;//行数25

        m_ColCount=16;//列数16

     leinum=80;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置80个雷

       do

       {

              int k=rand()%m_RowCount;

              int l=rand()%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);

3、  第一次点击不会扫到雷

       if(lei[a][b].weitu==0||lei[a][b].weitu==3)

{  

for(;n==0&&lei[a][b].shumu==-1;)    //////////////踩到第一个雷

                     {

                            int aa=0;

                            //初始化0

                            for(int i=0;i<m_RowCount;i++)

                            {

                                   for(int j=0;j<m_ColCount;j++)

                                   {

              lei[i][j].shumu=0;

                                          lei[i][j].weitu=0;

                                   }

                            }

                            do

                            {

                                   int k=rand()%m_RowCount;

                                   int l=rand()%m_ColCount;

                                   if(lei[k][l].shumu!=-1)

                                   {

              lei[k][l].shumu=-1;

                                          aa++;

                                   }

                            }while(aa!=leinum);  

                            //给方格赋值

                            for(int a=0;a<m_RowCount;a++)

                                   for(int b=0;b<m_ColCount;b++)

                                          if(lei[a][b].shumu==0)

                                          {

                                                 for(int c=a-1;c<a+2;c++)

                                                        for(int d=b-1;d<b+2;d++)

                                                               if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)                               if(lei[c][d].shumu==-1)

                                                                             lei[a][b].shumu++;       

                                          }                  

                     }

4、鼠标右击插小旗,打问号

第一次用右键单击某个区域时,该区域上插上一面小红旗,此时单击左键没有任何变化,第二次用右键单击时恢复原状。

     //判断显示什么位图

        //weitu=1已按下的数字区

        //weitu=2显示旗

        //weitu=3显示问号

        for(int a=0;a<m_RowCount;a++)

               for(int b=0;b<m_ColCount;b++)

                     {            if(lei[a][b].weitu==1)

                            {

           Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);                           pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }                   if(lei[a][b].weitu==2)

                            {                   Dc.SelectObject(m_Bitmap[9]);

                                   pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }                          if(lei[a][b].weitu==3)

                            {                                 Dc.SelectObject(m_Bitmap[10]);              pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }

                            //结束


(五)、调试及测试

经运行测试之后,程序出现的问题有:

1、第一次打开游戏时有时会出现不能计时的情况

    2、胜利的表情不能正常显示

(六)、使用说明

A、  鼠标左击排雷,右击插小旗,打问号;

B、  方格里面的数字表示方格周围的雷数;

C、  在任何情况下单击小脸可以重新开始游戏;

D、  可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自            行定义雷区行数,列数和雷数的功能;

E、  扫雷成功时候,游戏用时更新排行榜

   (七)、运行实例


鼠标左击排雷,可翻开连片空格,方格周围数字表示周围埋雷数目,右键单击一次插小红旗,双击显示问号表示雷数情况未知,同时显示剩余雷数以及游戏用时


可从预设难度等级中选择游戏难度,游戏方格数和雷数都有相应增加

     ←初级                                                               


 

      ←中级

     ←高级

触雷时现出痛苦的表情,游戏结束




将雷全部排出,胜利的呐喊!!


(八)、设计小结

     这个短短几天的C++课程设计虽然为期不长,却让我们从实践中学到了更多的C++编程知识,一开始看到示例中让人眼花缭乱的程序代码让人很有放弃的冲动,可是最后还是坚持下来将代码读完并自己琢磨出一套代码出来,在这中间也遇到不少的困难,一开始不知道位图是怎么做的,那些看起来可爱的表情做起来却并不简单,还要在代码里将这些表情的二维坐标对应起来,过程细致而繁杂,最终在与同学讨论之后成功做出,大家还一起开玩笑涂鸦自定义表情,轻松的话语冲淡了写代码时的烦躁。还有在设定难度时要重新画方格,右键单击时出现不同的状态,第一次点击的时候不能扫到雷等等难关,都被坚持不懈的毅力和耐力一一克服。直到最后看到各种功能在自己手下实现,这时的成就感和喜悦是之前单独实现一个个小功能所不能比的,不由更加感叹程序编程的奇妙,让我对程序员有了新的认识,也下定决心努力向他们看齐!!

           附录:源程序


// wqq20112074View.cpp : implementation of the CMywqq20112074View class

//

#include "stdafx.h"

#include "wqq20112074.h"

#include "wqq20112074Doc.h"

#include "wqq20112074View.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View

IMPLEMENT_DYNCREATE(CMywqq20112074View, CView)

BEGIN_MESSAGE_MAP(CMywqq20112074View, CView)

       //{{AFX_MSG_MAP(CMywqq20112074View)

       ON_WM_TIMER()

       ON_WM_LBUTTONDOWN()

       ON_WM_CREATE()

       ON_COMMAND(ID_START, OnStart)

       ON_WM_LBUTTONUP()

       ON_WM_RBUTTONDOWN()

       ON_COMMAND(ID_EASY, OnEasy)

       ON_COMMAND(ID_MIDDLE, OnMiddle)

       ON_COMMAND(ID_HARD, OnHard)

       //}}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()

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View construction/destruction

CMywqq20112074View::CMywqq20112074View()

{

       // TODO: add construction code here

       for(int ii=0;ii<16;ii++)

              m_Bitmap[ii].LoadBitmap(IDB_BITMAP14+ii);

    for(int jj=0;jj<4;jj++)

              m_anniu[jj].LoadBitmap(IDB_ANNIU1+jj);

    second=0;//计时

       secondstart=0;//1时开始计时

    m_RowCount=25;//行数

       m_ColCount=16;//列数

       n=0;//格数

    leinum=5;

       realnum=leinum;

       leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //获取当前时间

       CTime time=GetCurrentTime();

       int s;

       //获取秒数

       s=time.GetSecond();

       //设置40个雷

       do

       {

              //以当前秒数为产生随机算法

              int k=(rand()*s)%m_RowCount;

              int l=(rand()*s)%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);  

    //给方格赋值,计算雷数

       for(int a=0;a<m_RowCount;a++)

              for(int b=0;b<m_ColCount;b++)

                     if(lei[a][b].shumu==0)

                     {

                            for(int c=a-1;c<a+2;c++)

                                   for(int d=b-1;d<b+2;d++)

                                          if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                 if(lei[c][d].shumu==-1)

                                                        lei[a][b].shumu++;       

                     }

}

CMywqq20112074View::~CMywqq20112074View()

{

   

}

BOOL CMywqq20112074View::PreCreateWindow(CREATESTRUCT& cs)

{

       // TODO: Modify the Window class or styles here by modifying

       //  the CREATESTRUCT cs

       return CView::PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View drawing

void CMywqq20112074View::OnDraw(CDC* pDC)

{

       CMywqq20112074Doc* pDoc = GetDocument();

       ASSERT_VALID(pDoc);

       // TODO: add draw code for native data here

       //画背景

    CBrush mybrush1;

      mybrush1.CreateSolidBrush(RGB(192,192,192));

      CRect myrect1(0,0,1200,800);

      pDC->FillRect(myrect1,&mybrush1);

  //画黑框

       CBrush mybrush;

      mybrush.CreateSolidBrush(RGB(0,0,0));

      CRect myrect(20,10,70,40);

      pDC->FillRect(myrect,&mybrush);

       CRect myrect2(325,10,375,40);

      pDC->FillRect(myrect2,&mybrush);

       CPen mypen;

       CPen*myoldPen;

       mypen.CreatePen(PS_SOLID,2,RGB(255,255,255));

    myoldPen=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+i*15,50+j*15+14);

                     pDC->LineTo(10+i*15,50+j*15); 

                     pDC->LineTo(10+i*15+14,50+j*15);

              }

       pDC->SelectObject(myoldPen);

       CPen mypen2;

       CPen*myoldPen2;

       mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0));

    myoldPen2=pDC->SelectObject(&mypen2);

    for(int ii=0;ii<m_RowCount;ii++)

              for(int jj=0;jj<m_ColCount;jj++)

              {

                     pDC->MoveTo(10+ii*15,50+jj*15+14);

                     pDC->LineTo(10+ii*15+14,50+jj*15+14);  

                     pDC->LineTo(10+ii*15+14,50+jj*15);

              }

       pDC->SelectObject(myoldPen2);

              CDC Dc;

       if(Dc.CreateCompatibleDC(pDC)==FALSE)

               AfxMessageBox("Can't create DC");

        //显示按钮

        Dc.SelectObject(m_anniu[0]);

        pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

     //判断显示什么位图

        //weitu=1已按下的数字区

        //weitu=2显示旗

        //weitu=3显示问号

        for(int a=0;a<m_RowCount;a++)

               for(int b=0;b<m_ColCount;b++)

                     {

                            if(lei[a][b].weitu==1)

                            {

                    Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);

                                   pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }

                            if(lei[a][b].weitu==2)

                            {

                                   Dc.SelectObject(m_Bitmap[9]);

                                   pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }

                            if(lei[a][b].weitu==3)

                            {

                                   Dc.SelectObject(m_Bitmap[10]);

                                   pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                            }

                            //结束

                            if(jieshu==1&&lei[a][b].shumu==-1)

                            {

                    Dc.SelectObject(m_Bitmap[11]);

                                   pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

                                   Dc.SelectObject(m_anniu[3]);

                                   pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

                            }

                           

                     }

//显示黑框里的数字

       int nOldDC=pDC->SaveDC();

       pDC->SetTextColor(RGB(255,0,0));

       pDC->SetBkColor(RGB(0,0,0));

       CFont font;                                             

       if(0==font.CreatePointFont(160,"Comic Sans MS"))

       {

              AfxMessageBox("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(25,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(330,10,str);

       pDC->RestoreDC(nOldDC);

                     //////////////////////////////////////////////

}

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View printing

BOOL CMywqq20112074View::OnPreparePrinting(CPrintInfo* pInfo)

{

       // default preparation

       return DoPreparePrinting(pInfo);

}

void CMywqq20112074View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

       // TODO: add extra initialization before printing

}

void CMywqq20112074View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

       // TODO: add cleanup after printing

}

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View diagnostics

#ifdef _DEBUG

void CMywqq20112074View::AssertValid() const

{

       CView::AssertValid();

}

void CMywqq20112074View::Dump(CDumpContext& dc) const

{

       CView::Dump(dc);

}

CMywqq20112074Doc* CMywqq20112074View::GetDocument() // non-debug version is inline

{

       ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMywqq20112074Doc)));

       return (CMywqq20112074Doc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CMywqq20112074View message handlers

void CMywqq20112074View::OnTimer(UINT nIDEvent)

{

       // TODO: Add your message handler code here and/or call default

       //结束,返回

       if(jieshu==1)

              return;

       //显示个数为0的方格

       leizero();

       //计时

       if(secondstart>0)

              secondstart++;

       if(secondstart==20)

       {

              secondstart=1;

              second++;      

              //重画时间

           CRect rect3;

              rect3.left=325;

              rect3.right=375;

              rect3.top=10;

              rect3.bottom=40;

              InvalidateRect(&rect3); 

       }

       CView::OnTimer(nIDEvent);

}

void CMywqq20112074View::OnLButtonDown(UINT nFlags, CPoint point)

{

       // TODO: Add your message handler code here and/or call default    

    //获取指针pdc

     CDC *pDC=GetDC();

        CDC Dc;

       if(Dc.CreateCompatibleDC(pDC)==FALSE)

               AfxMessageBox("Can't create DC");

        //显示按下按钮

        if(point.x>180&&point.x<210&&point.y>10&&point.y<40)

        {

           Dc.SelectObject(m_anniu[3]);

           pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);         

        }

    if((point.x>=10)&&(point.x<=385)&&(point.y>=50)&&(point.y<=290))

       {                  

              if(jieshu==1)

                     return;

               //显示张口按钮

              Dc.SelectObject(m_anniu[1]);

              pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);           

      

              secondstart=1;

              int a=(point.x-10)/15;

              int b=(point.y-50)/15;

              if(lei[a][b].weitu==0||lei[a][b].weitu==3)

        {   for(;n==0&&lei[a][b].shumu==-1;)    //////////////踩到第一个雷

                     {

                            int aa=0;

                            //初始化0

                            for(int i=0;i<m_RowCount;i++)

                            {

                                   for(int j=0;j<m_ColCount;j++)

                                   {

                                          lei[i][j].shumu=0;

                                          lei[i][j].weitu=0;

                                   }

                            }

                            do

                            {

                                   int k=rand()%m_RowCount;

                                   int l=rand()%m_ColCount;

                                   if(lei[k][l].shumu!=-1)

                                   {

                                          lei[k][l].shumu=-1;

                                          aa++;

                                   }

                             

                            }while(aa!=leinum);  

                            //给方格赋值

                            for(int a=0;a<m_RowCount;a++)

                                   for(int b=0;b<m_ColCount;b++)

                                          if(lei[a][b].shumu==0)

                                          {

                                                 for(int c=a-1;c<a+2;c++)

                                                        for(int d=b-1;d<b+2;d++)

                                                               if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                                      if(lei[c][d].shumu==-1)

                                                                             lei[a][b].shumu++;       

                                          }                         

                     }

                              ///////////////////////////////////如果第一个不是雷接下去部分

                  if(lei[a][b].shumu==-1)

                     {

                            jieshu=1;

                            KillTimer(1);

                            Invalidate();

                     }

            else if(leftnum==0)

                     {

                            jieshu=2;

                            KillTimer(1);

                            Invalidate();}

            else

                     {

                            lei[a][b].weitu=1;

                            CRect rect;

                            rect.left=a*15+10;

                            rect.right=a*15+25;

                            rect.top=b*15+50;

                            rect.bottom=b*15+65;

                            InvalidateRect(&rect);

                     }

                    

              n++;///////////////////////////////////////////////n是静态变量,每点一次左键加1 判断第一个雷

              int a1=0;

              for(int a=0;a<m_RowCount;a++)

                     for(int b=0;b<m_ColCount;b++)

                     {

                            if(lei[a][b].weitu!=1)

                            {

                                   a1++;            

                            }

                     }

              if(a1==leinum)

              {

                            jieshu=2;

                            KillTimer(1);//////////////////////////////////////显示胜利按钮(运行的时候出错)

                             

                            Dc.SelectObject(m_anniu[4]);

                            pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

                            for(int a=0;a<m_RowCount;a++)

                                   for(int b=0;b<m_ColCount;b++)

                                   {

                                          if(lei[a][b].shumu==-1)

                                          {

                                                 lei[a][b].weitu=2;         

                                          }

                                   }

                           

              }

              Invalidate();

              }

            

       }

       CView::OnLButtonDown(nFlags, point);

}

int CMywqq20112074View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

       if (CView::OnCreate(lpCreateStruct) == -1)

              return -1;

      

       // TODO: Add your specialized creation code here

//     SetTimer(1,50,NULL);

       return 0;

}

//扫描,如果是已经被按下且雷数为0,显示它周围的八个格,并重画

void CMywqq20112074View::leizero()

{

    for(int i=0;i<m_RowCount;i++)

              for(int j=0;j<m_ColCount;j++)

                     if(lei[i][j].shumu==0&&lei[i][j].weitu==1)

                     {

                            for(int n=i-1;n<i+2;n++)

                                   for(int m=j-1;m<j+2;m++)

                                          if(n>=0&&n<25&&m>=0&&m<m_ColCount)

                                                 if(lei[n][m].shumu!=-1&&lei[n][m].weitu==0)

                                                 {

                                                        lei[n][m].weitu=1;

                                                        CRect rect;

                                                        rect.left=n*15+10;

                                                        rect.right=n*15+25;

                                                        rect.top=m*15+50;

                                                        rect.bottom=m*15+65;

                                                        InvalidateRect(&rect);         

                                                 }

                     }

}

void CMywqq20112074View::OnStart()

{

       SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       n=0;

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置40个雷

       do

       {

              int k=rand()%m_RowCount;

              int l=rand()%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);  

    //给方格赋值

       for(int a=0;a<m_RowCount;a++)

              for(int b=0;b<m_ColCount;b++)

                     if(lei[a][b].shumu==0)

                     {

                            for(int c=a-1;c<a+2;c++)

                                   for(int d=b-1;d<b+2;d++)

                                          if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                 if(lei[c][d].shumu==-1)

                                                        lei[a][b].shumu++;       

                     }

       Invalidate();

}

void CMywqq20112074View::OnLButtonUp(UINT nFlags, CPoint point)

{

       // TODO: Add your message handler code here and/or call default

    CDC *pDC=GetDC();

      CDC Dc;

      if(Dc.CreateCompatibleDC(pDC)==FALSE)

        AfxMessageBox("Can't create DC");

       //显示按钮

       Dc.SelectObject(m_anniu[0]);

       pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

      

       if(jieshu==1)

       {

              Dc.SelectObject(m_anniu[2]);

              pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

       }    

       if(point.x>180&&point.x<210&&point.y>10&&point.y<40)

           OnStart();

       CView::OnLButtonUp(nFlags, point);

}

void CMywqq20112074View::OnRButtonDown(UINT nFlags, CPoint point)

{

       CDC *pDC=GetDC();

        CDC Dc;

       if(Dc.CreateCompatibleDC(pDC)==FALSE)

               AfxMessageBox("Can't create DC");

       if((point.x>=10)&&(point.x<=385)&&(point.y>=50)&&(point.y<=290))

       {    

              if(jieshu==1)

                     return;

              int a=(point.x-10)/15;

              int b=(point.y-50)/15;

              if(lei[a][b].weitu==0)

              {

                     lei[a][b].weitu=2;

                 leftnum--;

                 if(lei[a][b].shumu==-1)

                            realnum--;

              }

              else if(lei[a][b].weitu==2)

              {

                     lei[a][b].weitu=3;

                     leftnum++;

                     if(lei[a][b].shumu==-1)

                            realnum++;

              }

              else if(lei[a][b].weitu==3)

              lei[a][b].weitu=0;

              CRect rect2;

          rect2.left=20;

          rect2.right=70;

          rect2.top=10;

          rect2.bottom=40;

          InvalidateRect(&rect2);         

  

          //重画打击格子

          CRect rect;

          rect.left=a*15+10;

          rect.right=a*15+25;

          rect.top=b*15+50;

          rect.bottom=b*15+65;

          InvalidateRect(&rect);

        if(leftnum==0&&realnum==0)

              {

                     jieshu=1;

                     second=1;

                     MessageBox("获胜");

                    

                    

              }

       }

  

       CView::OnRButtonDown(nFlags, point);

}

void CMywqq20112074View::OnEasy() /////////////////////////////初级

{

m_RowCount=10;//行数10

        m_ColCount=10;//列数10

     leinum=10;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置10个雷

       do

       {

              int k=rand()%m_RowCount;

              int l=rand()%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);  

    //给方格赋值

       for(int a=0;a<m_RowCount;a++)

              for(int b=0;b<m_ColCount;b++)

                     if(lei[a][b].shumu==0)

                     {

                            for(int c=a-1;c<a+2;c++)

                                   for(int d=b-1;d<b+2;d++)

                                          if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                 if(lei[c][d].shumu==-1)

                                                        lei[a][b].shumu++;       

                     }

       Invalidate();  

}

void CMywqq20112074View::OnMiddle() //////////////////////////////////中级

{

m_RowCount=15;//行数15

        m_ColCount=15;//列数15

     leinum=40;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置40个雷

       do

       {

              int k=rand()%m_RowCount;

              int l=rand()%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);  

    //给方格赋值

       for(int a=0;a<m_RowCount;a++)

              for(int b=0;b<m_ColCount;b++)

                     if(lei[a][b].shumu==0)

                     {

                            for(int c=a-1;c<a+2;c++)

                                   for(int d=b-1;d<b+2;d++)

                                          if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                 if(lei[c][d].shumu==-1)

                                                        lei[a][b].shumu++;       

                     }

       Invalidate();  

}

void CMywqq20112074View::OnHard() ///////////////////////////////////////////高级

{

m_RowCount=25;//行数25

        m_ColCount=16;//列数16

     leinum=80;

        realnum=leinum;

SetTimer(1,50,NULL);

       // TODO: Add your command handler code here

       second=0;//计时

       secondstart=0;//1时开始计时

//     num=0;

    leftnum=leinum;//剩余雷数

       jieshu=0;//jieshu=1时停止

       int aa=0;

       //初始化0

       for(int i=0;i<m_RowCount;i++)

       {

              for(int j=0;j<m_ColCount;j++)

              {

                     lei[i][j].shumu=0;

                     lei[i][j].weitu=0;

              }

       }

       //设置80个雷

       do

       {

              int k=rand()%m_RowCount;

              int l=rand()%m_ColCount;

              if(lei[k][l].shumu!=-1)

              {

                     lei[k][l].shumu=-1;

                  aa++;

              }

        

       }while(aa!=leinum);  

    //给方格赋值

       for(int a=0;a<m_RowCount;a++)

              for(int b=0;b<m_ColCount;b++)

                     if(lei[a][b].shumu==0)

                     {

                            for(int c=a-1;c<a+2;c++)

                                   for(int d=b-1;d<b+2;d++)

                                          if(c>=0&&c<m_RowCount&&d>=0&&d<m_ColCount)

                                                 if(lei[c][d].shumu==-1)

                                                        lei[a][b].shumu++;       

                     }

       Invalidate();         

}

更多相关推荐:
打砖块游戏课程设计报告

目录第1章程序设计专题目的与要求111程序设计目的112程序设计的实验环境113程序设计的预备知识114程序设计要求1第2章程序设计内容221概要设计222程序整体设计说明223程序部分源代码及注释824测试结...

24点游戏课程设计报告

目录123基本功能描述2设计思路2软件设计431设计步骤432界面设计533关键功能实现6331发牌功能的实现6332计时功能的实现7333计算功能的实现7334验算功能的实现94567结论与心得体会9参考文献...

连四游戏课程设计报告

第1章引言1第2章任务概述121问题概述1211问题重述1212设计目的122需求分析1221基本要求1222游戏功能介绍123编程语言概述124编程环境概述1第3章概要设计231功能设计232程序结构233基...

游戏24点课程设计报告

游戏24点课程设计报告一题目分析类计算24点任意输入4位数字利用四则运算使之得到结果24输出所有不同算法的计算表达式可为运算优先级而使用括号二问题分析1全面性此问题要求输出结果为24的计算表达式并且要求输出要全...

java_扫雷游戏课程设计报告

滨江学院20xx20xx学年第2学期数字图像处理课程论文专业姓名学号20xx年06月05日设计通信编程课程论文Java设计扫雷游戏王李超20xx2334038南京信息工程大学滨江学院电子工程系南京210041设...

FLASH页面游戏课程设计报告

FLASH页面游戏课程设计报告第一章绪论11课题背景意义随着社会的不断发展人们的生活水平在不断地提高网络游戏也越来越多的融入到人们的生活中去游戏的出现带来了网络上的优势扩宽了人们平时玩的传统游戏的界限给人们带来...

动画与游戏设计 课程设计报告

动画与游戏开发课程报告学号1111020xx103姓名张慧专业班级11级计科本01班日期电子信息工程学院1目录一课程内容及应用领域11基于DirectX的粒子系统3111粒子系统简介3112广告板技术3113粒...

塔防游戏课程设计报告

西安科技大学程序设计综合实训课程设计报告题目塔防小游戏专业网络工程姓名张悦董艳妮李亚楠卢一瑶20xx年1月3号1目录1绪论211选题目的及意义或本课题的开发背景212系统概述213人员组成及分工22需求分析23...

猜数字游戏课程设计报告

第一章课程设计的目的和要求11课程设计的目的用高级程序语言设计出猜数字游戏系统实现猜数字游戏通过用高级程序语言制作程序熟悉用高级程序语言编程的操作和步骤学习高级程序语言的运用以及高级程序语言实验报告的书写格式1...

C++课程设计--福彩游戏设计报告

南京理工大学VC++课程设计报告课程:VC++课程设计选题名称:福彩游戏一、程序设计要求(1)定义一个福彩类,封装计算机开出的大奖号码及开奖过程函数和输出大奖号码的函数。(2)定义一个用户类,封装用户输入的数字…

java游戏开发课程设计报告

JAVA游戏开发课程设计报告题目网络益智游戏姓名学号专业班级云红卫081012130软件技术软件082计算机科学与技术系20xx年6月目录1实践过程概述32课程设计题目描述33系统需求分析与设计331系统需求分...

C++程序课程设计报告_21点游戏

随机数枚举类型C面向对象程序设计课程设计报告设计题目21点游戏学生学号学生姓名专业班级学生成绩指导教师医药信息工程学院图像处理与多媒体教研室20xx1一设计任务分析121点游戏介绍21点游戏是一个古老的#9@k游戏...

游戏课程设计报告(36篇)