毕业论文基于VisualC++的扫雷游戏设计31192.doc
《毕业论文基于VisualC++的扫雷游戏设计31192.doc》由会员分享,可在线阅读,更多相关《毕业论文基于VisualC++的扫雷游戏设计31192.doc(13页珍藏版)》请在三一办公上搜索。
1、青岛理工大学琴岛学院设 计 报 告课题名称:扫雷游戏设计学 院:青岛理工大学琴岛学院专业班级:计算机科学与技术102班学 号:20100301049学 生:徐为指导教师:张秀国、宋传磊青岛理工大学琴岛学院教务处 2011年 7月8 日一、调研材料 扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但扫雷游戏在任何版本的Windows操作系统里却依然保持原貌,而且几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。 扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多算法和语言实现,如C,C+,VB,JAVA等。 以V
2、isual C+ 开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。 Visual C+是一个功能强大的可视化开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,VisualC+已成为专业程序员进行软件开发的首选工具。它不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化即成开发环境。二 、概要设计 1. 基本功能 扫 雷 游 戏游 戏 开 始游 戏 选 关游 戏 计 雷游 戏 计 时 图 1 程序基本功能 类名成员函数功能 CMy2_1View leizero( ) 显示没有雷的区域Onchuji
3、( ) 给变量m_RowCount、m_ColCount、leinum赋值并初始化游戏。 Onzhongji( ) 给变量m_RowCount、m_ColCount、leinum赋值并初始化游戏。Ongaoji( ) 给变量m_RowCount、m_ColCount、leinum赋值并初始化游戏。OnLButtonDown( ) 如果在按钮上面,则显示按钮按下位图;如果在扫雷区,先把按钮位图改为张口位图,再判断按下的是否是雷,是就结束,重画,以显示所有的雷;否则,重画相应格子以显示数字。OnRButtonDown( ) 如果是雷,按右键时,显示旗子,并减少一个剩下雷数;如果我们认为那旗子的格子
4、不是雷,按右键,显示问号,并在剩下雷数加上1。 OnLButtonUp( ) 松开左键时,显示按钮没有按下的位图;再判断,如果结束,就要显示失败的位图;如果是在按钮上松开按钮,即表示我们已经按下了重新开始的按钮,必须调用重新开始函数OnStart()。OnStart() 初始化游戏OnTimer( ) 记录游戏所用时间 表 1 类及其函数功能 三、 详细设计1.添加位图前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图!位图的ID号:按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU
5、2、IDB_ANNIU3、 IDB_ANNIU4雷区位图:14*14 ID号按下图依次为:IDB_BITMAP14。IDB_BITMAP252. 调整窗口大小 在类CMainFrame中的PreCreateWindow( )添加代码:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; /cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/;cs.cx=440;cs.cy=400; return TRUE;3. 画游戏界面
6、为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,或是执行了新的应用程序覆盖了原来的程序时,必须重画。我们调用重画函数,它都要重新执行OnDraw(CDC* pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。而开始时雷区位图是不可见的,并不影响界面的初始化。 void CMy2_1View:OnDraw(CDC* pDC)CBrush mybrush1; mybrush1.CreateSolidBrush(RGB(192,192,192); CRect myrect1(0,0,1200,800); pDC-FillRect(myrect1,&mybrus
7、h1);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-
8、LineTo(375,10);for(int i=0;im_RowCount;i+)for(int j=0;jSelectObject(myoldPen);CPen mypen2;CPen*myoldPen2;mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0);myoldPen2=pDC-SelectObject(&mypen2);for(int ii=0;iim_RowCount;ii+)for(int jj=0;jjSelectObject(myoldPen2); CDC Dc; if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMe
9、ssageBox(Cant create DC); Dc.SelectObject(m_anniu0); pDC-BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);for(int a=0;am_RowCount;a+) for(int b=0;bSaveDC();pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);CFont font; if(0=font.CreatePointFont(160,Comic Sans MS)AfxMessageBox(Cant Create Font); 画背景时,pDC-
10、FillRect(myrect1,&mybrush1);取得颜色刷并在区域CRect myrect1(0,0,1200,800)内填充该颜色;画黑框时,mybrush.CreateSolidBrush(RGB(0,0,0)黑色刷,pDC-FillRect(myrect,&mybrush)、pDC-FillRect(myrect2,&mybrush)分别取得黑色刷在不同区域涂刷,形成黑框,接着在画黑框右下两边画白线是黑框有立体感;画雷区时,左上角是白线,右下角是黑线,以显示立体感,然后在两黑框中间位置显示人物脸图按钮,接着是判断雷区显示什么位图,如果weitu=1显示已按下的数字区,如果weit
11、u=2显示旗,如果weitu=3显示问号,如果jieshu=1&leiab.shumu=-1则结束,最后是显示黑框中的数字,不够三位的数字在前面加0.4. 定义新类及添加变量和函数(1)对于雷,我们是单独定义一个类,这样有利于程序的操作。class Leipublic:int weitu;int shumu; 上述代码声明了以下变量:int weitu显示哪一个位图,int shumu相应位置相应的值(2)在类CMy2_1View中添加变量及函数:class CMy2_1View : public CViewpublic:int leftnum; int leinum; int jieshu;
12、short second;int secondstart;CBitmap m_Bitmap12;CBitmap m_anniu4;int m_RowCount;int m_ColCount;Lei lei5050;virtual CMy2_1View();void leizero();protected:/AFX_MSG(CMy2_1View)afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnRButtonDown(UINT nFlag
13、s, CPoint point);afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnStart();afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void Onchuji();afx_msg void Onzhongji();afx_msg void Ongaoji();/AFX_MSGDECLARE_MESSAGE_MAP(); 上述代码声明了以下变量及函数:int leftnum剩余雷数,int leinum雷的数目,short se
14、cond计时,int secondstart开始计时,CBitmap m_Bitmap12位图数组,CBitmap m_anniu4按扭位图数组,int m_RowCount雷区行数,int m_ColCount雷区列数,Lei lei5050最大雷区,void leizero()显示一个位置周围雷数为0的区域,void OnTimer()计时器函数,void OnLButtonDown( )鼠标按下左键函数,void OnRButtonDown( )鼠标按下右键函数,void OnLButtonUp( )鼠标左键松开函数,int OnCreate( )初始化游戏框架函数,void OnSta
15、rt( )开始化游戏函数,int OnCreate( )初始化函数。(3)由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。以下代码中CTime time=GetCurrentTime( )是获取当前时间,s=time.GetSecond( )是获取秒数,while循环是以当前秒数为产生随机算法,同时为了避免一个位置同时算两个雷,只允许当前位置不是雷时赋值为雷,接着for循环是给方格赋值,计算雷数。CMy2_1View:CMy2_
16、1View()for(int ii=0;ii16;ii+)m_Bitmapii.LoadBitmap(IDB_BITMAP14+ii);for(int jj=0;jj4;jj+)m_anniujj.LoadBitmap(IDB_ANNIU1+jj);second=0; secondstart=0; int aa=0;for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;CTime time=GetCurrentTime();int s;s=time.GetSecond();dowhil
17、e(aa!=leinum); for(int a=0;am_RowCount;a+)for(int b=0;b180&point.x10&point.y=10)&(point.x=50)&(point.yBitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);if(jieshu=1) if(point.x180&point.x10&point.y=10)&(point.x=50)&(point.y=290) int a=(point.x-10)/15;int b=(point.y-50)/15;if(leiab.weitu=0|leiab.weitu=3) leiab.w
18、eitu=2; leftnum-; else if(leiab.weitu=2)leiab.weitu=3;leftnum+;CRect rect2;CRect rect;CView:OnRButtonDown(nFlags, point); 其中Crect rect2是定义重画剩下雷数变量,然后重画剩下雷数;Crect rect是定义重画打击格子变量,然后重画打击格子。(7)运行,玩一下,你会发现当按下的是一个周围没有雷的格子是它并不会象Window里面的扫雷游戏一样显示它周围的格子雷数。怎么实现呢?添加一个如下函数,该函数可以扫描,如果是已经被按下且雷数为0,显示它周围的八个格,并重画,其
19、代码如下:void CMy2_1View:leizero()for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)if(leiij.shumu=0&leiij.weitu=1)for(int n=i-1;ni+2;n+)for(int m=j-1;m=0&n=0&m0)secondstart+;if(secondstart=20)InvalidateRect(&rect3); CView:OnTimer(nIDEvent); (9) OnStart()函数其实只是构造函数的再版,其代码如下:void CMy2_1View:OnStart()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业论文基于Visual C+的扫雷游戏设计31192 毕业论文 基于 Visual C+ 扫雷 游戏 设计 31192
链接地址:https://www.31ppt.com/p-2385372.html