1、课程设计报告常州工学院计算机信息工程学院数据结构课程设计报告题 目 扫雷游戏 年 级 2011级 专 业 计算机应用 姓名学号 薛建(10030126) 姓名学号 杨君(10030127) 指导教师 王树锋 2012年1月8日常州工学院计算机信息工程学院数据结构课程设计任 务 书设计名称 扫雷游戏 专 业 计算机 指导教师 王树锋 下达时间 11.12.10 学生姓名 薛建 学 号 10030126学生姓名 杨君 学 号 10030127一 课程设计的基本要求学会如何使用计算机程序完成扫雷游戏,包括游戏的见面,游戏的内容,游戏如何运行,游戏结果等。二 课程设计的主要内容(1)主要内容做一个N*
2、N的扫雷游戏,由N*N的小方格组成,打开一个方格会包含两种状态,一个数字和一个雷,如果你打开一个炸弹,那就失败;如果打开一个数字,该数字位于零到八的一个整数,该数字表示其所邻居方格所包含的雷数,应用该信息可以帮助你扫雷。(2)具体分工薛建:查找资料作准备,想出大体构思分多少模块,整体设计,调试运行程序。杨君:负责一些模块的设计和调试,通过随机值完成初始雷点操作,调试程序。三 课程设计的进程安排2011年1月1日之前确定自己设计的主题,查找资料作好准备工作2011年12月3日之前想好总体构思确定多少模块以备分工设计。设置好鼠标左右键的按键响应函数2012年1 月5日之前完成各模块的程序设计,将其
3、加入结构体2012年1月8日之前完成总体程序调试和游戏难度设置 2012年1月8日课程设计报告1.课程设计的内容 (1)需要处理的基本数据: 扫雷界面的长于宽,格子数目及布局,格子下隐藏的数字,格子及地雷的颜色,地雷数目,游戏计时,游戏得分等。 (2)系统的基本功能: .输出一个有好界面,便于鼠标操作。 .单击就可以揭开方块,如果揭开的是地雷,你就输掉游戏;如果揭开的是数字, 则表示在它周围的八个方块中地雷的数目。 .如果你想标记你觉得是地雷的方块,请右击它。 .如果不确定方块是数字还是雷,请右击它两次,方块上会显示“?”的标记。 .游戏区包括雷区,地雷计数器和计时器。 .当误点一个雷时,所有
4、的地雷都会显示出来。此时游戏失败,如果想继续玩,可点击上方的按钮来确定是否继续。2.课程设计的目的此次的课程设计,可以加强我们这学期对数据结构这门课程学习的巩固,也有助于加强我们的动手能力,同时也锻炼了我们针对具体设计题和要求,分析功能要求,划分功能模块,实现信息和数据处理的本领。本课题是做一个N*N的扫雷游戏,其中包括扫雷的雷数记数和时间记数,以及游戏的运行,通过这个课题,我们进一步加强本学期的算法的了解以及运用。3.游戏运行说明和设计原理 游戏运行说明:扫雷是单人计算机游戏,游戏的用户界面是由大量的小方格组成。进入游戏时有3种难度选择:简单的是10*10的方格,有10个雷;中等的是20*2
5、0的方格,有20个雷;困难的是30*30的方格,有25个雷,进入游戏时先选择难度。当游戏开始时,计算机将固定的雷数随机的投放到这些方格中,用鼠标左键单击方格,可以找出有雷区和无雷区,并通过数字计算判断这个方格的周围8个方格里面是否有累。 设计原理:数字“1”表示这个方格周围有1个地雷,数字“2”表示这个方格周围有2个地雷,就是用这个类推来判定周围是否有雷。4.详细设计步骤和方法等 I初始化雷点: 用时间函数产生一对随机值; 将随机值与已产生的随机值进行比较,若有重复则重新产生随机值; 重复操作,知道产生足够的不同随机值; 将产生的随机值对应到主数组中; 遍历主数组中的所有数,分别计算出每个点的
6、相邻地雷数; void Game:Initial_dilei() int i,j,x,y,b2MAX_SIZE,n=0; srand(time(0); for(i=0;i2;i+) for(j=0;jMAX_SIZE;j+) bij=0; for(i=0;id;) x=rand()%lw; y=rand()%lw; for(j=0;ji;j+) if(b0j=x&b1j=y)/重复雷坐标 break; if(j=i) b0i=x; b1i=y; i+; for(j=0;jd;j+) x=b0j; y=b1j; pointboardxy.num=-1; for(i=0;ilw;i+,n=0) f
7、or(j=0;j=0) if(pointboardi-1j.num!=-1) pointboardi-1j.num+; if(j-1=0) if(pointboardij-1.num!=-1) pointboardij-1.num+; if(i-1=0&j-1=0) if(pointboardi-1j-1.num!=-1) pointboardi-1j-1.num+; if(i+1lw&j+1lw) if(pointboardi+1j+1.num!=-1) pointboardi+1j+1.num+; if(i+1lw) if(pointboardi+1j.num!=-1) pointboar
8、di+1j.num+; if(j+1lw) if(pointboardij+1.num!=-1) pointboardij+1.num+; if(i+1=0) if(pointboardi+1j-1.num!=-1) pointboardi+1j-1.num+; if(i-1=0&j+1FillRect(&rect,&back); CPen* pOldPen=NULL; if(m_pen.GetSafeHandle() m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID,1,RGB(0,0,0); pOldPen=pDC-SelectObject(&m
9、_pen); int i,j; CPoint pos; for(i=0;iMoveTo(pos); pos.y=TOPDIS+(m_game.lw)*WIDTH; pDC-LineTo(pos); for(i=0;iMoveTo(pos); pos.x=LEFTDIS+(m_game.lw)*WIDTH; pDC-LineTo(pos); pDC-SelectObject(&pOldPen); if(!m_font1.GetSafeHandle() m_font1.CreatePointFont(250,黑体,pDC); if(!m_pen2.GetSafeHandle() m_pen2.Cr
10、eatePen(PS_SOLID,3,RGB(0,0,255); CBrush whitebrush(RGB(255,255,255); CBrush redbrush(RGB(255,0,0); CBrush greenbrush(RGB(0,255,0); CRect rect1; for(i=0;im_game.lw;i+) for(j=0;jFillRect(rect1,&whitebrush); if(m_game.pointboardij.num=-1) pDC-FillRect(rect1,&redbrush); if(m_game.pointboardij.num=1) pDC
11、-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,1); if(m_game.pointboardij.num=2) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,2); if(m_game.pointboardij.num=3) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,3); if(m_game.pointboardij.num=4) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,4); i
12、f(m_game.pointboardij.num=5) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,5); if(m_game.pointboardij.num=6) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,6); if(m_game.pointboardij.num=7) pDC-TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,7); if(m_game.pointboardij.num=8) pDC-TextOut(rect1.left
13、+WIDTH/3,rect1.top+WIDTH/5,8); else if(m_game.pointboardij.flag=2) rect1.left=LEFTDIS+WIDTH*j+1; rect1.right=LEFTDIS+WIDTH*(j+1); rect1.top=TOPDIS+WIDTH*i+1; rect1.bottom=TOPDIS+WIDTH*(i+1); pDC-FillRect(rect1,&greenbrush); if(m_game.IsWin() m_game.GameOver(); m_game.Clear(); Invalidate(FALSE); if(m
14、_game.IsLose() m_game.GameOver(); m_game.Clear(); Invalidate(FALSE); III左键响应:根据系统传入的鼠标左击坐标计算出对应的格子;如果确定不是雷就打开;若此格子中的数字为零则调用递归算法打开相邻的零格子;void CText1View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(point.x-LEFTDIS)%WIDTH=0|(point.x-TOPDIS)
15、%WIDTH=0) return; if(m_pos1=(point.x-LEFTDIS)/WIDTH)=m_game.lw)/y 绘图坐标中的x return; if(m_pos0=(point.y-TOPDIS)/WIDTH)=m_game.lw)/x 绘图坐标中的y return; if(m_game.pointboardm_pos0m_pos1.flag=2) return; if(m_game.pointboardm_pos0m_pos1.num!=0) m_game.pointboardm_pos0m_pos1.flag=1; else OpenZero(m_pos0,m_pos1
16、); Invalidate(FALSE); CView:OnLButtonDown(nFlags, point);递归算法:void CText1View:OpenZero(int i,int j) if(i=-1|j=-1|i=m_game.lw|j=m_game.lw) return; if(m_game.pointboardij.num!=0) if(m_game.pointboardij.num=-1) return; else m_game.pointboardij.flag=1; m_game.pointboardij.sign=1; if(m_game.pointboardij.
17、flag!=0) return; if(m_game.pointboardij.sign!=0) return; m_game.pointboardij.flag=1; m_game.pointboardij.sign=1; OpenZero(i-1,j-1); OpenZero(i-1,j); OpenZero(i-1,j+1); OpenZero(i,j-1); OpenZero(i,j+1); OpenZero(i+1,j-1); OpenZero(i+1,j); OpenZero(i+1,j+1);IV右键响应:根据系统传入的鼠标右击坐标计算出对应的格子;若为可操作格子则加标记;voi
18、d CText1View:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(point.x-LEFTDIS)%WIDTH=0|(point.x-TOPDIS)%WIDTH=0) return;if(m_pos1=(point.x-LEFTDIS)/WIDTH)=m_game.lw)/y绘图坐标中的x return;if(m_pos0=(point.y-TOPDIS)/WIDTH)=m_game.lw)/x 绘图坐标中的y retur
19、n; if(m_game.pointboardm_pos0m_pos1.flag=0) m_game.pointboardm_pos0m_pos1.flag=2; else if(m_game.pointboardm_pos0m_pos1.flag=2) m_game.pointboardm_pos0m_pos1.flag=0; Invalidate(FALSE); CView:OnLButtonDown(nFlags, point); CView:OnRButtonDown(nFlags, point);V菜单选择难度:void CText1View:OnMenuEasy() / TODO:
20、 Add your command handler code here m_game.lw=10; m_game.Clear(); Invalidate(TRUE);void CText1View:OnMenuNormal() / TODO: Add your command handler code here WIDTH=27; m_game.lw=20; m_game.d=40; m_game.Clear(); Invalidate(TRUE);void CText1View:OnMenuHard() / TODO: Add your command handler code here W
21、IDTH=25; m_game.lw=25; m_game.d=50; m_game.Clear(); Invalidate(TRUE);4.调式及心得体会 课程设计中出现不少问题:1在设计过程中会出现鼠标不显示的现象,原因在于鼠标图形没有初始化2也有出现鼠标不响应操作的现象,这是在定义鼠标响应函数时出了问题3在程序代码编写完成运行的时候总是提示运行不了,可是却找不到语句和定义的错误,经过多方调试,再次编译,错误消失,运行出来 游戏调试运行的胜利和失败图如下:失败:胜利:心得体会:通过这次的课程设计,我认识到了程序的复杂性,同时一些不懂的地方也得到了理解,加强自己的动手能力,也让我对数据结构这
22、门课程有了更深刻的认识。5.课程总结 通过函数对每个功能模块化,次程序能达到课程设计的基本要求。要学会功能分块,便于阅读以及寻找错误,更节约内存,在程序设计过程要注意语句的选择,使程序尽量高效的运行。数据结构课程设计考核评估标准通过程序设计及答辩方式,并结合学生的动手能力(编程及调试程序能力)、独立分析解决问题的能力、创新精神、总结报告、答辩水平、学习态度以及题目难易程度综合考评,成绩分优、良、中、及格和不及格五等。课程设计的量化评分成绩见表(1)数据结构课程设计量化评分标准(每人一页) 学生姓名: XXXX 学生学号 XXXX 指标最高分评分要素评分设计技术水平20程序运行情况良好,结构设计
23、合理,算法说明清晰,理论分析与计算正确,实验数据无误,通用性和可扩充性强实际动手能力20独立完成设计,能够迅速准确的进行调试和纠错 研究成果与专业知识10对研究的问题能较深刻分析或者有独到见解,很好地掌握了有关基础理论与专业知识,总结报告认识深刻写作与总结提炼能力10报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出, 文献综述10有较完善的文献综述,能够正确查阅参考文献资料规范化程度10提交的电子文档及打印文档的书写、存放完全符合规范化要求答辩情况10能简明扼要地阐述设计的主要内容,能准确流利地回答各种问题学习态度10端正的学习态度及认真刻苦程度等总 分 指导教师: 200X年 XX月XX日 注意: 1 本评分标准适用于数据结构课程设计;2 总分满分为100分,成绩参考标准为:优秀(100X90);良好(90X80);中等(80X70);及格(70X60);不及格(X60);3 发现有拷贝舞弊现象者,一律直接退回不作检查,两次舞弊者按不及格处理。4 每组学生至少要回答三个以上的问题,有两个以上问题回答不清楚者,一律不及格。5 课程设计报告不交或不规范者一律不及格。