课程设计报告.docx
- 文档编号:5285647
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:17
- 大小:50KB
课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。
课程设计报告
常州工学院
计算机信息工程学院
《数据结构》课程设计报告
题目扫雷游戏
年级2011级
专业计算机应用
姓名学号薛建(10030126)
姓名学号杨君(10030127)
指导教师王树锋
2012年1月8日
常州工学院计算机信息工程学院
《数据结构》课程设计
任务书
设计名称扫雷游戏专业计算机
指导教师王树锋下达时间11.12.10
学生姓名薛建学号10030126
学生姓名杨君学号10030127
一课程设计的基本要求
学会如何使用计算机程序完成扫雷游戏,包括游戏的见面,游戏的内容,游戏如何运行,游戏结果等。
二课程设计的主要内容
(1)主要内容
做一个N*N的扫雷游戏,由N*N的小方格组成,打开一个方格会包含两种状态,一个数字和一个雷,如果你打开一个炸弹,那就失败;如果打开一个数字,该数字位于零到八的一个整数,该数字表示其所邻居方格所包含的雷数,应用该信息可以帮助你扫雷。
(2)具体分工
薛建:
查找资料作准备,想出大体构思分多少模块,整体设计,调试运行程序。
杨君:
负责一些模块的设计和调试,通过随机值完成初始雷点操作,调试程序。
三课程设计的进程安排
2011年1月1日之前
确定自己设计的主题,查找资料作好准备工作
2011年12月3日之前
想好总体构思确定多少模块以备分工设计。
设置好鼠标左右键的按键响应函数
2012年1月5日之前
完成各模块的程序设计,将其加入结构体
2012年1月8日之前
完成总体程序调试和游戏难度设置
2012年1月8日
课程设计报告
1.课程设计的内容
(1)需要处理的基本数据:
扫雷界面的长于宽,格子数目及布局,格子下隐藏的数字,格子及地雷的颜色,地雷数目,游戏计时,游戏得分等。
(2)系统的基本功能:
.输出一个有好界面,便于鼠标操作。
.单击就可以揭开方块,如果揭开的是地雷,你就输掉游戏;如果揭开的是数字,则表示在它周围的八个方块中地雷的数目。
.如果你想标记你觉得是地雷的方块,请右击它。
.如果不确定方块是数字还是雷,请右击它两次,方块上会显示“?
”的标记。
.游戏区包括雷区,地雷计数器和计时器。
.当误点一个雷时,所有的地雷都会显示出来。
此时游戏失败,如果想继续玩,可点击上方的按钮来确定是否继续。
2.课程设计的目的
此次的课程设计,可以加强我们这学期对数据结构这门课程学习的巩固,也有助于加强我们的动手能力,同时也锻炼了我们针对具体设计题和要求,分析功能要求,划分功能模块,实现信息和数据处理的本领。
本课题是做一个N*N的扫雷游戏,其中包括扫雷的雷数记数和时间记数,以及游戏的运行,通过这个课题,我们进一步加强本学期的算法的了解以及运用。
3.游戏运行说明和设计原理
游戏运行说明:
扫雷是单人计算机游戏,游戏的用户界面是由大量的小方格组成。
进入游戏时有3种难度选择:
简单的是10*10的方格,有10个雷;中等的是20*20的方格,有20个雷;困难的是30*30的方格,有25个雷,进入游戏时先选择难度。
当游戏开始时,计算机将固定的雷数随机的投放到这些方格中,用鼠标左键单击方格,可以找出有雷区和无雷区,并通过数字计算判断这个方格的周围8个方格里面是否有累。
设计原理:
数字“1”表示这个方格周围有1个地雷,数字“2”表示这个方格周围有2个地雷,就是用这个类推来判定周围是否有雷。
4.详细设计步骤和方法等
I.初始化雷点:
①用时间函数产生一对随机值;
②将随机值与已产生的随机值进行比较,若有重复则重新产生随机值;
③重复①②操作,知道产生足够的不同随机值;
④将产生的随机值对应到主数组中;
⑤遍历主数组中的所有数,分别计算出每个点的相邻地雷数;
voidGame:
:
Initial_dilei(){
inti,j,x,y,b[2][MAX_SIZE],n=0;
srand(time(0));
for(i=0;i<2;i++)
for(j=0;j b[i][j]=0; for(i=0;i x=rand()%lw; y=rand()%lw; for(j=0;j if(b[0][j]==x&&b[1][j]==y)//重复雷坐标 break; if(j==i){ b[0][i]=x; b[1][i]=y; i++; } } for(j=0;j x=b[0][j]; y=b[1][j]; pointboard[x][y].num=-1; } for(i=0;i for(j=0;j if(pointboard[i][j].num==-1){ if(i-1>=0) if(pointboard[i-1][j].num! =-1) pointboard[i-1][j].num++; if(j-1>=0) if(pointboard[i][j-1].num! =-1) pointboard[i][j-1].num++; if(i-1>=0&&j-1>=0) if(pointboard[i-1][j-1].num! =-1) pointboard[i-1][j-1].num++; if(i+1 if(pointboard[i+1][j+1].num! =-1) pointboard[i+1][j+1].num++; if(i+1 if(pointboard[i+1][j].num! =-1) pointboard[i+1][j].num++; if(j+1 if(pointboard[i][j+1].num! =-1) pointboard[i][j+1].num++; if(i+1 if(pointboard[i+1][j-1].num! =-1) pointboard[i+1][j-1].num++; if(i-1>=0&&j+1 if(pointboard[i-1][j+1].num! =-1) pointboard[i-1][j+1].num++; } } } } II.根据结构体数组重绘图形,并判断输赢: ①给固定区域涂上颜色并打上边框; ②根据主数组覆盖各个格子,数字或者红色背景(炸弹)或者绿色背景(标记); ③判断输赢(有一个地雷被打开则输,所有地雷点被标记为绿色则赢); voidCText1View: : OnDraw(CDC*pDC){ CText1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO: adddrawcodefornativedatahere CBrushback(RGB(216,216,203)); CRectrect; rect.left=LEFTDIS; rect.right=LEFTDIS+(m_game.lw)*WIDTH; rect.top=TOPDIS; rect.bottom=TOPDIS+(m_game.lw)*WIDTH; pDC->FillRect(&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_pen); inti,j; CPointpos; for(i=0;i<=m_game.lw;i++)//竖直的线{ pos.x=LEFTDIS+WIDTH*i; pos.y=TOPDIS; pDC->MoveTo(pos); pos.y=TOPDIS+(m_game.lw)*WIDTH; pDC->LineTo(pos); } for(i=0;i<=m_game.lw;i++)//水平的线 { pos.x=LEFTDIS; pos.y=TOPDIS+WIDTH*i; pDC->MoveTo(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.CreatePen(PS_SOLID,3,RGB(0,0,255)); CBrushwhitebrush(RGB(255,255,255)); CBrushredbrush(RGB(255,0,0)); CBrushgreenbrush(RGB(0,255,0)); CRectrect1; for(i=0;i for(j=0;j if(m_game.pointboard[i][j].flag==1){ 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,&whitebrush); if(m_game.pointboard[i][j].num==-1) pDC->FillRect(rect1,&redbrush); if(m_game.pointboard[i][j].num==1) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"1"); if(m_game.pointboard[i][j].num==2) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"2"); if(m_game.pointboard[i][j].num==3) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"3"); if(m_game.pointboard[i][j].num==4) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"4"); if(m_game.pointboard[i][j].num==5) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"5");if(m_game.pointboard[i][j].num==6) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"6"); if(m_game.pointboard[i][j].num==7) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"7"); if(m_game.pointboard[i][j].num==8) pDC->TextOut(rect1.left+WIDTH/3,rect1.top+WIDTH/5,"8");} else if(m_game.pointboard[i][j].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_game.IsLose()){ m_game.GameOver(); m_game.Clear(); Invalidate(FALSE); } } III.左键响应: ①根据系统传入的鼠标左击坐标计算出对应的格子; ②如果确定不是雷就打开; ③若此格子中的数字为零则调用递归算法打开相邻的零格子; voidCText1View: : OnLButtonDown(UINTnFlags,CPointpoint){ //TODO: Addyourmessagehandlercodehereand/orcalldefault if((point.x-LEFTDIS)%WIDTH==0||(point.x-TOPDIS)%WIDTH==0) return; if((m_pos[1]=(point.x-LEFTDIS)/WIDTH)>=m_game.lw)//y绘图坐标中的x return; if((m_pos[0]=(point.y-TOPDIS)/WIDTH)>=m_game.lw)//x绘图坐标中的y return; if(m_game.pointboard[m_pos[0]][m_pos[1]].flag==2) return; if(m_game.pointboard[m_pos[0]][m_pos[1]].num! =0) m_game.pointboard[m_pos[0]][m_pos[1]].flag=1; else OpenZero(m_pos[0],m_pos[1]); Invalidate(FALSE); CView: : OnLButtonDown(nFlags,point); } 递归算法: voidCText1View: : OpenZero(inti,intj){ if(i==-1||j==-1||i==m_game.lw||j==m_game.lw) return; if(m_game.pointboard[i][j].num! =0) if(m_game.pointboard[i][j].num==-1) return; else{ m_game.pointboard[i][j].flag=1; m_game.pointboard[i][j].sign=1; } if(m_game.pointboard[i][j].flag! =0) return; if(m_game.pointboard[i][j].sign! =0) return; m_game.pointboard[i][j].flag=1; m_game.pointboard[i][j].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.右键响应: ①根据系统传入的鼠标右击坐标计算出对应的格子; ②若为可操作格子则加标记; voidCText1View: : OnRButtonDown(UINTnFlags,CPointpoint){ //TODO: Addyourmessagehandlercodehereand/orcalldefault if((point.x-LEFTDIS)%WIDTH==0||(point.x-TOPDIS)%WIDTH==0) return; if((m_pos[1]=(point.x-LEFTDIS)/WIDTH)>=m_game.lw)//y绘图坐标中的x return; if((m_pos[0]=(point.y-TOPDIS)/WIDTH)>=m_game.lw)//x绘图坐标中的y return; if(m_game.pointboard[m_pos[0]][m_pos[1]].flag==0) m_game.pointboard[m_pos[0]][m_pos[1]].flag=2; else if(m_game.pointboard[m_pos[0]][m_pos[1]].flag==2) m_game.pointboard[m_pos[0]][m_pos[1]].flag=0; Invalidate(FALSE); CView: : OnLButtonDown(nFlags,point); CView: : OnRButtonDown(nFlags,point); } V.菜单选择难度: voidCText1View: : OnMenuEasy() { //TODO: Addyourcommandhandlercodehere m_game.lw=10; m_game.Clear(); Invalidate(TRUE); } voidCText1View: : OnMenuNormal() { //TODO: Addyourcommandhandlercodehere WIDTH=27; m_game.lw=20; m_game.d=40; m_game.Clear(); Invalidate(TRUE); } voidCText1View: : OnMenuHard() { //TODO: Addyourcommandhandlercodehere WIDTH=25; m_game.lw=25; m_game.d=50; m_game.Clear(); Invalidate(TRUE); } 4.调式及心得体会 课程设计中出现不少问题: 1.在设计过程中会出现鼠标不显示的现象,原因在于鼠标图形没有初始化 2.也有出现鼠标不响应操作的现象,这是在定义鼠标响应函数时出了问题 3.在程序代码编写完成运行的时候总是提示运行不了,可是却找不到语句和定义的错误,经过多方调试,再次编译,错误消失,运行出来 游戏调试运行的胜利和失败图如下: 失败: 胜利: 心得体会: 通过这次的课程设计,我认识到了程序的复杂性,同时一些不懂的地方也得到了理解,加强自己的动手能力,也让我对数据结构这门课程有了更深刻的认识。 5.课程总结 通过函数对每个功能模块化,次程序能达到课程设计的基本要求。 要学会功能分块,便于阅读以及寻找错误,更节约内存,在程序设计过程要注意语句的选择,使程序尽量高效的运行。 《数据结构》课程设计考核评估标准 通过程序设计及答辩方式,并结合学生的动手能力(编程及调试程序能力)、独立分析解决问题的能力、创新精神、总结报告、答辩水平、学习态度以及题目难易程度综合考评,成绩分优、良、中、及格和不及格五等。 课程设计的量化评分成绩见表 (1) 《数据结构》课程设计量化评分标准(每人一页) 学生姓名: XXXX学生学号XXXX 指标 最高分 评分要素 评分 设计技术水平 20 程序运行情况良好,结构设计合理,算法说明清晰,理论分析与计算正确,实验数据无误,通用性和可扩充性强 实际动手能力 20 独立完成设计,能够迅速准确的进行调试和纠错 研究成果与专业知识 10 对研究的问题能较深刻分析或者有独到见解,很好地掌握了有关基础理论与专业知识,总结报告认识深刻 写作与总结提炼能力 10 报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出, 文献综述 10 有较完善的文献综述,能够正确查阅参考文献资料 规范化程度 10 提交的电子文档及打印文档的书写、存放完全符合规范化要求 答辩情况 10 能简明扼要地阐述设计的主要内容,能准确流利地回答各种问题 学习态度 10 端正的学习态度及认真刻苦程度等 总分 指导教师: 200X年XX月XX日 注意: 1本评分标准适用于数据结构课程设计; 2总分满分为100分,成绩参考标准为: 优秀(100>X≥90);良好(90>X≥80);中等(80>X≥70);及格(70>X≥60);不及格(X<60); 3发现有拷贝舞弊现象者,一律直接退回不作检查,两次舞弊者按不及格处理。 4每组学生至少要回答三个以上的问题,有两个以上问题回答不清楚者,一律不及格。 5课程设计报告不交或不规范者一律不及格。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告