C语言程序设计课程设计(论文)-扫地雷游戏1.doc_第1页
C语言程序设计课程设计(论文)-扫地雷游戏1.doc_第2页
C语言程序设计课程设计(论文)-扫地雷游戏1.doc_第3页
C语言程序设计课程设计(论文)-扫地雷游戏1.doc_第4页
C语言程序设计课程设计(论文)-扫地雷游戏1.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

辽 宁 工 业 大 学 c语言程序设计 课程设计(论文)题目: 扫地雷游戏 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 起止时间: 2009.12.14至2009.12.26 课程设计(报告)任务及评语院(系): 教研室:学 号学生姓名专业班级程序设计(报告)题目扫地雷游戏程序设计(报告)任务程序设计的任务与要求:(1)掌握c语言编程的基础知识。(2)较熟练地编写c语言应用程序。(3)了解c语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2009 年 12 月 31 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1程序功能介绍22.2程序整体设计说明22.2.1设计思路22.2.2数据结构设计及用法说明32.2.3程序结构42.2.4各模块的功能及程序说明42.2.5程序结果52.3程序源代码及注释5第3章 课程设计总结14参考资料15第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言(c)课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对c语言课程的基本知识的理解和掌握 2. 掌握c语言编程和程序调试的基本技能 3. 利用c语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用c语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行windows 2000/xp操作系统的微机系统。c语言程序设计及相应的开发环境。1.3 课程设计的预备知识熟悉c语言及c语言开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍扫地雷是一个广泛游戏,扫雷的游戏规则:扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。当鼠标点击到棋盘范围外时,视为无效,无响应。游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;如果其周围还有空白格,则会引发连锁反应;在你认为有雷的格子上,点击右键即可标记雷;如果一个已打开格子周围所有的雷已经正确标出,则可以在此格上同时点击鼠标左右键打开其周围剩余的无雷格。扫雷可以充分锻炼你的逻辑思维能力、抽象思维能力、想象力、判断力、反应速度。2.2程序整体设计说明2.2.1设计思路首先我们在雷区上随机地放上雷,没有雷的地方被点击后就会显示一个数字表示它周围有几个雷,这是怎么实现的呢?我们可以把整个雷区看成一个二维数组ai,j,如雷区: 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 我要知道a34周围有几个雷,就只有去检测 a23,a24,a25 a33, a35 a43,a44,a45 这8个雷区是否放上了雷,仔细观察它们成在数学关系。 抽象出来就是:ai,j的雷的个数就是由 ai-1,j-1,ai-1,j,ai-1,j+1 a i ,j-1, a i ,j+1 ai+1,j-1,ai+1,j,ai+1,j+1 (如果超出边界再加以判断) 这样的8个雷区决定的。扫雷程序还会自动展开已确定没有雷的雷区。如果a3,4周围雷数为1,a2,3已被标示为地雷,那么 a24,a25,a33,a35,a43,a44,a45 将被展开,一直波及到不可确定的雷区。这也是实现的关键。我们可以把数组的元素设定为一个类对象,它们所属的类设定这样的一个事件:在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。相信在了解以上两个要点后,把雷区这个类编写完全(如添加是否有雷标记,是否展开标记,周围雷数等,双击,左右单击的鼠标事件等),实现扫雷程序应是十分简单的一件事。2.2.2数据结构设计及用法说明 void close(void) 图形关闭void control(void) 游戏开始,重新,关闭void drawempty(int i,int j,int mode,int color) 两种空格子的显示void drawredflag(int i,int j) 显示红旗void drawsmile(void) 画笑脸void gamebegain(void) 游戏开始画面void gameover(void) 游戏结束画面void gameplay(void) 游戏过程void gamewin(void) 显示胜利void init(void) 图形开始int leftpress(void) 鼠标左键按下int minestatistics(int i,int j) 统计每个格子周围的雷数void mousegetxy(void) 得到当前位置void mouseoff(void) 鼠标光标隐藏void mouseon(void) 鼠标光标显示void mousesetxy(int x,int y) 设置当前位置int rightpress(void) 鼠标右键按下int showwhite(int i,int j) 显示无雷区的空白部分2.2.3程序结构图2.1 扫地雷游戏流程图2.2.4各模块的功能及程序说明(1)void control(void):该模块是控制程序的框架,决定是否初始化游戏画面并执行游戏过程,以及是否重新开始游戏或退出。(2)void gamebegain(void):该模块用以初始化游戏画面,调用画图模块、画格子模块等,完成显示笑脸图标、描绘方格棋盘、初始化鼠标位置等任务。(3)void gameplay(void):该模块完成游戏的主过程,调用递归显示算法,标示红旗,判断失败等任务。(4)int minestatistics(int i,int j):以单元格的坐标为参数,返回单元格周围的雷的数目。(5)int showwhite(int i,int j):参数是所点击方格的坐标,如果点击的方格周围没有雷,则调用该模块。它会显示周围雷的数目,如果周围仍没有则递归调用,直到周围不再有空白格。2.2.5程序结果游戏初期初始化图像如图2.2所示: 图 2 .2 游戏初期初始化图像2.3程序源代码及注释#include #include #include #define leftpress 0xff01 #define leftclick 0xff10 #define leftdrag 0xff19 #define mousemove 0xff08 int num1010;/*范围*/ int p1010;/*统计雷的数组*/ int loop;/*重新来的标志*/ int again=0;/*是否重来的变量*/ int scorenum;/*一开始统计有几个雷*/ char score3;/*输出一共有几个地雷*/ int keystate; int mouseexist; int mousebutton; int mousex; int mousey; /*鼠标光标形状定义*/ typedef struct unsigned int shape32; char hotx; char hoty; shape; /*箭头型*/ shape arrow= 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff, 0x30ff,0xf87f,0xf87f,0xfc3f, 0x0000,0x7c00,0x6000,0x7000, 0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7e00,0x7c00,0x4600, 0x0600,0x0300,0x0300,0x0180 , 0,0, ; /*鼠标光标显示*/ void mouseon() _ax=0x01; geninterrupt(0x33); /*鼠标光标掩示*/ void mouseoff()/*鼠标光标隐藏*/ _ax=0x02; geninterrupt(0x33); void mousesetxy(int x,int y)/*设置当前位置*/ _cx=x; _dx=y; _ax=0x04; geninterrupt(0x33); int leftpress()/*左键按下*/ _ax=0x03; geninterrupt(0x33); return(_bx&1); void mousegetxy()/*得到当前位置*/ _ax=0x03; geninterrupt(0x33); mousex=_cx; mousey=_dx; begain()/*游戏开始画面*/ int i,j; loop: cleardevice(); mouseon(); mousesetxy(180,30); mousex=180; mousey=30; scorenum=0; setfillstyle(solid_fill,7); bar(190,60,390,290); setfillstyle(solid_fill,8); for(i=100;i300;i+=20)/*画格子*/ for(j=200;j400;j+=20) bar(j-8,i+8,j+8,i-8); setcolor(7); setfillstyle(solid_fill,yellow);/*画脸*/ fillellipse(290,75,10,10); setcolor(yellow); setfillstyle(solid_fill,0); fillellipse(285,75,2,2); fillellipse(295,75,2,2); setcolor(0); bar(287,80,293,81); randomize(); for(i=0;i10;i+) for(j=0;j10;j+) numij=random(7)+10;/*用10代表地雷算了*/ if(numij=10) scorenum+; sprintf(score,%d,scorenum); setcolor(1); settextstyle(0,0,2); outtextxy(210,70,score); scorenum=100-scorenum;/*为了后面判断胜利*/ gameove()/*游戏结束画面*/ int i,j; setcolor(0); for(i=0;i10;i+) for(j=0;j10;j+) if(numij=10)/*是地雷的就显示出来*/ setfillstyle(solid_fill,red); bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8); setfillstyle(solid_fill,0); fillellipse(200+j*20,100+i*20,7,7); int tongji(int i,int j)/*计算有几个雷*/ int x=0;/*10代表地雷*/ if(i=0&j=0) if(num01=10) x+; if(num10=10) x+; if(num11=10) x+; else if(i=0&j=9) if(num08=10) x+; if(num19=10) x+; if(num18=10) x+; else if(i=9&j=0) if(num80=10) x+; if(num91=10) x+; if(num81=10) x+; else if(i=9&j=9) if(num98=10) x+; if(num89=10) x+; if(num88=10) x+; else if(j=0) if(numij+1=10) x+; if(numi+1j=10) x+; if(numi-1j=10) x+; if(numi-1j+1=10) x+; if(numi+1j+1=10) x+; else if(j=9) if(numij-1=10) x+; if(numi+1j=10) x+; if(numi-1j=10) x+; if(numi-1j-1=10) x+; if(numi+1j-1=10) x+; else if(i=0) if(numi+1j=10) x+; if(numij-1=10) x+; if(numij+1=10) x+; if(numi+1j-1=10) x+; if(numi+1j+1=10) x+; else if(i=9) if(numi-1j=10) x+; if(numij-1=10) x+; if(numij+1=10) x+; if(numi-1j-1=10) x+; if(numi-1j+1=10) x+; else if(numi-1j=10) x+; if(numi-1j+1=10) x+; if(numij+1=10) x+; if(numi+1j+1=10) x+; if(numi+1j=10) x+; if(numi+1j-1=10) x+; if(numij-1=10) x+; if(numi-1j-1=10) x+; return(x); funcheck(int i,int j)/*开始找无雷*/ scorenum-; if(pij=0&numij!=10) setfillstyle(solid_fill,7);/*显示无雷区*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7); numij=-1; else if(pij!=0) sprintf(score,%d,pij);/*输出雷数*/ setcolor(red); outtextxy(195+j*20,95+i*20,score); numij=-1; return ; if(i!=0&numi-1j!=-1&numi-1j!=10)/*第归开始*/ funcheck(i-1,j); if(i!=0&j!=9&numi-1j+1!=-1&numi-1j+1!=10) funcheck(i-1,j+1); if(j!=9&numij+1!=-1&numij+1!=10) funcheck(i,j+1); if(j!=9&i!=9&numi+1j+1!=-1&numi+1j+1!=10) funcheck(i+1,j+1); if(i!=9&numi+1j!=-1&numi+1j!=10) funcheck(i+1,j); if(i!=9&j!=0&numi+1j-1!=-1&numi+1j-1!=10) funcheck(i+1,j-1); if(j!=0&numij-1!=-1&numij-1!=10) funcheck(i,j-1); if(i!=0&j!=0&numi-1j-1!=-1&numi-1j-1!=10) funcheck(i-1,j-1); playgame()/*游戏过程*/ int i,j,numx; for(i=0;i10;i+) for(j=0;j280&mousex65&mousey190&mousex90&mousey290)/*是否在游戏范围内*/ j=(mousex-190)/20;/*x坐标*/ i=(mousey-90)/20;/*y坐标*/ if(numij!=-1) if(numij=10)/*中雷*/ mouseoff(); gameove();/*失败*/ break; else/*非中雷*/ mouseoff(); numx=tongji(i,j); if(numx=0)/*周围没地雷*/ funcheck(i,j);/*开始找无雷*/ else/*有地雷*/ sprintf(score,%d,numx);/*输出雷数*/ setcolor(red); outtextxy(195+j*20,95+i*20,score); scorenum-; mouseon(); numij=-1; if(scorenum280&mousex65&mousey85) goto loop; mouseoff(); closegraph(); 第3章 课程设计总结刚开始老师给我们课题时都不知道这是什么东西,根本不知道那些程序都用来做什么,大家都蒙了。后来,我们去图书馆、上网查资料,有好多都是类似的,可还是不一样。所以我们只能靠自己和老师的指导了。我们都把书拿出来看着相关的函数,看它们在这个程序中起着什么作用,慢慢研究。过了三四天终于有了点成效,画出了点大的框架,可是,程序流程图、还有功能介绍等还是很难根本做不出来。心里有点打了退堂鼓,然后又找老师问了问疑点,又有了点思路可是还有很多知识点不懂。最后我决定还是要以书为主,所以又把书拿出来看着书上数组、指针等等

温馨提示

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

评论

0/150

提交评论