扫雷游戏程序设计课程设计报告.doc_第1页
扫雷游戏程序设计课程设计报告.doc_第2页
扫雷游戏程序设计课程设计报告.doc_第3页
扫雷游戏程序设计课程设计报告.doc_第4页
扫雷游戏程序设计课程设计报告.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计设计题目 扫雷游戏程序设计 学生姓名 学 号 专业班级 指导教师 2013 年 11 月 5 日设计题目扫雷游戏程序设计成绩课程设计主要内容扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。参考系统自带的扫雷程序,自行开发设计一款扫雷游戏。要求:(1)鼠标左击排雷,右击插小旗,打问号; (2)方格里面的数字表示方格周围的雷数;(3)能够显示未标记雷数和游戏用时;(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; (5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。指导教师评语建议:从学生的工作态度、工作量、设计(论文)的创造性、学术性、实用性及书面表达能力等方面给出评价。签名: 200 年 月 日合肥工业大学课程设计任务书1. 设计任务 (1)鼠标左击排雷,右击插小旗,打问号; (2)方格里面的数字表示方格周围的雷数;(3)能够显示未标记雷数和游戏用时;(4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; (5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能;(6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。二. 具体设计(一)、设计思路扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。类名成员类别类型成员名描述CMyView属性intleftnum剩下雷数intleinum雷数intn定义格数intjieshu结束intrealnum真实雷数intsecondstart开始计时intm_RowCount行intm_ColCount列shortsecond计时CBitmapm_Bitmap12位图数组CBitmapm_anniu4按钮数组Leilei5050最大雷区方法afx_msg voidOnTimer(UINT nIDEvent)计时器函数afx_msg voidOnLButtonDown(UINT, CPoint)左键按下消息afx_msg voidOnStart()开始函数afx_msg voidOnLButtonUp(UINT, CPoint )左键抬起消息afx_msg voidOnRButtonDown(UINT, CPoint)右键按下消息afx_msg voidOnEasy()简单模式函数afx_msg voidOnMiddle()中等模式函数afx_msg voidOnHard()困难模式函数afx_msg intOnCreate(LPCREATESTRUCT)创建窗口函数Lei属性intweitu标志位图intshumu标志状态(二)、设计表示:(三)、实现功能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 heresecond=0;/计时secondstart=0;/1时开始计时/num=0; leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0;/初始化0for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.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 heresecond=0;/计时secondstart=0;/1时开始计时/num=0; leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0;/初始化0for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.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 heresecond=0;/计时secondstart=0;/1时开始计时/num=0; leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0;/初始化0for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;/设置80个雷doint k=rand()%m_RowCount;int l=rand()%m_ColCount;if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum); 3、 第一次点击不会扫到雷if(leiab.weitu=0|leiab.weitu=3) for(;n=0&leiab.shumu=-1;) /踩到第一个雷int aa=0;/初始化0for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;doint k=rand()%m_RowCount;int l=rand()%m_ColCount;if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum); /给方格赋值for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(int d=b-1;d=0&c=0&dm_ColCount)if(leicd.shumu=-1)leiab.shumu+;4、 鼠标右击插小旗,打问号第一次用右键单击某个区域时,该区域上插上一面小红旗,此时单击左键没有任何变化,第二次用右键单击时恢复原状。 /判断显示什么位图 /weitu=1已按下的数字区 /weitu=2显示旗 /weitu=3显示问号 for(int a=0;am_RowCount;a+) for(int b=0;bBitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=2)Dc.SelectObject(m_Bitmap9);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=3)Dc.SelectObject(m_Bitmap10);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);/结束(5) 、调试及测试经运行测试之后,程序出现的问题有:1、 第一次打开游戏时有时会出现不能计时的情况 2、胜利的表情不能正常显示(6) 、使用说明A、 鼠标左击排雷,右击插小旗,打问号; B、 方格里面的数字表示方格周围的雷数;C、 在任何情况下单击小脸可以重新开始游戏; D、 可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自 行定义雷区行数,列数和雷数的功能;E、 扫雷成功时候,游戏用时更新排行榜 (七)、运行实例鼠标左击排雷,可翻开连片空格,方格周围数字表示周围埋雷数目,右键单击一次插小红旗,双击显示问号表示雷数情况未知,同时显示剩余雷数以及游戏用时 可从预设难度等级中选择游戏难度,游戏方格数和雷数都有相应增加 初级 中级 高级触雷时现出痛苦的表情,游戏结束将雷全部排出,胜利的呐喊!(8) 、设计小结 这个短短几天的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_FILEstatic char THIS_FILE = _FILE_;#endif/ CMywqq20112074ViewIMPLEMENT_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 commandsON_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/destructionCMywqq20112074View:CMywqq20112074View()/ TODO: add construction code herefor(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;/1时开始计时 m_RowCount=25;/行数m_ColCount=16;/列数n=0;/格数 leinum=5;realnum=leinum;leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0;/初始化0for(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();/设置40个雷do/以当前秒数为产生随机算法int k=(rand()*s)%m_RowCount;int l=(rand()*s)%m_ColCount;if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum); /给方格赋值,计算雷数for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(int d=b-1;d=0&c=0&dFillRect(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;im_RowCount;i+)for(int j=0;jMoveTo(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;iim_RowCount;ii+)for(int jj=0;jjMoveTo(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(Cant create DC); /显示按钮 Dc.SelectObject(m_anniu0); pDC-BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); /判断显示什么位图 /weitu=1已按下的数字区 /weitu=2显示旗 /weitu=3显示问号 for(int a=0;am_RowCount;a+) for(int b=0;bBitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=2)Dc.SelectObject(m_Bitmap9);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=3)Dc.SelectObject(m_Bitmap10);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);/结束if(jieshu=1&leiab.shumu=-1) Dc.SelectObject(m_Bitmap11);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);Dc.SelectObject(m_anniu3);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(Cant Create Font);pDC-SelectObject(&font);CString str; if(leftnumTextOut(25,10,str);if(second10)str.Format(00%d,second);else if(secondTextOut(330,10,str);pDC-RestoreDC(nOldDC);/ CMywqq20112074View printingBOOL CMywqq20112074View:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CMywqq20112074View:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CMywqq20112074View:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CMywqq20112074View diagnostics#ifdef _DEBUGvoid CMywqq20112074View:AssertValid() constCView:AssertValid();void CMywqq20112074View:Dump(CDumpContext& dc) constCView:Dump(dc);CMywqq20112074Doc* CMywqq20112074View:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMywqq20112074Doc);return (CMywqq20112074Doc*)m_pDocument;#endif /_DEBUG/ CMywqq20112074View message handlersvoid CMywqq20112074View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default/结束,返回if(jieshu=1)return;/显示个数为0的方格leizero();/计时if(secondstart0)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(Cant create DC); /显示按下按钮 if(point.x180&point.x10&point.yBitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); if(point.x=10)&(point.x=50)&(point.yBitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); secondstart=1;int a=(point.x-10)/15;int b=(point.y-50)/15;if(leiab.weitu=0|leiab.weitu=3) for(;n=0&leiab.shumu=-1;) /踩到第一个雷int aa=0;/初始化0for(int i=0;im_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;doint k=rand()%m_RowCount;int l=rand()%m_ColCount;if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum); /给方格赋值for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(int d=b-1;d=0&c=0&dm_ColCount)if(leicd.shumu=-1)leiab.shumu+; /如果第一个不是雷接下去部分 if(leiab.shumu=-1)jieshu=1; KillTimer(1);Invalidate(); else if(leftnum=0) jieshu=2; KillTimer(1);Invalidate(); else leiab.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;am_RowCount;a+)for(int b=0;bBitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=-1)leiab.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;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&mm_ColCount)if(leinm.shumu!=-1&leinm.weitu=0)leinm.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 heresecond=0;/计时secondstart=0;/1时开始计时/num=0; leftnum=lein

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论