贪吃蛇报告完整版.doc_第1页
贪吃蛇报告完整版.doc_第2页
贪吃蛇报告完整版.doc_第3页
贪吃蛇报告完整版.doc_第4页
贪吃蛇报告完整版.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

课程设计基础课程设计贪吃蛇游戏设计 院 系: 班 级: 姓 名:合 作 者:指导教师:时间 _年_月_日 课程设计 目录11概述21.1.1研究的背景与意义21.1.2 设计的任务和需要的知识点21. 生成设计主要完成的任务22. 需要掌握和应用的知识点21.1.3 具体完成的设计内容31.2需求分析41.2.1 功能需求41.2.2 操作方法41.进入游戏42.游戏界面43.游戏操作44.游戏结束51.3 总体设计61.3.1 模块划分61.3.2 总体数据结构设计71. 食物与蛇的数据结构72. 排行榜中优胜者的数据结构84. 符号常量的宏定义81.4 详细设计91.4.1主控模块main函数91.4.2绘制游戏开始界面DrawK函数101.4.3游戏具体过程GamePlay函数12Scoreper4.score141.4.5显示排行榜信息模块pain_board函数151.5程序的调试与测试161.5.1动画与音乐的同步播放161.5.2蛇的运行161.5.3 终止程序171.6 结论181.7 结束语191.8程序2011概述 本课程设计一软件方法为指导 ,采用了结构化、模块化、的程序设计方法,以C语言技术为基础,使用Turbo C+ 3.0为主要的开发工具,对贪吃蛇的游戏进行了需求分析、总体设计、详细设计、最终完成系统的实现与测试。1.1.1研究的背景与意义通过开发贪吃蛇的游戏系统,可使读者初步了解使用软件工程方法、技术和工具开发的过程,进一步掌握结构化、模块化的程序设计方法和步骤,进一步掌握数据结构设计、模块划分的方法,掌握局部变量、全部变量、机构体、共用体、数组、指针、文件等的数据的结构使用方法,掌握图形、声音、随机数等多种库函数的使用方法,学习动画、音乐、窗口、菜单、键盘等多项编程技术,进一步学会软件测试、调试、组装等软件测试方法,为以后的学习和将来的实际软件开发打下坚实的基础。1.1.2 设计的任务和需要的知识点1. 生成设计主要完成的任务1) 通过编写“贪吃蛇游戏”程序,掌握结构化、模块化程序设计的细想,培养解决实际问题的能力。2) 设计好数组元素与蛇、食物的对应的关系。3) 随即产生食物。4) 有分数统计、排行榜、分数存储等的功能。5) 有同步播放的音乐、声音效果。2. 需要掌握和应用的知识点1) 数组的应用2) 全局变量的使用3) 按键处理4) 机构体的应用5) 图形、声音和动画的有关知识6) 随机函数的使用7) 文件的基本操作8) 结构化、模块化的设计方法1.1.3 具体完成的设计内容 主要完成的任务:包含命令、全局变量的定义和宏定义、函数声明等,主要模块,动画、音乐播放模块,画出游戏开始界面模块,具体游戏过程模块,游戏结束处理模块。1.2需求分析 这类型的小游戏的市场价市相当大的,它的玩法简单,又有趣味性,市人们休闲的好游戏。这样的游戏操作简单,迎合了人们的需求。1.2.1 功能需求程序运行后显示动画、音乐,按键推出欢迎的界面,进入游戏的界面后,左边有一个矩形区,为游戏区域,在矩形区中有食物和贪吃蛇,上方有统计分数和关数的显示区。 蛇在封闭的墙里用用矩形表示,围墙里随机的出现一个食物,通过按键盘的四个光标键控制蛇向上、下、左、右四个方向移动,蛇头撞到食物,食物就被吃掉,蛇本身长一节,接着又出现了食物,等待蛇来吃。食物用另一种颜色的矩形表示,并且每次食物的位置是随机出现的。游戏中要使蛇的长度尽可能的长,但是不能使蛇撞到四周的墙壁,且蛇的身体不能撞到一起,否则游戏结束。 游戏中每吃掉一个食物就会有积分,随着分数的增加可以进入下一关,及速度会加快。 游戏结束的时候,还能进行排名,输入自己的名字即可。1.2.2 操作方法1. 进入游戏进入游戏后,首先出现的是游戏的片头,在这里 ,可以看到一个同步播放的动画音乐和在屏幕不断的变换字体等等,此时,可以按回车键跳出游戏的画面。2. 游戏界面游戏界面的左上角为游戏的标题和游戏的创作人,右上变是目前的游戏成绩和关数,界面中部是围墙,围墙中有一个正在爬行的蛇,还在某处有一个食物。现在就可以开始游戏操作了。3. 游戏操作在游戏中,游戏者可以用上、下、左、右控制蛇的行动,按键可以结束游戏。4. 游戏结束若打出高分可以进入排行榜,此时就会提示输入名字,并将画出的排行榜界面,显示出前5名的游戏者的姓名和分数。1.3 总体设计 却东贪吃蛇游戏体系机构,给出总体的模块结构图,确定程序的主要函数及之间的调用关系,同时设计蛇与游戏者等等的具体的数据结构。1.3.1 模块划分 总体的结构模块结构图如下所示。主控模板 退出结束处理游戏过程画主界面图形驱动动画音乐排行榜写入文件成绩排行读取记录主控模板 主控模块是由main函数实现,主要用来依次调用各个下层的模块,从而控制完成整个程序的功能。动画音乐模块 读模块用来同步播放下雪的动画和简单的音乐,并在屏幕的中间输出颜色不断变化的欢迎词。画主界面模块 画出一个封闭的墙,当蛇贴这墙走的时候会擦掉部分的围墙,使线变细,图形变得不好看,如果不是这种情况发生,可将线型宽度设置为1像素。游戏过程模块 该模块是整个程序的核心,它完成整个游戏过程,用函数来实现,每次蛇移动的时候,从最后一节开始到第二节,将前一节的坐标赋给后一节的坐标,移动后把最后的一节用背景色覆盖,然后蛇头按方向键更改位置,要确保食物出现在10的倍数位置上,判断蛇是否迟到食物的是蛇头坐标和食物坐标是否相同。游戏结束处理模块 游戏结束的时候,读取出记录、成绩排行、写入文件等模块实现有关的处理功能。读取记录模块 该模块是由函数实现的,用来读取排行榜的记录,如果是首次读取文件,将用另一个函数,初始化记录文件,设置多名选手,初始姓名为”null”。初始分数为0.成绩排序模块 将最后的选手的成绩加入成绩排行榜中进行排序。写入文字模块 该模块是由函数来实现的,即将新的排行榜信息输入文件中。排行榜模块 该模块是由函数实现的,主要功能是建立排行榜界面,输出多名最高分的玩家的姓名个成绩。退出 显示出排行榜后,返回函数,按任意键关闭图形系统,并退出程序。1.3.2 总体数据结构设计1. 食物与蛇的数据结构 表示食物与蛇的数据结构设计为10*10个像素单位,用X和Y坐标表示,则矩形块用函数画出来,由于每次出现一个食物,所以设定yes表示是否需要出现食物,yes=1表示没有食物或者食物应经被吃掉,需要画出食物。放置食物后,设置yes=0。蛇的一节身体为一个矩形块,用坐标来表示,由于在游戏的过程中蛇的身体不断的增长,需要用数组来存放每节的坐标,利用1、2、3、4分别表示蛇的右、左、上、下的方向,life表示蛇的生命,life=0,表示蛇活着,life=1,表示蛇已经死了,结束游戏。#define N 200struct Food int x; /*食物的横坐标*/ int y; /*食物的纵坐标*/ int yes; /*判断是否要出现食物的变量*/food; /*食物的结构体*/struct Snake int xN; int yN; int node; /*蛇的节数*/ int direction; /*蛇移动方向*/ int life; /* 蛇的生命,0活着,1死亡*/snake;2. 排行榜中优胜者的数据结构 排行榜主要记录优胜者的姓名和成绩,为了存放排行榜的信息,可以定义下面的结构体类型,其中字符数组name成员存放优胜者的姓名,整型变量score存放优胜者的成绩。 struct person char name20; int score; ; 其他全局变量的定义 struct person per5;int score=0;int gamespeed=400; /*控制蛇的移动速度的变量,初始值为400ms*/4. 符号常量的宏定义#define LEFT 0x4b00 /*左移方向键*/#define RIGHT 0x4d00 /*右移方向键*/#define DOWN 0x5000 /*下移方向键*/#define UP 0x4800 /*上移方向键*/#define ESC 0x011b /*Esc方向键*/#include FILENAME “C:person.dat” /*保存排行榜的文件全名*/1.4 详细设计 画出N-S图和流程图来表示出每一个部分的模块功能。1.4.1主控模块main函数 主函数是函数的数控模块。首先初始化图形系统,然后然后调用DrawSnow函数播放动画和音乐,接着调用Init函数初始化图形系统,之后调用DrawK函数画出游戏开始画面,再调用GamePlay函数,即开始了游戏的具体过程,游戏结束后调用EndPlay函数进行游戏结束处理:从文件中读取记录信息、排序、显示排行榜信息,最后关闭图形系统,结束程序。主控模块的算法流程图如图所示。其中带有两个竖线的矩形框表示对自定义函数的调用。结 束游戏结束处理关闭图形系统游戏具体过程画游戏开始界面初始化图形系统播放动画音乐初始化图形系统开 始1.4.2绘制游戏开始界面DrawK函数 主界面就是一个封闭的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10个像素单位的矩形小方块,围城封闭图形表示为围墙,为了醒目,设置为淡青色,用函数setlinestyle设置线型宽度为3个像素。设置3个像素的围墙,蛇在贴墙走的时候,会擦掉部分围墙线,使线变细,图形变得不好看,为了避免这种情况出现,可将线型宽度设置为1个像素。最后,在界面的左上部输出游戏程序的版本信息,在右上部输出游戏成绩(score)和关(level)的表头。如下图所示:开 始设 置 前 景 色设置线形为实线,3像素宽i=50i=600画上边围墙的一个矩形框画下边为围墙的一个矩形框i=i+10i=40iper4.score 画出填充矩形界面输出提示信息输出空格建立输入框 输出不够上排行榜的信息输入游戏者的姓名成绩赋值记录按成绩排序记录写入排行榜文件显示排行榜返回 该模块首先调用读排行榜记录文件函数读取排行榜文件记录,如果文件不存在,在函数中调用另一个函数来建立文件,然后再读出记录。 其次,判断游戏者的成绩是否可以上排行榜。如果可上榜,则画出浅蓝色矩形界面,在界面中输入游戏者姓名,对成绩进行赋值,然后调用CompareScore函数对记录排序,并调用WriteFiles函数将记录写入排行榜文件;如果不能上榜,则直接在游戏界面输出不能上榜信息。 最后,调用pain_borad函数显示排行榜信息。1.4.5显示排行榜信息模块pain_board函数 函数void pain_board完成排行榜的绘制流程,流程图如图所示。运行结果如图所示。开 始读排行榜记录文件画出矩形的标题界面输出标题画出排行榜界面输出表头的信息i=0输出有关的信息返 回等 待 按 键i= i+ 11.5程序的调试与测试 调试与测试软件的目标就是发现并改正潜伏的错误。一个程序,必须经过认真的调试和测试,才能尽量减少错误、保证程序满足功能、性能需求,达到最初的设计、使用要求,从而保证程序的开发质量。 详细设计完成后,用C语言根据各个模块的算法来设计程序,每个模块都设计成一个自定义函数。几个模块放在一个构成一个源程序文件,或者一个模块构成一个源程序文件。源程序设计好后,输入到计算机,并储存到磁盘上;然后对每个源程序文件都进行独立编译和调试;并针对不同的模块设计测试用例进行单元测试;最后,将几个分别开发的模块组装到一起,形成一个完整的程序,进行集成测试,从而发现并改正程序中存在的一些潜藏的错误,并使程序的容错能力大大增强。调试与测试过程及结果如下所述。1.5.1动画与音乐的同步播放 预期结果:(1)片头在显示动画的同时播放音乐;(2)按任意键后进入游戏主界面;(3)进入游戏主界面后动画音乐同时停止。 实际运行结果:满足(1)和(2),进入游戏后仍然播放片头音乐。 错误分析:程序中使用循环播放动画,并在其循环体中插入发声函数以达到音乐和动画的同步。由于在结束动画时没有关闭扬声器,所以进入游戏界面后仍然发声。 修改:在动画播放完后加一条“nosound();”语句将扬声器关闭,问题得到解决。修改后程序运行的实际结果与预期效果一致。动画音乐的界面如图所示。1.5.2蛇的运行(1)蛇撞到墙预期效果:蛇运行时如果撞到墙壁,则游戏结束。实际运行效果:超出左右墙壁后程序结束,但超出上面墙壁后仍然运行如图所示。错误分析:错误程序段在蛇运行的条件判断语句中,它的判断条件是:if(snake.x0595),即少了上、下俩个方向的判断。修改如下:if(snake.x0595|snake.y0455)修改后的运行效果和预期的效果一致。(2)蛇头撞到蛇身预期结果:当蛇的头部和蛇身相撞的时候,游戏应当结束。实际运行的效果:蛇头撞到蛇身时,程序停止了。如图所示。修改后的代码为:for(i=3;isnake.node;i+) if(snake.xi=snake.x0&sanke.i=snake.y0) snake.life=1;break; 1.5.3 终止程序经过对各个模块的调试和单元测试并修改了错误以后,将各个模块组装成一个软级系统,并进行集成测试。在集成的过程中发现了一些错误,比如全局变量重复定义、函数重复声明等,分别进行了改正。最后连续运行了5次,以便测试该游戏程序的功能、性能是否达到了预期的目标,并根据所使用的具体机器岁蛇的爬行速度进行适当的调整。测试内容包括蛇的运行、分数、关数、排行榜及排序、文件存储、音乐动画等的功能,情况均正常。最后要求输入游戏者的姓名来进行排名。1.6 结论在我们的共同努力下,我们终于完成了贪吃蛇的游戏程序,该游戏程序实现用了方向键控制蛇在围墙内的爬行、随机产生食物、控制蛇吃掉食物并加分、控制游戏中闯关的数目和蛇的运行速度、实时显示分数和关数、结束时处理和显示排行榜等功能。该游戏程序具有的界面友好、操作方便、控制准确和容错能力强等特点。但是这个贪吃蛇的游戏还有一些缺陷:1)进入游戏后,到蛇的死亡,只能玩一次就退出游戏,应该加入实现多次游戏的控制弄能。2)蛇的样子不美观,应将蛇头、蛇尾和蛇身进一步美化,使其更像真实的蛇。3)当分数达到一定的分数的时候,蛇的速度变得非常的快,一下子就撞到围墙上了,应适当控制蛇的速度和关数,以便使游戏更具有吸引力。1.7 结束语 通过贪吃蛇的游戏编程的练习思考数据结构的使用,比如定义食物的坐标来控制它的出现的位置,用函数来画出矩形,用life来表示蛇的生命,用方向键来表示蛇的移动的房间等等,还有用数组来存放蛇身各节的坐标,这些都让我们熟悉了对数组的操作,此外还熟悉了各种函数的调用。 在编程的时候我们遇到了很多的困难,这就需要我们多与别人交流。在编程的过程中,我们也发现了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点,养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。这些都是提高我们编程能力的要点。 还有在编程中最能体现简单的原则,简单的方法更容易使人被理解,更容易实现,也更容易维护。遇到问题是要优先考虑解决的最简单的方案,只有简单的方案不能满足要求的时候我们在考虑用复杂的方案。 在进行课程设计的过程中我们学到了许多别的东西。首先,我们学会了合作,要以别人的眼光看看问题,也许这样得到的会比各自得到的都要多;其次,我们学会了分工,分工是为了更好的合作,分工才能提高合作的效率;最后,我们学会了奋斗,我们相信,通过四年的学习,我们一定能写出更精彩的程序,将来会描绘出更精彩的人生。 在这里,我们要感谢我们课程设计的指导教师张凤君老师,给了我们悉心的指导,是老师经过一学期为我们上课,让我们了解了编程和怎么样编程,在老师的教导下,我们通过自己和同学的合作,我们真正的掌握了怎么样编程以及处理一些在编程的过程中出现的一些问题,我们真正的学会了这门课,在老师和同学的共同帮助下,我们完成了这项任务。1.8程序#include#include#include#include#include#include#include#include#define N 200#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define FILENAME c:person.datstruct person char name20; int score; ;struct person per5;struct Snow int x; int y; int speed; snow100;int snownum=0; int size;int change=10;int score=0;void *save;int i,key;int gamespeed=400;struct Food int x; int y; int yes;food;struct Snake int xN; int yN; int node; int direction; int life;snake;void DrawSnow();void ReadFiles();void WriteFiles(struct person *);void InitScoreFiles();void CompareScore(struct person);void EndPlay();void GameOver();void Pr() int s15=0,100,150,200,150,200,250,150,250,300,250,150,100,250,350; setcolor(change/10); setbkcolor(BLACK); settextstyle(0,0,4); outtextxy(20,200,GAME WORLD!); sound(schange/10);void DrawSnow() int i1,i2; int sx100; setlinestyle(SOLID_LINE,0,THICK_WIDTH); line (2,7,5,7); line (5,7,6,10); line (6,10,7,7); line (7,7,10,7); line (10,7,8,5); line (8,5,9,3); line (9,3,6,4.5); line (6,4.5,3,3); line (3,3,4,5); line (4,5,2,7); save=malloc(200); getimage(0,0,10,10,save); cleardevice(); randomize(); for(i1=0;i1100;i1+) sxi1=(i1+4)*10; setlinestyle(SOLID_LINE,0,THICK_WIDTH); line (10,1,10,10); for(i2=0;i2100;i2+) sxi2=(i2+4)*20; while(!kbhit() Pr(); if(snownum!=100) snowsnownum.speed=2+random(10); i1=random(50); snowsnownum.x=sxi1; snowsnownum.y=10-random(10); i2=random(20); snowsnownum.x=sxi2; snowsnownum.y=100-random(10); for(i=0;isnownum;i+) putimage(snowi.x,snowi.y,save,COPY_PUT); delay(50); cleardevice(); Pr(); if(snownum!=100) snownum+; setfillstyle(SOLID_FILL,4); for(i=0;i500)snowi.y=10-random(200); change+; if(change=140) change=10; nosound(); cleardevice();void Init(void) int gd=DETECT,gm; initgraph(&gd,&gm,D:tc3BGI); cleardevice();void DrawK(void) int i; setcolor(11); setbkcolor(2); setlinestyle(SOLID_LINE,0,THICK_WIDTH); for(i=50;i=600;i+=10)/*画围墙*/ rectangle(i,40,i+10,49); /*上边*/ rectangle(i,451,i+10,460);/*下边*/ for(i=40;i0;i-) snake.xi=snake.xi-1; snake.yi=snake.yi-1; switch(snake.direction)case 1:snake.x0+=10;break;case 2:snake.x0-=10;break;case 3:snake.y0-=10;break;case 4:snake.y0+=10;break; for(i=3;isnake.node;i+) if(snake.xi=snake.x0&snake.yi=snake.y0) snake.life=1; break; if(snake.x0595|snake.y0455) snake.life=1; if(snake.life=1) break; if(snake.x0=food.x&snake.y0=food.y) setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); snake.node+; food.yes=1; score+=10; if(score%50=0) level+=1; gamespeed-=50; setcolor(57);for(i=0;isnake.node;i+) rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10);delay(gamespeed);setcolor(0);rectangle(snake.xsnake.node-1,snake.ysnake.node-1, snake.xsnake.node-1+10,snake.ysnake.node-1-10); if(snake.life=1) break; key=bioskey(0); if(key=ESC) break; else if(key=UP&snake.direction!=4) snake.direction=3; else if(key=RIGHT&snake.direction!=2) snake.direction=1; else if(key=LEFT&snake.direction!=1) snake.direction=2; else if(key=DOWN&snake.direction!=3) snake.direction=4; void ReadFiles() FILE *fpread; if(fpread=fopen(FILENAME,ab+)=NULL) printf(cant open the file person.dat!); exit(0); if(fgetc(fpread)=EOF) InitScoreFiles(); rewind(fpread); fread(per,sizeof(struct person),5,fpread); fclose(fpread);void WriteFiles(struct person *tmp) FILE *fpwrite; if(fpwrite=fopen(FILENAME,wb+)=NULL) printf(cant open the file person.dat!);exit(0); fwrite(tmp,sizeof(struct person),5,fpwrite); fclose(fpwrite);void InitScoreFiles() int i; s

温馨提示

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

评论

0/150

提交评论