版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告课程名称:面向对象程序设计 C++设计题目: 扫雷专 业:计算机科学与技术姓 名:学 号:指导教师:李晓虹2016 年1 月7 日一、系统需求分析随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世, 这其中有相当一部分是游戏软件。 使用游戏软件自然是为了满足人们对娱乐性的要求,而有些软件大都采用3D设计对系统配置的要求较高。在众多游戏软件中,也不乏一些小游戏的身影,它们对系统的配置要求较低。能够满足人们对娱乐性的需求,是人们在完成工作娱乐时候的最好选择。在各种操作系统中都附带了一些小的游戏,而这些游戏也成为电脑用户软件中不可或缺的一部分。扫雷游戏是比较经典的一款小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。作为本系统的开发工具,MicrosoftVisualC++6.0 成为首选。它具有可视化的编程界面、详细的提示、以及完善的帮助文档,使得软件开发人员感到无比的亲切感。二、总体设计2.1设计思路在设计之前,我们先来了解这款游戏的规则:在不打开任何藏有地雷的格子情况下,以最快的速度找出所有的地雷。如果在打开格子的过程中,不小心翻开(踩到)藏有地雷的格子,则宣告失败(游戏结束),惟有将所有不含地雷的格子打开,游戏才算成功。游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的格子按下左键时即表示翻开格子,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则格子会以未标示→标示→疑似三者关系不断循环。 游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个格子内所含的地雷数,假若翻开的格子显示数字“3”,则表示以其为中心的周边格子内藏有3个地雷。当按下的格子不是地雷,且周边八个格子也都没有地雷时,格子会以被翻开格子的八个方向将空白格子翻开。2.2模块功能介绍游戏总共七个类,其中以下四个类为主要。1、主界面对话框类:主要负责主菜单及各个窗口类对象的创建和调用等处理。2、扫雷窗口类:主要负责接收玩家鼠标输入的打开格子位置、格子变换、花费时间及地雷格子的显示等处理。3、帮组对话框类:主要负责帮助提示的显示及其它显示功能。4、扫雷视图类:主要负责显示扫雷界面的展示。2.3模块结构图2.3.1游戏主界面设计扫雷游戏主界面的设计,如下图 1所示菜单时间 雷数游戏界面图1扫雷游戏主界面2.3.2游戏主菜单结构的设计扫雷游 设 帮戏 置 助开退自关定始出于义图2游戏主菜单结构三、详细设计3.1游戏菜单的实现在扫雷游戏中,通过如下几个步骤即可实现添加游戏的菜单。1)在扫雷游戏工程的资源中添加一个菜单资源2)给每个菜单栏添加响应函数到CMainFrame类中。3)菜单响应函数的实现,代码如下,#if!defined(AFX_MAINFRM_H__91F247CA_D634_432A_AC01_35B33EA7D404__INCLUDED_)#defineAFX_MAINFRM_H__91F247CA_D634_432A_AC01_35B33EA7D404__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000classCMainFrame:publicCFrameWnd{protected://createfromserializationonlyCMainFrame();DECLARE_DYNCREATE(CMainFrame)Attributespublic:Operationspublic:virtualBOOLPreCreateWindow(CREATESTRUCT&cs);public:virtual~CMainFrame();#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endifprotected:DECLARE_MESSAGE_MAP()};#endif3.2游戏帮助对话框的实现扫雷游戏中的帮助是使用一个对话框来实现的。其实现步骤如下。1)添加一个对话框资源到工程中,并填写说明文字。2)编写一个CAboutDlg对话框类,主要是加载IDD_ABOUTBOX对话框资源。通过资源中的文字说明对游戏操作方法进行描述。同时只包含单击“确定”按钮的响应函数。3)CAboutDlg对话框类的实现,需要实现对话框类的构造函数、析构函数和“确定”按钮响应函数,代码如下,classCAboutDlg:publicCDialog{public:CAboutDlg();//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};//}}AFX_DATAClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange*pDX); // DDX/DDVsupport//}}AFX_VIRTUALImplementationprotected://{{AFX_MSG(CAboutDlg)Nomessagehandlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()//AppcommandtorunthedialogvoidCMineSweeperApp::OnAppAbout(){CAboutDlgaboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////////CMineSweeperAppmessagehandlers3.3新游戏处理模块的设计与实现新游戏处理模块主要负责游戏中的游戏初始化及开始游戏。其设计比较简单,只需要通过如下几步即可实现。1)载入图片资源和配置文件中的数据。2)把所有的游戏参数进行初始化。例如,当前消耗时间和状态等。3)初始化表示地雷区域的二维数组。4)让地雷区域图像失效,重新绘制新的图像。实现代码如下,BEGIN_MESSAGE_MAP(CMineSweeperView,CView)//{{AFX_MSG_MAP(CMineSweeperView)ON_COMMAND(ID_EXIT,OnExit)ON_COMMAND(ID_START,OnStart)ON_COMMAND(ID_SETTING,OnSetting)ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMineSweeperViewconstruction/destructionCMineSweeperView::CMineSweeperView(){TODO:addconstructioncodeherem_row=10;m_col=10;m_mine=10;m_start=0;m_stop=0;m_t=0;}CMineSweeperView::~CMineSweeperView(){}BOOLCMineSweeperView::PreCreateWindow(CREATESTRUCT&cs){TODO:ModifytheWindowclassorstylesherebymodifyingtheCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CMineSweeperViewdrawingvoidCMineSweeperView::OnDraw(CDC*pDC){CMineSweeperDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);TODO:adddrawcodefornativedataherepDC->BitBlt(0,0,1024,822,&cbj,0,0,SRCCOPY);}///////////////////////////////////////////////////////////////////////////////CMineSweeperViewdiagnostics#ifdef_DEBUGvoidCMineSweeperView::AssertValid()const{CView::AssertValid();}voidCMineSweeperView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CMineSweeperDoc*CMineSweeperView::GetDocument()//non-debugversionisinline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMineSweeperDoc)));return(CMineSweeperDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CMineSweeperViewmessagehandlersvoidCMineSweeperView::OnInitialUpdate(){CView::OnInitialUpdate();TODO:Addyourspecializedcodehereand/orcallthebaseclassAfxGetApp()->m_pMainWnd->SetWindowPos(NULL,300,50,460,500,NULL);initbitmap(); // 初始化位图}voidCMineSweeperView::OnStart(){TODO:Addyourcommandhandlercodeherem_start=1;m_stop=0;m_t=0;initdata(); // 初始化数据paintmine(); // 画雷区SetTimer(0,1000,NULL);}voidCMineSweeperView::initdata(){inti=0,j=0,n=0;mine=newMine*[m_row];for(i=0;i<m_row;i++){mine[i]=newMine[m_col];}for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){mine[i][j].x=50+35*j;mine[i][j].y=80+35*i;mine[i][j].p=0;mine[i][j].flag=0;mine[i][j].num=0;}}srand(time(NULL));if(0==m_mine)return;while(1){intx=rand()%m_row;inty=rand()%m_col;if(0==mine[x][y].p){mine[x][y].p=1;n++;if(x-1>=0&&y-1>=0)mine[x-1][y-1].num++;if(x-1>=0)mine[x-1][y].num++;if(x-1>=0&&y+1<m_col)mine[x-1][y+1].num++;if(y-1>=0)mine[x][y-1].num++;if(y+1<m_col)mine[x][y+1].num++;if(x+1<m_row&&y-1>=0)mine[x+1][y-1].num++;if(x+1<m_row)mine[x+1][y].num++;if(x+1<m_row&&y+1<m_col)mine[x+1][y+1].num++;}if(n>=m_mine)break;}}voidCMineSweeperView::paintmine(){inti=0,j=0;CDC*pDC=GetDC();for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbj0,0,0,SRCCOPY);}}ReleaseDC(pDC);}3.4地雷格子模块的设计与实现地雷格子的处理时扫雷游戏的核心内容,包括如下几个部分。1、地雷铺设模块。游戏中的地雷是随机铺设的,可以调用随机数发生函数生成随机数。利用随机数去除最大行数或者最大列数, 得到放置地雷行列坐标。然后分别防止地雷到不同的行和列的格子中去。2、自动打开周围不是地雷的格子。游戏中,当玩家单击的格子周围没有地雷格子时,就需要程序自动地把周围的格子自动打开来提高玩家的效率。其实现是通过递归的方法不断地打开周围格子周围地雷个数为0的格子来实现。3、获得周围地雷个数模块。在游戏中当玩家打开一个格子时,如果当前这个格子不是地雷,那么其一定是标明周围的地雷个数的格子。要实现这个功能主要是通过遍历当前格子周围的3×3范围的数组。当找到一个元素状态是地雷时,就把记录增加 1,知道九个格子全部找完。这样就可以得到当前格子周围的地雷个数。以上讲解的相关函数的实现。实现代码如下,voidCMineSweeperView::OnStart(){TODO:Addyourcommandhandlercodeherem_start=1;m_stop=0;m_t=0;initdata(); // 初始化数据paintmine(); // 画雷区SetTimer(0,1000,NULL);}voidCMineSweeperView::initdata(){inti=0,j=0,n=0;mine=newMine*[m_row];for(i=0;i<m_row;i++){mine[i]=newMine[m_col];}for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){mine[i][j].x=50+35*j;mine[i][j].y=80+35*i;mine[i][j].p=0;mine[i][j].flag=0;mine[i][j].num=0;}}srand(time(NULL));if(0==m_mine)return;while(1){intx=rand()%m_row;inty=rand()%m_col;if(0==mine[x][y].p){mine[x][y].p=1;n++;if(x-1>=0&&y-1>=0)mine[x-1][y-1].num++;if(x-1>=0)mine[x-1][y].num++;if(x-1>=0&&y+1<m_col)mine[x-1][y+1].num++;if(y-1>=0)mine[x][y-1].num++;if(y+1<m_col)mine[x][y+1].num++;if(x+1<m_row&&y-1>=0)mine[x+1][y-1].num++;if(x+1<m_row)mine[x+1][y].num++;if(x+1<m_row&&y+1<m_col)mine[x+1][y+1].num++;}if(n>=m_mine)break;}}voidCMineSweeperView::paintmine(){inti=0,j=0;CDC*pDC=GetDC();for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbj0,0,0,SRCCOPY);}}ReleaseDC(pDC);}3.5游戏规划模块的设计与实现游戏规则模块的实现,主要由游戏胜利和游戏结束判断函数组成。通过对游戏的结果进行判断,实现扫雷游戏的规则。1、游戏胜利的判断通过遍历整个地雷数组,查找是否全部的地雷格子已经被标记或者找出来。如果已经全部被找出来或者标记出来, 那么说明玩家胜利,繁殖,说明玩家未胜利,需要继续游戏。2、游戏结束的判断当玩家打开一个格子时,就对当前格子进行判断。如果是地雷,说明玩家不行。游戏以失败结束。而如果不是地雷,就对玩家选中的格子周围的标示进行判断,如果有判断错误的格子,也说明玩家游戏失败,游戏结束。实现代码如下,voidCMineSweeperView::OnLButtonDown(UINTnFlags,CPointpoint){TODO:Addyourmessagehandlercodehereand/orcalldefaultif(0==m_start||1==m_stop)return;CDC*pDC=GetDC();inti=-1,j=-1;get_ij(point,&i,&j);if(-1==i||-1==j)return;if(1==mine[i][j].p){pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[9],0,0,SRCCOPY);m_stop=1;KillTimer(0);AfxMessageBox("对不起!~\n你踩到地雷了!\n再来一次吧!!!");}else{if(2==mine[i][j].flag)m_mine++;switch(mine[i][j].num){case0:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[0],0,0,SRCCOPY);break;case1:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[1],0,0,SRCCOPY);break;case2:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[2],0,0,SRCCOPY);break;case3:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[3],0,0,SRCCOPY);break;case4:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[4],0,0,SRCCOPY);break;case5:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[5],0,0,SRCCOPY);break;case6:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[6],0,0,SRCCOPY);break;case7:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[7],0,0,SRCCOPY);break;}}mine[i][j].flag=1;ReleaseDC(pDC);CView::OnLButtonDown(nFlags,point);}voidCMineSweeperView::OnRButtonDown(UINTnFlags,CPointpoint){TODO:Addyourmessagehandlercodehereand/orcalldefaultif(0==m_start||1==m_stop)return;CDC*pDC=GetDC();inti=-1,j=-1;get_ij(point,&i,&j);if(-1==i||-1==j)return;if(1==mine[i][j].flag)return;if(0==m_mine)return;if(2==mine[i][j].flag)pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbj0,0,0,SRCCOPY);elsepDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[10],0,0,SRCCOPY);if(m_mine>0)m_mine--;mine[i][j].flag=2;if(0==m_mine){ifwin();}ReleaseDC(pDC);CView::OnRButtonDown(nFlags,point);}voidCMineSweeperView::get_ij(CPointp,int*r,int*c){inti=0,j=0;for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){if(mine[i][j].x<p.x&&p.x<mine[i][j].x+35){if(mine[i][j].y<p.y&&p.y<mine[i][j].y+35){*r=i;*c=j;return;}}}}}voidCMineSweeperView::ifwin(){CDC*pDC=GetDC();m_stop=1;inti=0,j=0;for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){if(2==mine[i][j].flag){if(1==mine[i][j].p)pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[9],0,0,SRCCOPY);else{switch(mine[i][j].num){case0:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[0],0,0,SRCCOPY);break;case1:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[1],0,0,SRCCOPY);break;case2:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[2],0,0,SRCCOPY);break;case3:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[3],0,0,SRCCOPY);break;case4:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[4],0,0,SRCCOPY);break;case5:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[5],0,0,SRCCOPY);break;case6:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[6],0,0,SRCCOPY);break;case7:pDC->BitBlt(mine[i][j].x,mine[i][j].y,35,35,&cbm[7],0,0,SRCCOPY);break;}}}}}for(i=0;i<m_row;i++){for(j=0;j<m_col;j++){if(2==mine[i][j].flag&&0==mine[i][j].p){CStringx,y,str;x.Format("%d",i+1);y.Format("%d",j+1);str="很遗憾!\n 第";str=str+x+" 行,第 "+y+" 列 你好幸运的~\n 游戏结束!!!";KillTimer(0);AfxMessageBox(str);ReleaseDC(pDC);return;}}}KillTimer(0);AfxMessageBox("恭喜你~\n你已经排出所有的地雷了!\n");ReleaseDC(pDC);}voidCMineSweeperView::painttime(){CDC*pDC=GetDC();CStrings;s.Format("%ds",m_t);pDC->BitBlt(50,20,29,29,&cclock,0,0,SRCCOPY);pDC->SetBkMode(TRANSPARENT);pDC->BitBlt(90,30,29,29,&cbj,90,30,SRCCOPY);pDC->TextOut(90,30,s);s.Format("%d",m_mine);pDC->BitBlt(130,20,29,29,&cmine,0,0,SRCCOPY);pDC->BitBlt(170,30,29,29,&cbj,170,30,SRCCOPY);pDC->TextOut(170,30,s);m_t++;ReleaseDC(pDC);}voidCMineSweeperView::OnTimer(UINTnIDEvent){TODO:Addyourmessagehandlercodehereand/orcalldefaultswitch(nIDEvent){case0:{painttime();break;}}CView::OnTimer(nIDEvent);}3.6游戏绘图模块的设计与实现在扫雷游戏中,通过绘图模块实现地雷、格子、地雷个数、当前时间及控制按钮等图片和信息的提示。有以下几个函数组成。1、绘按钮函数绘按钮函数,主要通过在游戏中不断地得到当前游戏的状态。根据这个按钮,在按钮图片中把指定的坐标范围图片绘制到主界面上。2、绘数字区域函数剩余地雷个数和消耗时间的数字显示,主要通过一定的算法,得到当前地雷剩余个数和已消耗的时间。3、绘雷区函数绘雷函数,时通过遍历当前雷区数组,并根据当前元素所代表的类型不同,将不同的图片绘制到位置。实现代码如下,voidCMineSweeperView::OnInitialUpdate(){CView::OnInitialUpdate();TODO:Addyourspecializedcodehereand/orcallthebaseclassAfxGetApp()->m_pMainWnd->SetWindowPos(NULL,300,50,460,500,NULL);initbitmap(); // 初始化位图}voidCMineSweeperView::initbitmap(){CDC*pDC=GetDC();bm[0].LoadBitmap(IDB_0);bm[1].LoadBitmap(IDB_1);bm[2].LoadBitmap(IDB_2);bm[3].LoadBitmap(IDB_3);bm[4].LoadBitmap(IDB_4);bm[5].LoadBitmap(IDB_5);bm[6].LoadBitmap(IDB_6);bm[7].LoadBitmap(IDB_7);bm[8].LoadBitmap(IDB_8);bm[9].LoadBitmap(IDB_9);bm[10].LoadBitmap(IDB_10);bj.LoadBitmap(IDB_bj);bj0.LoadBitmap(IDB_bj0);bclock.LoadBitmap(IDB_clock);bmine.LoadBitmap(IDB_mine);bnum.LoadBitmap(IDB_num);cbm[0].CreateCompatibleDC(pDC);cbm[1].CreateCompatibleDC(pDC);cbm[2].CreateCompatibleDC(pDC);cbm[3].CreateCompatibleDC(pDC);cbm[4].CreateCompatibleDC(pDC);cbm[5].CreateCompatibleDC(pDC);cbm[6].CreateCompatibleDC(pDC);cbm[7].CreateCompatibleDC(pDC);cbm[8].CreateCompatibleDC(pDC);cbm[9].CreateCompatibleDC(pDC);cbm[10].CreateCompatibleDC(pDC);cbj.CreateCompatibleDC(pDC);cbj0.CreateCompatibleDC(pDC);cclock.CreateCompatibleDC(pDC);cmine.CreateCompatibleDC(pDC);cnum.CreateCompatibleDC(pDC);cbm[0].SelectObject(&bm[0]);cbm[1].SelectObject(&bm[1]);cbm[2].SelectObject(&bm[2]);cbm[3].SelectObject(&bm[3]);cbm[4].SelectObject(&bm[4]);cbm[5].SelectObject(&bm[5]);cbm[6].SelectObject(&bm[6]);cbm[7].SelectObject(&bm[7]);cbm[8].SelectObject(&bm[8]);cbm[9].SelectObject(&bm[9]);cbm[10].SelectObject(&bm[10]);cbj.SelectObject(&bj);cbj0.SelectObject(&bj0);cclock.SelectObject(&bclock);cmine.SelectObject(&bmine);cnum.SelectObject(&bnum);ReleaseDC(pDC);}voidCMineSweeperView::OnExit(){TODO:Addyourcommandhandlercodehereexit(0);}3.7、玩家输入模块的设计与实现在扫雷游戏中,用的最多的就是鼠标的输入。而鼠标输入又分为鼠标左键单击和右键单击两种处理类型。1、 鼠标左键的处理要实现鼠标左键的处理,需要如下几个步骤。1)接收玩家在界面上的鼠标左键输入信息。2)对当前鼠标的坐标进行判断。3)当在按钮区时,调用控制按钮的处理函数。4)当在地雷区时,如果当前游戏的状态是等待输入或者正在运行时,就得到当前选中的格子指针;反之,不进行响应。5)在得到格子指针后,对选中格子的状态进行判断。如果是正常的格子,即未被打开过的格子,就转到格子处理函数;如果不是不是能够的格子,则不进行响应。2、鼠标右键的处理要实现鼠标右键的处理,需要如下几个步骤。1)接收玩家在界面上的鼠标右键输入信息。2)对当前鼠标的坐标进行判断。3)当在地雷区时,如果当前游戏的状态是等待输入或者正在运行时,就得到当前选中的格子指针;反之,不进行响应。4)根据当前格子的状态进行变化。其变化规则为:如果是正常状态,则变成标记(旗子)状态。四、系统调试在进行游戏胜利判断时,出现错误,后和同学查询书籍及网络修改代码后成功。目前还没有完成右键双击鼠标的功能。五、结果分析5.1主菜单和界面显示功能的测试演示这个测试主要是测试游戏的菜单和界面显示是否成功,其测试步骤如下。1)运行扫雷程序,选中其中的.exe图标,如图3所示。2)程序启动后,其菜单及主界面如图4所示。3)判断结果:游戏的菜单和界面显示成功。图3运行扫雷程序图4扫雷游戏主界面及菜单5.2、鼠标输入功能的测试演示鼠标输入功能测试,其测试步骤如下,(1)游戏开始后,使用鼠标单击窗口地雷区中的格子,如图 5所示。2)使用鼠标右击主游戏窗口中的格子,如图6所示。3)判断结果:鼠标输入功能测试成功。图5左击鼠标 图6右击鼠标5.3游戏胜负判断功能的测试演示测试扫雷游戏中游戏胜负判断功能。其测试步骤如下。(1)游戏开始后,玩家慢慢找出地雷 ,如图9。(2)直到有一个地雷格子被不小心踩到,弹出失败提示对话框,如图 8。图8不成功 图9成功5.4游戏帮助功能的测试演示玩测试扫雷游戏是否有帮助提示功能。其测试步骤如下。1)选择“帮助”|“关于”命令,2)游戏中弹出“帮助”对话框,如图10所示。图10六、总结随着扫雷游戏的开发完成,本游戏中预期的主要功能也基本实现。本系统以Visual C++ 6.0作为前台开发工具,Visual C++ 6.0以简单、易用等优点成为开发本系统的首选工具。本文阐述了扫雷游戏的分析与设计的全过程,并在文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。扫雷游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。由于我学习VisualC++6.0的时间比较短,其中的很多知识还没有了解和掌握,在扫雷游戏中有些功能还不够完善,例如在扫雷游戏中不能实现播放背景音乐。希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 珍爱生命从安全开始
- 高中语文7玄黑结婚课件苏教版必修
- 高二化学家用燃料更新
- 安全教育知识读本课程-教案
- Windows Server网络管理项目教程(Windows Server 2022)(微课版)教案1 部署虚拟环境安装Windows Server 2022操作系统
- 八年级英语上英语课外阅读拓展训练四(时文)无答案
- 高中物理第四章牛顿运动定律3牛顿第二定律课件新人教版必修
- 2014-2020年磷酸氢钙行业现状分析及风险投资报告
- 2024至2030年中国手机维修专用系统行业投资前景及策略咨询研究报告
- 2024至2030年中国异形金属天花板数据监测研究报告
- 沪科版九年级物理 (电阻和变阻器)探究电路教育教学课件
- 初中生法治教育讲座课件
- 牙颌面畸形-牙颌面畸形与正颌外科(口腔颌面外科课件)
- 清华大学中学生标准学术能力诊断性测试2024学年数学高三上期末学业水平测试模拟试题含解析
- 第二语言习得研究期末复习题
- 安徽新北卡化学有限公司年产500吨啶虫脒和150吨联苯菊酯等农药原药产品技术改造项目环境影响报告书
- 防雷检测技术规范练习考试题库(500题)
- (市政)施工质量保证措施(管线、排水、道路等)方案
- 高分子物理电子教案
- 酒泉职业技术学院2022届毕业生《中华优秀传统文化》课程重修及考核方案课程基本情况
- 如何做好巡检
评论
0/150
提交评论