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

下载本文档

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

文档简介

辽 宁 工 业 大 学 c语言程序设计 课程设计(论文)题目: 扫地雷游戏 院(系): 软件学院 专业班级: 电子商务091班 学 号: 学生姓名: 指导教师: 教师职称: 助 教 起止时间:2009.12.14至2009.12.26 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号学生姓名专业班级电子商务091班程序设计(报告)题目c语言课程设计-扫地雷游戏程序设计(报告)任务程序设计的任务与要求:(1)掌握c语言编程的基础知识。(2)较熟练地编写c语言应用程序。(3)了解c语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2009 年 1 月 13 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1程序功能介绍22.2程序整体设计说明22.2.1设计思路22.2.2数据结构设计及用法说明32.2.3程序结构(流程图)32.2.4各模块的功能及程序说明32.2.5程序结果62.3程序源代码及注释6第3章 课程设计总结17参考资料19第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程序功能介绍自windows系统推出以来,系统所带扫雷游戏深受人们喜爱,她是一个益智游戏,令人百玩不厌。本课题要求利用turbo c编写与它功能相仿的扫雷游戏,寓学于乐。程序的功能要求随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。所有地雷标出后胜利,当鼠标左键单击到地雷时失败。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将被展开,一直波及到不可确定的雷区。这也是实现的关键。我们可以把数组的元素设定为一个类对象,它们所属的类设定这样的一个事件:在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。相信在了解以上两个要点后,把雷区这个类编写完全(如添加是否有雷标记,是否展开标记,周围雷数等,双击,左右单击的鼠标事件等),实现扫雷程序应是十分简单的一件事。扫雷的地图一般是一个矩形,所以,我用一个a*b的二维数组就完全可以表示整个地图。 有了地图以后地图里面的类容自然就有一部分是表示地雷啦,既然这样,那不如就这样/* * 20 标志该位置为地雷 * =10的数字表示已翻开的方块及周围的地雷数目 * */ 表示方法就出来了,逻辑也明朗起来了。 我要将某个块翻开,只要将他加上10 格是否为地雷就可以了。2.2.2数据结构设计及用法说明 扫雷的数据结构就是一个二维数组,数组的每个元素是个结构体。记录着每个雷区的状态,包括是否有雷, 是否打开,是否插了红旗,以及周围的雷数。当鼠标按下指定雷区,从雷区的各个信息中判断并做出相应的反应。 /*雷区的数据结构*/ struct char lei; /*lei=1有雷,lei=0无雷 */ .char close; /*close=1雷区未打开,close=0雷区以打开*/ .char hong; /*hong=1插了红旗,hong=0没有红旗*/ .char shu; /*周围的雷数*/ lei3218; 在这说明一点,为了算法简洁,我们在程序中只使用数组lei1-max-11-max-1 还要说明的就是周围区域并不是没有用,只是把它们设置成无雷和全部打开。 这样做的目的是更好的统计周围的雷数和其他一些操作,这样设计即使是最边上的雷区 周围也是有8个雷区。算法就大大简化了。 2.2.3程序结构(流程图)如图2.1图各模块的功能及程序说明1.主函数主要定义常用到的常量,全局变量,有关的函数原形说明。然后随机布雷,统计好每个格子周围的雷数,画扫雷游戏界面,游戏接受鼠标操作,按任意键结束游戏,关闭图形系统,程序结束。void main() int i; int total=0; byte button; bool quit=false; star(); /*调用游戏前景动画函数*/ if (!initmouse() /*对鼠标端口进行判断*/ printf(mouse not installed!); getch(); clrscr(); cursorhide(); randomize(); /*取随机数*/ locate(36,20); printf(mines:%d ,0); for (y=0;y10;y+) for (x=0;x10;x+) mineyx=null; turnyx=false; /*随机产生地雷坐标*/ for (i=0;i10;i+) /*用for循环取十颗地雷*/ x=random(10); /*随机产生一颗地雷 横 坐标*/ y=random(10); /*随机产生一颗地雷 纵 坐标*/ while (mineyx) /*将随机产生的地雷坐标赋给数组*/ x=random(10); y=random(10); mineyx=mine; for (y=0;y10;y+) for (x=0;x=0) i+; /*雷区坐边界判断*/ if (mineyx+1=mine)&(x+1)=0) i+; /*雷区上边界判断*/ if (miney+1x=mine)&(y+1)=0)&(y-1)=0) i+; /*雷区左上角判断*/ if (miney-1x+1=mine)&(x+1)=0) i+; /*雷区右上角判断*/ if (miney+1x+1=mine)&(x+1)10)&(y+1)=0)&(y+1)10) i+; /*雷区左下角判断*/ mineyx=i; prt(x+sx,y+sy,1,15); /*雷区图形和颜色*/ 2失败判断函数void failexitgame() sound(1000); /*失败警告声音*/ delay(500); /*延迟时间*/ nosound(); /*关闭失败警告声音*/ for (y=0;y10;y+) for (x=0;x10;x+) if (mineyx=mine) prt(x+sx,y+sy,*,14+128); mousehide(); /*鼠标隐藏*/ cursorshow(); /*光标显示*/ printf(nfail!n); /*在屏幕上打印失败提示*/ getch(); /*等待按键*/ exit(0); /*推出程序*/ 3.胜利判断函数void exitgame() int i,m=0; for (i=0;i10;i+) if (minemarki1marki0) m+; if (m9) failexitgame(); mousehide(); /*鼠标隐藏*/ cursorshow() /*光标显示;*/ printf(nok,good!n); /*在屏幕上打印胜利提示*/ getch(); exit(0);2.2.5程序结果游戏开始画面 如图2.2 图2.2游戏进行画面 如图2.3图2.3游戏失败,按笑脸从新游戏 如图2.4图2.42.3程序源代码及注释#include #include #include #define leftpress 0xff01#define leftclick 0xff10#define leftdrag 0xff19#define mousemove 0xff08struct int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/mine1010;int gameagain=0;/*是否重来的变量*/int gameplay=0;/*是否是第一次玩游戏的标志*/int minenum;/*统计处理过的格子数*/char randminenum3;/*显示数字的字符串*/int keystate;int mouseexist;int mousebutton;int mousex;int mousey;void init(void);/*图形驱动*/void mouseon(void);/*鼠标光标显示*/void mouseoff(void);/*鼠标光标隐藏*/void mousesetxy(int,int);/*设置当前位置*/int leftpress(void);/*左键按下*/int rightpress(void);/*鼠标右键按下*/void mousegetxy(void);/*得到当前位置*/void control(void);/*游戏开始,重新,关闭*/void gamebegain(void);/*游戏开始画面*/void drawsmile(void);/*画笑脸*/void drawredflag(int,int);/*显示红旗*/void drawempty(int,int,int,int);/*两种空格子的显示*/void gameover(void);/*游戏结束*/void gamewin(void);/*显示胜利*/int minestatistics(int,int);/*统计每个格子周围的雷数*/int showwhite(int,int);/*显示无雷区的空白部分*/void gameplay(void);/*游戏过程*/void close(void);/*图形关闭*/void main(void) init(); control(); close();void init(void)/*图形开始*/ int gd=detect,gm; initgraph(&gd,&gm,c:tc);void close(void)/*图形关闭*/ closegraph();void mouseon(void)/*鼠标光标显示*/ _ax=0x01; geninterrupt(0x33);void mouseoff(void)/*鼠标光标隐藏*/ _ax=0x02; geninterrupt(0x33);void mousesetxy(int x,int y)/*设置当前位置*/ _cx=x; _dx=y; _ax=0x04; geninterrupt(0x33);int leftpress(void)/*鼠标左键按下*/ _ax=0x03; geninterrupt(0x33); return(_bx&1);int rightpress(void)/*鼠标右键按下*/ _ax=0x03; geninterrupt(0x33); return(_bx&2);void mousegetxy(void)/*得到当前位置*/ _ax=0x03; geninterrupt(0x33); mousex=_cx; mousey=_dx;void control(void)/*游戏开始,重新,关闭*/ int gameflag=1;/*游戏失败后判断是否重新开始的标志*/ while(1) if(gameflag)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/ gamebegain(); /*游戏初始画面*/ gameplay();/*具体游戏*/ if(gameagain=1)/*游戏中重新开始*/ gameagain=0; continue; mouseon(); gameflag=0; if(leftpress()/*判断是否重新开始*/ mousegetxy(); if(mousex280&mousex65&mousey85) gameflag=1; continue; if(kbhit()/*判断是否按键退出*/ break; mouseoff();void drawsmile(void)/*画笑脸*/ setfillstyle(solid_fill,yellow); fillellipse(290,75,10,10); setcolor(yellow); setfillstyle(solid_fill,black);/*眼睛*/ fillellipse(285,75,2,2); fillellipse(295,75,2,2); setcolor(black);/*嘴巴*/ bar(287,80,293,81);void drawredflag(int i,int j)/*显示红旗*/ setcolor(7); setfillstyle(solid_fill,red); bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5); setcolor(black); line(198+j*20,95+i*20,198+j*20,95+i*20+10);void drawempty(int i,int j,int mode,int color)/*两种空格子的显示*/ setcolor(color); setfillstyle(solid_fill,color); if(mode=0)/*没有单击过的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8); else if(mode=1)/*单击过后显示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);void gamebegain(void)/*游戏开始画面*/ int i,j; cleardevice(); if(gameplay!=1) mousesetxy(290,70); /*鼠标一开始的位置,并作为它的初始坐标*/ mousex=290; mousey=70; gameplay=1;/*下次按重新开始的话鼠标不重新初始化*/ minenum=0; setfillstyle(solid_fill,7); bar(190,60,390,290); for(i=0;i10;i+)/*画格子*/ for(j=0;j10;j+) drawempty(i,j,0,8); setcolor(7); drawsmile();/*画脸*/ randomize(); for(i=0;i10;i+)/*100个格子随机赋值有没有地雷*/ for(j=0;j10;j+) minej.num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/ if(minej.num=1) minenum+;/*现有雷数加1*/ else minej.num=2; minej.flag=0;/*表示没红旗标志*/ sprintf(randminenum,%d,minenum); /*显示这次总共有多少雷数*/ setcolor(1); settextstyle(0,0,2); outtextxy(210,70,randminenum); minenum=100-minenum;/*变量取空白格数量*/ mouseon();void gameover(void)/*游戏结束画面*/ int i,j; setcolor(0); for(i=0;i10;i+) for(j=0;j10;j+) if(minej.num=1)/*显示所有的地雷*/ drawempty(i,j,0,red); setfillstyle(solid_fill,black); fillellipse(200+j*20,100+i*20,7,7); void gamewin(void)/*显示胜利*/ setcolor(11); settextstyle(0,0,2); outtextxy(230,30,you win!);int minestatistics(int i,int j)/*统计每个格子周围的雷数*/ int nnum=0; if(i=0&j=0)/*左上角格子的统计*/ if(mine01.num=1) nnum+; if(mine10.num=1) nnum+; if(mine11.num=1) nnum+; else if(i=0&j=9)/*右上角格子的统计*/ if(mine08.num=1) nnum+; if(mine19.num=1) nnum+; if(mine18.num=1) nnum+; else if(i=9&j=0)/*左下角格子的统计*/ if(mine80.num=1) nnum+; if(mine91.num=1) nnum+; if(mine81.num=1) nnum+; else if(i=9&j=9)/*右下角格子的统计*/ if(mine98.num=1) nnum+; if(mine89.num=1) nnum+; if(mine88.num=1) nnum+; else if(j=0)/*左边第一列格子的统计*/ if(minej+1.num=1) nnum+; if(minei+1j.num=1) nnum+; if(minei-1j.num=1) nnum+; if(minei-1j+1.num=1) nnum+; if(minei+1j+1.num=1) nnum+; else if(j=9)/*右边第一列格子的统计*/ if(minej-1.num=1) nnum+; if(minei+1j.num=1) nnum+; if(minei-1j.num=1) nnum+; if(minei-1j-1.num=1) nnum+; if(minei+1j-1.num=1) nnum+; else if(i=0)/*第一行格子的统计*/ if(minei+1j.num=1) nnum+; if(minej-1.num=1) nnum+; if(minej+1.num=1 nnum+; if(minei+1j-1.num=1) nnum+; if(minei+1j+1.num=1) nnum+; else if(i=9)/*最后一行格子的统计*/ if(minei-1j.num=1) nnum+; if(minej-1.num=1) nnum+; if(minej+1.num=1) nnum+; if(minei-1j-1.num=1) nnum+; if(minei-1j+1.num=1) nnum+; else/*普通格子的统计*/ if(minei-1j.num=1) nnum+; if(minei-1j+1.num=1) nnum+; if(minej+1.num=1) nnum+; if(minei+1j+1.num=1) nnum+; if(minei+1j.num=1) nnum+; if(minei+1j-1.num=1) nnum+; if(minej-1.num=1) nnum+; if(minei-1j-1.num=1) nnum+; return(nnum);/*把格子周围一共有多少雷数的统计结果返回*/int showwhite(int i,int j)/*显示无雷区的空白部分*/ if(minej.flag=1|minej.num=0)/*如果有红旗或该格处理过就不对该格进行任何判断*/ return; minenum-;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/ if(minej.roundnum=0&minej.num!=1)/*显示空格*/ drawempty(i,j,1,7); minej.num=0; else if(minej.roundnum!=0)/*输出雷数*/ drawempty(i,j,0,8); sprintf(randminenum,%d,minej.roundnum); setcolor(red); outtextxy(195+j*20,95+i*20,randminenum); minej.num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/ return ; /*8个方向递归显示所有的空白格子*/ if(i!=0&minei-1j.num!=1) showwhite(i-1,j); if(i!=0&j!=9&minei-1j+1.num!=1) showwhite(i-1,j+1); if(j!=9&minej+1.num!=1) showwhite(i,j+1); if(j!=9&i!=9&minei+1j+1.num!=1) showwhite(i+1,j+1); if(i!=9&minei+1j.num!=1) showwhite(i+1,j); if(i!=9&j!=0&minei+1j-1.num!=1) showwhite(i+1,j-1); if(j!=0&minej-1.num!=1) showwhite(i,j-1); if(i!=0&j!=0&minei-1j-1.num!=1) showwhite(i-1,j-1);void gameplay(void)/*游戏过程*/ int i,j,num;/*num用来接收统计函数返回一个格子周围有多少地雷*/ for(i=0;i10;i+) for(j=0;j280&mousex65&mousey190&mousex90&mousey290)/*当前鼠标位置在格子范围内*/ j=(mousex-190)/20;/*x坐标*/ i=(mousey-90)/20;/*y坐标*/ if(minej.flag=1)/*如果格子有红旗则左键无效*/ continue; if(minej.num!=0)/*如果格子没有处理过*/ if(minej.num=1)/*鼠标按下的格子是地雷*/ mouseoff(); gameover();/*游戏失败*/ break; else/*鼠标按下的格子不是地雷*/ mouseoff(); num=minestatistics(i,j); if(num=0)/*周围没地雷就用递归算法来显示空白格子*/ showwhite(i,j); else/*按下格子周围有地雷*/ sprintf(randminenum,%d,num);/*输出当前格子周围的雷数*/ setcolor(red); outtextxy(195+j*20,95+i*20,randminenum); minenum-; mouseon(); minej.num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/ if(minenum190&mousex90&mousey290)/*当前鼠标位置在格子范围内*/ j=(mousex-190)/20;/*x坐标*/ i=(mousey-90)/20;/*y坐标*/ mouseoff(); if(minej.flag=0&minej.num!=0)/*本来没红旗现在显示红旗*/ drawredflag(i,j); minej.flag=1; else if(minej.flag=1)/*有红旗标志再按右键就红旗消失*/ drawempty(i,j,0,8); minej.flag=0; mouseon(); sleep(1); 第3章 课程设计总结c语言程序设计是从程序开始的,程序是为了使计算机完成指定任务而编写的具有特定语法规则的指令序列,课程设计是学习c语言最好的一次检测。课程设计是培养学生综合运用所学的c语言知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的

温馨提示

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

评论

0/150

提交评论