1、学 号: 0120810680326课 程 设 计题 目 扫雷游戏学 院 计算机学院专 业 软件工程班 级 0803 班姓 名 徐泽前指导教师2010 年 7 月 15 日扫雷游戏1 规则描述游戏开始后,系统会在雷区的小方块中随机布下若干个地雷。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的 8 个方块中雷方块的数量,玩家可以根据这些信息去半段时候可以打开某些方块,并把认为是地雷的方块打上标记,当玩家吧所有地雷找出来后,其余非雷方块区域都已打开,这时游戏结束。在游戏过程中一旦错误的打开了雷方块则立即失败,游戏结束;当玩家标识的地雷数量超过程序设定,虽然打开了全部其
2、余方块,游戏仍不会结束。2 软件环境Windows XPMicrosoft Visual C+3 功能需求分析游戏需要提供两个计数器,一个用来显示用户扫雷所花费的时间,以秒为单位;一个用来显示当前还剩多少个雷方块。另外提供一个按钮,用来开始游戏。在游戏区域方面,按功能将它分成两大区域:雷区和提示区。提示区除了上面提供的计数器外,还包括两个按钮,一个用来开始游戏,一个用来显示版本信息。游戏过程中,当玩家用鼠标点击相应的方块,程序就会做出相应的鼠标响应时间,程序处理这些鼠标时间的过程中会伴随着 GDI 绘图,而众多鼠标事件的处理,都是围绕着实现扫雷程序的算法而衍生的。4 程序实现4.1 界面设计图
3、 1 界面设计图4.2 具体实现4.21 布雷随机获取一个状态为非雷的点,将它的属性标识为雷,重复这样的工作,直到布下足够的累为止,流程图如下开始生成随机的累方块的坐标判断 ( x . y ) 区域是否已经布下雷在 ( x , y ) 区域布雷 , 修改状态数据否是判断是布下所有雷否结束是在 CMineWind 类中添加游戏的布雷模块的处理函数,该函数的具体实现如下所示:Void CMineWnd:LayMines(UINIT row, UINT col )Srand (unsigned)time(NULL);UINT i, j;for(UNIT index = 0; index m_IsSh
4、ow = TRUE;if(grid-m_State = ncMINE)ShowAllMine();Invalidate();KillTimer(1);MessageBox(“你输了,请再接再厉!“);if(MessageBox(“是否继续新游戏?“,“ 系统提示“,MB_YESNO | MB_ICONQUESTION) = IDYES)OnButstart();elseOnCancel();else if(grid-m_State = ncNULL)DownNullShow(grid);Invalidate();CDialog:OnLButtonDown(nFlags, point);Void
5、 CSweepmineDlg : OnLButtonDblClk (UINT nFlags, CPoint point) /双击事件,进行拓展GRID* grid = GetLikeGrid(point); if(grid != NULL)int num = IsNumber (grid - m_State);if(num != 9)grid-m_IsShow = TRUE;DblClkNum(grid,num);Invalidate();CDialog : OnLButtonDblClk ( nFlags , point);鼠标右击事件:鼠标右击事件雷方块定位雷判断历史属性以及相关状态修改相
6、关状态显示结束void CSweepmineDlg:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultGRID* grid = GetLikeGrid(point); if(grid != NULL)if(m_Flag = 70)MessageBox(“标记已用完!“);return;if(grid-m_State=ncFLAG)for(int i=0;im_Rect)grid-m_State = m_FlagStatei;m_FlagSt
7、atei = ncUNDOWN;m_FlagRecti = 0;grid-m_IsShow = FALSE;m_Flag-;CString str;str.Format(“剩余地雷数:%d“,70-m_Flag);m_Number.SetWindowText(str);elseif(grid-m_IsShow = FALSE)m_FlagRectm_Flag = grid-m_Rect;m_FlagStatem_Flag+ = grid-m_State;CString str;str.Format(“剩余地雷数:%d“,70-m_Flag);m_Number.SetWindowText(str
8、);grid-m_State = ncFLAG;grid-m_IsShow = TRUE;if(IsWin()KillTimer(1);MessageBox(“你赢了“);if(MessageBox(“是否继续新游戏?“,“系统提示“,MB_YESNO | MB_ICONQUESTION) = IDYES)OnButstart();elseOnCancel();Invalidate();CDialog:OnRButtonDown(nFlags, point);关键技术:在设计扫雷游戏时,现在对话框中绘制软件的背景位图,绘制的位图是以一个网格为单位的,然后在网格中随机布雷,并通过算法计算无雷网格
9、中应该显示的数据。如果当前网格周围的 8 个网格中没有地雷,则显示为空地,否则,周围的 8 个网格中有几个地雷则显示数字几,当用户翻开空地时,会自动翻开空地周围的数字,通过鼠标右键可以标记地雷,并可以取消地雷标记,用户胜利的条件是将所有得嘞都标记出来。如果标记的地雷为止都是地雷的位置则游戏胜利,标记数和地雷数是相同的,所以当标记用完而游戏还没有结束时,说明标记的地雷有错误,这样扫雷游戏结束5 程序运行结果程序运行结果如图6 总结体会不足在课程设计的这段日子里,发现自己有很多的知识还没有掌握好,最先的时候,学习的都是一些基本的理论知识,觉得个人掌握的还是很好的。应用后才发现缺点和不足。 在课程设
10、计中间,出了很多错误,不是把引用弄错了,就是把代码写错地方了。有时候,往往把写在数据层的代码,写到了逻辑层。而在接口层的时候,却发现在其他地方没有定义。点击运行的时候,错误一大片。最后,只有重新开始,最后发现调用函数可以让程序层次清晰很多。C这么语言,是目前世界上非常流行的语言之一。而我学习的只是处在一个入门的位置上。我们需要在今后发更多的时间去了解这门功能强大的语言,之所以应用 c#,也是让自己接触更多的编程语言。学习并应用它。让自己有更大的提高。 通过课程设计我发现编程能力要提高,方法很多,最重要的就是练习,可以认真学习教材上面的例题,最后把上面的代码自己写一遍,看看运行的结果和教材给出的
11、结果是否一致。要学会看代码,最好的方法就是看设计器中的代码。通过实践找出一个很好的方法去调试程序,寻找并改正程序中错误。参考文献1karli Watson,hristian Nagel 编 C#入门经典(第四版)清华大学出版社 2008.122王小科、吕双 编 C#从入门到精通 清华大学出版社 2008.93 宋学江、赵兰 编 C#轻松入门 人民邮电出版社 2009。4本科生课程设计成绩评定表班级:软件工程 0703 姓名: 戚思敏 学号:0120710680304序号 评分项目 满分 实得分1 学习态度认真、遵守纪律 102 设计分析合理性 103设计方案正确性、可行性、创造性204 设计结果正确性 405 设计报告的规范性 106 设计验收 10总得分/等级评语:注:最终成绩以五级分制记。优(90-100 分) 、良(80-89 分) 、中(70-79 分) 、及格(60-69 分) 、60 分以下为不及格指导教师签名:2010 年 月 日