欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C--课程设计-扫雷1.doc

    • 资源ID:92939394       资源大小:746KB        全文页数:28页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C--课程设计-扫雷1.doc

    课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目: 扫雷 专 业:计算机科学与技术 姓 名: 学 号: 指导教师:李 晓 虹 2016 年 1 月 7 日一、 系统需求分析 随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世,这其中有相当一部分是游戏软件。使用游戏软件自然是为了满足人们对娱乐性的要求,而有些软件大都采用3D设计对系统配置的要求较高。 在众多游戏软件中,也不乏一些小游戏的身影,它们对系统的配置要求较低。能够满足人们对娱乐性的需求,是人们在完成工作娱乐时候的最好选择。在各种操作系统中都附带了一些小的游戏,而这些游戏也成为电脑用户软件中不可或缺的一部分。 扫雷游戏是比较经典的一款小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。作为本系统的开发工具,Microsoft Visual C+ 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_)#define AFX_MAINFRM_H_91F247CA_D634_432A_AC01_35B33EA7D404_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000class CMainFrame : public CFrameWndprotected: / create from serialization onlyCMainFrame();DECLARE_DYNCREATE(CMainFrame)/ Attributespublic:/ Operationspublic:virtual BOOL PreCreateWindow(CREATESTRUCT& cs);public:virtual CMainFrame();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:DECLARE_MESSAGE_MAP();#endif 3.2游戏帮助对话框的实现扫雷游戏中的帮助是使用一个对话框来实现的。其实现步骤如下。 (1) 添加一个对话框资源到工程中,并填写说明文字。(2) 编写一个CAboutDlg对话框类,主要是加载IDD_ABOUTBOX对话框资源。通过资源中的文字说明对游戏操作方法进行描述。同时只包含单击“确定”按钮的响应函数。(3) CAboutDlg对话框类的实现,需要实现对话框类的构造函数、析构函数和“确定”按钮响应函数,代码如下,class CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/ No message handlers/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ App command to run the dialogvoid CMineSweeperApp:OnAppAbout()CAboutDlg aboutDlg;aboutDlg.DoModal();/ CMineSweeperApp message handlers3.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()/ CMineSweeperView construction/destructionCMineSweeperView:CMineSweeperView()/ TODO: add construction code herem_row=10;m_col=10;m_mine=10;m_start=0;m_stop=0;m_t=0;CMineSweeperView:CMineSweeperView()BOOL CMineSweeperView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CMineSweeperView drawingvoid CMineSweeperView:OnDraw(CDC* pDC)CMineSweeperDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->BitBlt(0,0,1024,822,&cbj,0,0,SRCCOPY);/ CMineSweeperView diagnostics#ifdef _DEBUGvoid CMineSweeperView:AssertValid() constCView:AssertValid();void CMineSweeperView:Dump(CDumpContext& dc) constCView:Dump(dc);CMineSweeperDoc* CMineSweeperView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMineSweeperDoc);return (CMineSweeperDoc*)m_pDocument;#endif /_DEBUG/ CMineSweeperView message handlersvoid CMineSweeperView:OnInitialUpdate() CView:OnInitialUpdate();/ TODO: Add your specialized code here and/or call the base classAfxGetApp()->m_pMainWnd->SetWindowPos(NULL,300,50,460,500,NULL);initbitmap(); / 初始化位图void CMineSweeperView:OnStart() / TODO: Add your command handler code herem_start=1;m_stop=0;m_t=0;initdata(); / 初始化数据paintmine(); / 画雷区SetTimer(0,1000,NULL);void CMineSweeperView:initdata()int i=0,j=0,n=0;mine=new Mine *m_row;for(i=0;i<m_row;i+)minei=new Mine m_col;for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)mineij.x=50+35*j;mineij.y=80+35*i;mineij.p=0;mineij.flag=0;mineij.num=0;srand(time(NULL);if(0=m_mine)return;while(1)int x=rand()%m_row;int y=rand()%m_col;if(0=minexy.p)minexy.p=1;n+;if(x-1>=0&&y-1>=0)minex-1y-1.num+;if(x-1>=0)minex-1y.num+;if(x-1>=0&&y+1<m_col)minex-1y+1.num+;if(y-1>=0)minexy-1.num+;if(y+1<m_col)minexy+1.num+;if(x+1<m_row&&y-1>=0)minex+1y-1.num+;if(x+1<m_row)minex+1y.num+;if(x+1<m_row&&y+1<m_col)minex+1y+1.num+;if(n>=m_mine)break;void CMineSweeperView:paintmine()int i=0,j=0;CDC *pDC=GetDC();for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)pDC->BitBlt(mineij.x,mineij.y,35,35,&cbj0,0,0,SRCCOPY);ReleaseDC(pDC);3.4地雷格子模块的设计与实现地雷格子的处理时扫雷游戏的核心内容,包括如下几个部分。1、 地雷铺设模块。 游戏中的地雷是随机铺设的,可以调用随机数发生函数生成随机数。利用随机数去除最大行数或者最大列数,得到放置地雷行列坐标。然后分别防止地雷到不同的行和列的格子中去。2、 自动打开周围不是地雷的格子。 游戏中,当玩家单击的格子周围没有地雷格子时,就需要程序自动地把周围的格子自动打开来提高玩家的效率。其实现是通过递归的方法不断地打开周围格子周围地雷个数为0的格子来实现。3、 获得周围地雷个数模块。 在游戏中当玩家打开一个格子时,如果当前这个格子不是地雷,那么其一定是标明周围的地雷个数的格子。要实现这个功能主要是通过遍历当前格子周围的3×3范围的数组。当找到一个元素状态是地雷时,就把记录增加1,知道九个格子全部找完。这样就可以得到当前格子周围的地雷个数。 以上讲解的相关函数的实现。实现代码如下,void CMineSweeperView:OnStart() / TODO: Add your command handler code herem_start=1;m_stop=0;m_t=0;initdata(); / 初始化数据paintmine(); / 画雷区SetTimer(0,1000,NULL);void CMineSweeperView:initdata()int i=0,j=0,n=0;mine=new Mine *m_row;for(i=0;i<m_row;i+)minei=new Mine m_col;for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)mineij.x=50+35*j;mineij.y=80+35*i;mineij.p=0;mineij.flag=0;mineij.num=0;srand(time(NULL);if(0=m_mine)return;while(1)int x=rand()%m_row;int y=rand()%m_col;if(0=minexy.p)minexy.p=1;n+;if(x-1>=0&&y-1>=0)minex-1y-1.num+;if(x-1>=0)minex-1y.num+;if(x-1>=0&&y+1<m_col)minex-1y+1.num+;if(y-1>=0)minexy-1.num+;if(y+1<m_col)minexy+1.num+;if(x+1<m_row&&y-1>=0)minex+1y-1.num+;if(x+1<m_row)minex+1y.num+;if(x+1<m_row&&y+1<m_col)minex+1y+1.num+;if(n>=m_mine)break;void CMineSweeperView:paintmine()int i=0,j=0;CDC *pDC=GetDC();for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)pDC->BitBlt(mineij.x,mineij.y,35,35,&cbj0,0,0,SRCCOPY);ReleaseDC(pDC);3.5 游戏规划模块的设计与实现 游戏规则模块的实现,主要由游戏胜利和游戏结束判断函数组成。通过对游戏的结果进行判断,实现扫雷游戏的规则。1、 游戏胜利的判断 通过遍历整个地雷数组,查找是否全部的地雷格子已经被标记或者找出来。如果已经全部被找出来或者标记出来,那么说明玩家胜利,繁殖,说明玩家未胜利,需要继续游戏。2、 游戏结束的判断当玩家打开一个格子时,就对当前格子进行判断。如果是地雷,说明玩家不行。游戏以失败结束。而如果不是地雷,就对玩家选中的格子周围的标示进行判断,如果有判断错误的格子,也说明玩家游戏失败,游戏结束。实现代码如下,void CMineSweeperView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(0=m_start|1=m_stop)return;CDC *pDC=GetDC();int i=-1,j=-1;get_ij(point,&i,&j);if(-1=i|-1=j)return;if(1=mineij.p)pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm9,0,0,SRCCOPY);m_stop=1;KillTimer(0);AfxMessageBox("对不起!n你踩到地雷了!n再来一次吧!");elseif(2=mineij.flag)m_mine+;switch(mineij.num)case 0:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm0,0,0,SRCCOPY);break;case 1:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm1,0,0,SRCCOPY);break;case 2:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm2,0,0,SRCCOPY);break;case 3:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm3,0,0,SRCCOPY);break;case 4:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm4,0,0,SRCCOPY);break;case 5:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm5,0,0,SRCCOPY);break;case 6:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm6,0,0,SRCCOPY);break;case 7:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm7,0,0,SRCCOPY);break;mineij.flag=1;ReleaseDC(pDC);CView:OnLButtonDown(nFlags, point);void CMineSweeperView:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(0=m_start|1=m_stop)return;CDC *pDC=GetDC();int i=-1,j=-1;get_ij(point,&i,&j);if(-1=i|-1=j)return;if(1=mineij.flag)return;if(0=m_mine)return;if(2=mineij.flag) pDC->BitBlt(mineij.x,mineij.y,35,35,&cbj0,0,0,SRCCOPY);else pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm10,0,0,SRCCOPY);if(m_mine>0) m_mine-;mineij.flag=2;if(0=m_mine)ifwin();ReleaseDC(pDC);CView:OnRButtonDown(nFlags, point);void CMineSweeperView:get_ij(CPoint p,int *r,int *c)int i=0,j=0;for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)if(mineij.x<p.x&&p.x<mineij.x+35)if(mineij.y<p.y&&p.y<mineij.y+35)*r=i;*c=j;return;void CMineSweeperView:ifwin()CDC *pDC=GetDC();m_stop=1;int i=0,j=0;for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)if(2=mineij.flag)if(1=mineij.p)pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm9,0,0,SRCCOPY);elseswitch(mineij.num)case 0:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm0,0,0,SRCCOPY);break;case 1:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm1,0,0,SRCCOPY);break;case 2:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm2,0,0,SRCCOPY);break;case 3:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm3,0,0,SRCCOPY);break;case 4:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm4,0,0,SRCCOPY);break;case 5:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm5,0,0,SRCCOPY);break;case 6:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm6,0,0,SRCCOPY);break;case 7:pDC->BitBlt(mineij.x,mineij.y,35,35,&cbm7,0,0,SRCCOPY);break;for(i=0;i<m_row;i+)for(j=0;j<m_col;j+)if(2=mineij.flag&&0=mineij.p)CString x,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);void CMineSweeperView:painttime()CDC *pDC=GetDC();CString s;s.Format("%d s",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);void CMineSweeperView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultswitch(nIDEvent)case 0:painttime();break;CView:OnTimer(nIDEvent);3.6游戏绘图模块的设计与实现 在扫雷游戏中,通过绘图模块实现地雷、格子、地雷个数、当前时间及控制按钮等图片和信息的提示。有以下几个函数组成。1、 绘按钮函数 绘按钮函数,主要通过在游戏中不断地得到当前游戏的状态。根据这个按钮,在按钮图片中把指定的坐标范围图片绘制到主界面上。2、 绘数字区域函数 剩余地雷个数和消耗时间的数字显示,主要通过一定的算法,得到当前地雷剩余个数和已消耗的时间。3、 绘雷区函数 绘雷函数,时通过遍历当前雷区数组,并根据当前元素所代表的类型不同,将不同的图片绘制到位置。实现代码如下,void CMineSweeperView:OnInitialUpdate() CView:OnInitialUpdate();/ TODO: Add your specialized code here and/or call the base classAfxGetApp()->m_pMainWnd->SetWindowPos(NULL,300,50,460,500,NULL);initbitmap(); / 初始化位图void CMineSweeperView:initbitmap()CDC *pDC=GetDC();bm0.LoadBitmap(IDB_0);bm1.LoadBitmap(IDB_1);bm2.LoadBitmap(IDB_2);bm3.LoadBitmap(IDB_3);bm4.LoadBitmap(IDB_4);bm5.LoadBitmap(IDB_5);bm6.LoadBitmap(IDB_6);bm7.LoadBitmap(IDB_7);bm8.LoadBitmap(IDB_8);bm9.LoadBitmap(IDB_9);bm10.LoadBitmap(IDB_10);bj.LoadBitmap(IDB_bj);bj0.LoadBitmap(IDB_bj0);bclock.LoadBitmap(IDB_clock);bmine.LoadBitmap(IDB_mine);bnum.LoadBitmap(IDB_num);cbm0.CreateCompatibleDC(pDC);cbm1.CreateCompatibleDC(pDC);cbm2.CreateCompatibleDC(pDC);cbm3.CreateCompatibleDC(pDC);cbm4.CreateCompatibleDC(pDC);cbm5.CreateCompatibleDC(pDC);cbm6.CreateCompatibleDC(pDC);cbm7.CreateCompatibleDC(pDC);cbm8.CreateCompatibleDC(pDC);cbm9.CreateCompatibleDC(pDC);cbm10.CreateCompatibleDC(pDC);cbj.CreateCompatibleDC(pDC);cbj0.CreateCompatibleDC(pDC);cclock.CreateCompatibleDC(pDC);cmine.CreateCompatibleDC(pDC);cnum.CreateCompatibleDC(pDC);cbm0.SelectObject(&bm0);cbm1.SelectObject(&bm1);cbm2.SelectObject(&bm2);

    注意事项

    本文(C--课程设计-扫雷1.doc)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开