已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础课程设计扫雷游戏 院 系: 计算机科学技术学院软件工程系 班 级: 姓 名: 学 号: 合 作 者: 指导教师: 2009 年 6 月 28日程序设计基础课程设计任务书一、题目:扫雷游戏二、设计要求(1) (组长)、 和 组成课程设计小组。(2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。(3)查阅相关资料,自学具体课题中涉及到的新知识。(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。(5)所设计的系统应有菜单、动画和音乐。(6)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。课程设计报告的撰写请参照程序设计基础课程设计指导书中的2.5节。三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。四、课程设计工作计划2009年6月15日前,指导教师讲课,学生根据题目准备资料,需求分析;2009年6月15日,设计小组进行总体方案设计和任务分工;2009年6月17日2009年6月23日,每人完成自己承担的程序模块并通过独立编译;2009年6月24日2009年6月25日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2009年6月26日6月30日,验收、开始撰写课程设计报告;2009年7月3日前,提交课程设计报告和软件。 指导教师签章: 教研室主任签章 程序设计基础课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 2009年 1月 日目 录一 概 述.51.1软件系统概述.51.1.1开发的软件系统的题目:扫雷游戏.51.2课程设计目的 .51.3 课程设计具体要求.5二软件需求分析6三总体方案设计6四详细设计.7五程序的调试与运行结果说明14六课程设计总结.17七结束语 17困难及解决途径:.17心得体会.17八 程序清单.18全部代码及注释.18九 参考文献.47一 概述1.1软件系统概述1.1.1开发的软件系统的题目:扫雷游戏.1.1.2运行环境:win-tc.1.1.3功能:我们的游戏可以玩扫雷.1.1.4特点:此游戏具有登陆系统,可输入密码确保安全性,界面美观具有标题栏,菜单,难度选择,排行榜,游戏成功和失败都有不同的音乐和动画。1.1.5规模:我们的程序共计1176行,我负责360行,我负责的模块是一个音乐、开机动画的一部分和五个函数.1. 2课程设计的目的a. 通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固c语言程序设计课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!b. 通过c语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。1.3 课程设计的具体要求游戏和功能上尽量模拟windows操作系统中的扫雷游戏,系统界面尽量美观,求有声音提示,难度选择和排行榜。我们是在windows-xp下进行的。根据此设计题目要求我们意识到在此程序中应会有一些关于画图的程序,声音程序,鼠标的设置程序.对于排行榜还应有一些数组、文件方面的知识.所以我们需要查一下这些方面的知识。我们的老师除了要我们做这个游戏程序以外还要求我们每个人都有自己的音乐和动画。.二 软件需求分析对于我们的软件系统-扫雷游戏,我们应该把界面弄得尽量美观,因为只有美观玩的人才能有兴趣往下玩,所以在画界面时应该往美观与整洁方面努力.同时我们还应该把排行榜弄好,因为具有排行榜才能使玩家更有兴趣去玩.我们还应该设一些难度选择,以供提高玩者欲望.对于那个鼠标的控制应该设置的灵活,只有这样别人才会选你的软件。另外,在游戏成功与失败时分别有不同的音乐与动画,使玩者心情舒畅,想继续挑战下一难度级别的扫雷。三 总体方案设计扫雷游戏是供人玩的游戏,所以界面尽量美观,有难度选择和排行榜。特点: 功能的模块化设计,方便对其系统的完善,提高了程序的可读性。整体框图如下: 登陆(输入密码,姓名)游戏界面功能选择菜单难度选择排行榜开始退出易中难注:游戏成功时 音乐二动画三 游戏失败时 音乐三动画三音乐一动画二音乐一动画一姓名分数四 详细设计*这是我设计的动画部分和音乐,动画(另一部分在 那里)是我和 共同完成,音乐为真心英雄,三朵小花代表我和两个组员,主要表现了不经历风雨,如何见彩虹的理念。接下来是进入登陆界面,首先输入密码,密码为abc(可以改成任意9个字符),有三次输入机会,输入正确时继续输入姓名,输入错误密码时退出该系统,未完 待续我的程序部分代码:void interrupt(*handler)();void interrupt music(); int fr=262,262,262,262,294,330,440,392,330,392,392,392, 523,523,523,523,523,523,330,330,392,523,523,523,523,523, 392,392,392,330,330,294,262,294,294,294,294,294,294,294,330,294,262,294, 262,262,262,262,294,330,440,392,330,392,392,523,523,523,523,523, 523,330,440,392,392,523,523,523,523,523,440,392,392,440,330, 330,294,262,262,294,294,294,330,330,392,294,330,262,262; int tim=4,4,4,4,4,4,4,4,4,8,2,2,2,2,2,2,4,4,4,4,12,4,4,4,4,8, 4,4,4,4,2,6,2,2,2,2,2,2,4,2,2,4,12,4,4,4,4,4,4,4,4,4,8,4,2,2,2,2,2,2,4, 4,4,4,12,4,4,2,2,8,4,4,4,2,2,2,2,4,2,2,4,4,2,2,4,4,2,2,12,12;/*此音乐为 真心英雄*/void interrupt music() /* 音乐中断函数*/ static int flag=0,note=0,fre,dur; if(flag=(int)(dur*2) flag=0; nosound(); fre=frnote; dur=timnote; sound(fre); note+; if(note=88)note=0; handler(); flag+;void donghua() int gdriver=detect,gmode,i=0,j,k,k1,x,s,en,r,x1,y1; initgraph(&gdriver,&gmode,c:win-tcprojects); handler=getvect(0x1c); /* 调用中断函数,来实现音乐与动画同步*/ setvect(0x1c,music); setcolor(red); setfillstyle(solid_fill,4); /*绘画太阳与云朵*/ circle(90,90,40); floodfill(89,89,4); setcolor(15); setfillstyle(solid_fill,15); fillellipse(210,90,28,48); fillellipse(190,90,80,24); floodfill(200,95,15); for(j=160;j=480;j+=160) /*绘画小花的茎和叶子*/ setcolor(green); line(j-1,380,j-1,480); line(j,380,j,480); line(j+1,380,j+1,480); setfillstyle(solid_fill,green); fillellipse(j-30,450,30,15); setcolor(brown); line(j-60,450,j,450); for(k=0;k=3;k+) /*此部分为绘画小花,通过循环控制颜色变化,来实现动画*/ for(i=0;i=10;i+) for(j=160;j=480;j+=160) setcolor(i%16); setfillstyle(solid_fill,(i+7)%16); circle(j,378,17); floodfill(j,378,i%16); setfillstyle(solid_fill,(i+1)%16); circle(j,339,21); floodfill(j,339,i%16); setfillstyle(solid_fill,(i+2)%16); circle(j-34,365,21); floodfill(j-34,365,i%16); setfillstyle(solid_fill,(i+5)%16); circle(j+34,365,21); floodfill(j+34,365,i%16); setfillstyle(solid_fill,(i+3)%16); circle(j-24,406,21); floodfill(j-24,406,i%16); setfillstyle(solid_fill,(i+4)%16); circle(j+24,406,21); floodfill(j+24,406,i%16); settextstyle(0,0,4);/*为图形输出设置当前的文本属性横向和竖向,0为横向排列,1为竖向排列。 size 为字体大小:可用interger做参数*/ setcolor(7); outtextxy(120,180,welcome to play); /*在指定位置显示一字符串*/ setcolor(14); outtextxy(118,178,welcome to play);/*输出welcome to play our game!*/ setcolor(7); outtextxy(140,240,our game!); /*在指定位置显示一字符串*/ setcolor(14); outtextxy(138,238,our game!); delay(800000); setvect(0x1c,handler); nosound(); /*停止音乐*/ closegraph(); /*关闭图形模式,以便进入文本模式输入文本*/void deng_lu() /*此函数为登陆界面函数,在开始动画音乐结束时出现,输入密码为abc,有三次输入机会,输入正确时继续输入姓名,输入错误密码时退出该系统*/ char q10,qq10=abc; int i,ii=1,j,k; textcolor(yellow); for(j=0;jdifftime(second,first) /*打破记录情况*/ peonn.time=difftime(second,first); gotoxy(40,22); printf(you break the corse!); for(i=0;pi!=0;i+) i=pi; i=0; if(nn=0) /* nn=0表示为 易,nn=1表示为 中,nn=2表示为 难*/ fp=fopen(filea,wb); else if(nn=1) fp=fopen(fileb,wb); else if(nn=2) fp=fopen(filec,wb); fwrite(&peonn,sizeof(struct people),1,fp); /*读入文件,存入磁盘*/ fclose(fp); else /*没打破纪录情况*/ gotoxy(40,23); printf(you dont break the corse); void fopenfp() /*点击排行榜时打开文件,输出姓名与分数,此函数在full_window函数中调用*/ fp=fopen(filea,rb); /*打开文件进行读写*/ fread(&peo0,sizeof(struct people),1,fp); gotoxy(15,4); /*将光标移到该位置*/ printf(%-20s,); /*从文件中调用结构体*/ printf(%.0f,peo0.time); close(fp); /*关闭文件*/ fp=fopen(fileb,rb); fread(&peo1,sizeof(struct people),1,fp); gotoxy(15,5); printf(%-20s,); printf(%.0f,peo1.time); close(fp); fp=fopen(filec,rb); fread(&peo2,sizeof(struct people),1,fp); gotoxy(15,6); printf(%-20s,); printf(%.0f,peo2.time); close(fp);void ha_mouse() /*此函数为鼠标函数,通过获取鼠标位置来判断点击功能选择的哪一部分,然后执行各个功能*/ int i,j,k,x=-1,y=-1,flag=0,color; int tx1,ty1,tx2,ty2,tbx; int new_x=ha_x,new_y=ha_y; union regs inregs,outregs,regs2;/*执行intr_num号中断,用户定义的寄存器值存于结构inregs中, 执行完后将返回的寄存器值存于结构outregs中*/ inregs.x.ax=0x03;/*获取鼠标位置和状态也可以用3*/ while(!bioskey(1) /*直接使用bios服务的键盘接口*/ int86(0x33,&inregs,&outregs);/*调用鼠标中断,通用8086软中断接口 */ regs2.x.ax=0x06; regs2.x.bx=0x00; int86(0x33,®s2,®s2);/*cx水平位置(最后释放时),dx垂直位置(最后释放时)*/ tx2=regs2.x.cx;/*cx寄存器中存的是横坐标*/ ty2=regs2.x.dx;/*dx寄存器中存的是列坐标*/ if(x!=outregs.x.cx | y!=outregs.x.dx | tbx!=outregs.x.bx) if(flag) for(j=0;j10;j+)/*恢复上次鼠标一定范围内的像素颜色*/ for(i=0;i=639-19 & outregs.x.cx=1 & outregs.x.dx=1 & outregs.x.cx=21 & outregs.x.dx=33 & outregs.x.cx=21 & outregs.x.dx=65 & outregs.x.cx=21 & outregs.x.dx=(ha_x+ha_x+2+mx*10)/2-16 &outregs.x.cx=(ha_y+ha_y-30)/2-9 & outregs.x.dx=new_x & outregs.x.cx+new_y-30 & outregs.x.dx=new_y) / *拖动扫雷图标扫雷*/ if(tg=0) 扫雷部分存储 tg+; for(j=0;j=1+my*10+1+30;j+) for(i=0;i=new_x & x=new_y-30 & y=new_x & x=new_y-30 & y=new_y) tg=0; ha_x=new_x; ha_y=new_y; for(j=0;j=1+my*10+1+30;j+) for(i=0;i=2 & outregs.x.cx=40 & outregs.x.dx=34 & outregs.x.cx=40 & outregs.x.dx=65 & outregs.x.cx=40 & outregs.x.dx=0 & ty2-ha_y-2=0 & (tx2-ha_x-2)/10=0 & (tx2-ha_x-2)/10=0 & (ty2-ha_y-2)/101 & 0x01 & dead=0)/*鼠标右键按下-鼠标点击判断*/ if(outregs.x.cx-ha_x-2)/10=0 & (outregs.x.cx-ha_x-2)/10=0 & (outregs.x.dx-ha_y-2)/10=my-1) box_mark(outregs.x.cx-ha_x-2)/10,(outregs.x.dx-ha_y-2)/10);/*插旗标记*/ /*=*/ for(j=0;j10;j+)/*储存鼠标一定范围内的像素颜色*/ for(i=0;i6;i+) reji=getpixel(outregs.x.cx+i,outregs.x.dx+j); for(i=0;i8;i+)/*确定鼠标各顶点位置*/ m_now_polyi=m_polyi+outregs.x.cx; i+; m_now_polyi=m_polyi+outregs.x.dx; setcolor(green); drawpoly(4,m_now_poly);/*显示鼠标框架,画多边形*/ setfillstyle(solid_fill,white);/*填充鼠标,注意以白色填充,当遇到白色背景时会不能完全填充*/ floodfill(m_now_poly0+1,m_now_poly1+5,green); /*绿色*/ setcolor(lightred); drawpoly(4,m_now_poly);/*显示鼠标框架*/ x=outregs.x.cx;/*存鼠标坐标,供恢复使用*/ y=outregs.x.dx; tbx=outregs.x.bx; tx1=tx2;/*暂存鼠标释放的位置*/ ty1=ty2; 五 程序的调试与运行结果说明 我们运行时的动画画面 密码界面 进入游戏界面 游戏失败 菜单界面这是我在做动画时遇到的问题我只知道让driver=detect却忘记了定义了,最后我加了个int driver之后,运行成功了.这是我在改goto语句时遇到的错误,我上网查询了很多网站,虽然查到的是正确的,但因为我们的程序比较复杂,goto语句比较多,分布程序各处,改对一部分后,有程序断层,与后面连接不上,造成在游戏界面上无法进行鼠标操作,等于没有改正确。由于程序复杂,时间紧,老师特许我们不用改了。但是goto语句使非结构化设计,在以后设计中应该尽量不使用。尽量做到结构化设计。六 课程设计总结课题的设计工作完成后,我们基本上符合了实验要求。我们具有登陆界面,可以用密码来保证安全性,还有标题栏,选择菜单,菜单中有开始与退出,难度选择和排行榜。游戏失败后会有失败的音乐动画,成功后会有胜利的音乐与动画,打破纪录时可以把分数与姓名存入磁盘。但缺点是登陆界面没有对话框,不能在图形模式下输入姓名。七 结束语困难及解决途径:1 老师要求我们每个人都有自己的音乐和动画,我们首先从音乐入手,选好音乐后,按照指导书上给的声音频率与音符的对照关系,我们把简短的音乐编入程序后,声音十分难听,经过多次请教和几番改动节拍和延迟时间,最后总算有了比较优美的音乐。然后使用中断法插入动画中。在制作动画时,一些坐标位置掌握不好,总是达不到想要的效果,但是通过试了很多个点,换了很多次颜色才出现了现在的效果。2 为了满足课程设计的要求,我们需要在程序中加入排行榜,这就需要加入“排”、“行”、“榜”,三个字的字模,还有其他名字需要改动,但是我们不知道字模是怎样加上去的,通过请教做过课程设计的前辈们,才知道原来win-tc里超级工具集自身就带点阵字模工具。3 加排行榜需要记录时间,通过查找实验指导书,也试了几个函数,最终决定用difftime函数,但是由于程序没读懂,取的开始时间位置加错了,致使每次记录时间都是0.00,然后停下手头的工作,反复读程序,最后加对了地方,同时也更加理解了关于时间的函数。4 最后就是排行榜的记录了,我原本打算定义一个结构体变量,把成绩存里就可以了,但在做的过程中,曹老师要求我们可以把成绩存到磁盘里,下次玩的时候还显示,这就需要文件的打开,读写,存盘等知识了,我们又有了更大的挑战了,通过看课本把13章的知识又复习了一遍,试着写打开一个文件并把记录存盘,写完后文件打不开,去问老师,他说我的逻辑严重有问题,我知道自己在这块知识上理解的还不透彻,于是回去又看,然后又和李秀鹏同学探讨,最后可以打开文件并存盘了。但是新的问题又出现了,当玩完游戏并打破记录时要求输入姓名,但是当时是在图形模式下,无论我用scanf,gets,getch,cscanf还是,fscanf都不能输入文本,我们的其他不分都已经完成,之差这块,别的组已经验收完了,我们急的焦头烂额,最后老师给了我们一个建议,可以在进入动画之前,在文本模式下输入姓名,当赢了时,再把名字用数组调过来,这样就避免了在图形模式下输入文本了。于是我就设计了登陆界面,顺便加了一个登陆密码。心得体会: 首先,通过这次课程设计使我感觉到知道的知识太少了,光看实验指导书就觉得知识匮乏。课本上学的只是基础,要想成为一个编程人员,就得需要自己不断的积累积累再积累,把可以利用的资源都用上,如图书馆,上网查资料,向老师请教。尽量多学,不白过大学的每一天。其次,要想编一个程序,必须靠大家齐心努力。大体的模块设计出来后要进行分工,要做到分工明确,人人有事做,人人有责任感。接着小组成员要团结在一起全力把设计完成。大家一定要共同研究:有想法就说出来,一起实现,有困难解决不了,一起克服。总之,我们是一个整体!最后,我想说,年轻永不言败!我们在做课程设计期间遇到很多困难,但我们没有放弃,而是想办法解决它,克服它。因为我们知道没有解决不了的问题,虽然我们的知识有限,但是我们可以去请教、去学,只要我们肯学肯付出汗水,就没有解决不了的困难。在今后的学习和工作中我们一定会遇到这样或那样的困难,我们一定要坚持理想,不轻言放弃!在此,我要特别感谢我们的曹老师,他给了我们很多起着关键作用的建议和指导。没有他的教导与指导就没有我们完整的扫雷。另外还有音乐顾问祝伟杰同学,技术指导孙坤杰同学、李秀鹏同学,他们不仅帮我们找出错误,帮我们改正,给我们提意见,还给我们打气加油。真的很感谢大家对我们的帮助和支持,我们一定再接再厉! 八 .程序清单全部代码及注释#include conio.h#include #include#include#include#include#inclu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论