贪吃蛇报告完整版.docx

上传人:b****1 文档编号:10524976 上传时间:2023-05-26 格式:DOCX 页数:28 大小:132.57KB
下载 相关 举报
贪吃蛇报告完整版.docx_第1页
第1页 / 共28页
贪吃蛇报告完整版.docx_第2页
第2页 / 共28页
贪吃蛇报告完整版.docx_第3页
第3页 / 共28页
贪吃蛇报告完整版.docx_第4页
第4页 / 共28页
贪吃蛇报告完整版.docx_第5页
第5页 / 共28页
贪吃蛇报告完整版.docx_第6页
第6页 / 共28页
贪吃蛇报告完整版.docx_第7页
第7页 / 共28页
贪吃蛇报告完整版.docx_第8页
第8页 / 共28页
贪吃蛇报告完整版.docx_第9页
第9页 / 共28页
贪吃蛇报告完整版.docx_第10页
第10页 / 共28页
贪吃蛇报告完整版.docx_第11页
第11页 / 共28页
贪吃蛇报告完整版.docx_第12页
第12页 / 共28页
贪吃蛇报告完整版.docx_第13页
第13页 / 共28页
贪吃蛇报告完整版.docx_第14页
第14页 / 共28页
贪吃蛇报告完整版.docx_第15页
第15页 / 共28页
贪吃蛇报告完整版.docx_第16页
第16页 / 共28页
贪吃蛇报告完整版.docx_第17页
第17页 / 共28页
贪吃蛇报告完整版.docx_第18页
第18页 / 共28页
贪吃蛇报告完整版.docx_第19页
第19页 / 共28页
贪吃蛇报告完整版.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

贪吃蛇报告完整版.docx

《贪吃蛇报告完整版.docx》由会员分享,可在线阅读,更多相关《贪吃蛇报告完整版.docx(28页珍藏版)》请在冰点文库上搜索。

贪吃蛇报告完整版.docx

贪吃蛇报告完整版

课程设计基础课程设计

贪吃蛇游戏设计

院系:

___________

班级:

___________

姓名:

___________

合作者:

___________

指导教师:

___________

 

时间_____年____月____日

 

 

1.1概述

本课程设计一软件方法为指导,采用了结构化、模块化、的程序设计方法,以C语言技术为基础,使用TurboC++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,表示蛇已经死了,结束游戏。

#defineN200

structFood

{

intx;/*食物的横坐标*/

inty;/*食物的纵坐标*/

intyes;/*判断是否要出现食物的变量*/

}food;/*食物的结构体*/

structSnake

{

intx[N];

inty[N];

intnode;/*蛇的节数*/

intdirection;/*蛇移动方向*/

intlife;/*蛇的生命,0活着,1死亡*/

}snake;

2.排行榜中优胜者的数据结构

排行榜主要记录优胜者的姓名和成绩,为了存放排行榜的信息,可以定义下面的结构体类型,其中字符数组name成员存放优胜者的姓名,整型变量score存放优胜者的成绩。

structperson

{

charname[20];

intscore;

};

其他全局变量的定义

structpersonper[5];

intscore=0;

intgamespeed=400;/*控制蛇的移动速度的变量,初始值为400ms*/

4.符号常量的宏定义

#defineLEFT0x4b00/*左移方向键*/

#defineRIGHT0x4d00/*右移方向键*/

#defineDOWN0x5000/*下移方向键*/

#defineUP0x4800/*上移方向键*/

#defineESC0x011b/*Esc方向键*/

#includeFILENAME“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)的表头。

如下图所示:

 

1.4.3游戏具体过程GamePlay函数

该函数是游戏的核心部分。

游戏具体过程GamePlay函数大致算法流程如图所示。

下面对该算法不够详细的地方作进一步的描述。

 

1)初始化。

为防止食物总是出现在一个位置上,要设置随机数发生器的种子数,产生真正的随机数。

由于还没有画出食物,并设置需要食物,并设置蛇活着。

初始时,蛇只有蛇头和1节蛇身,设置这2节坐标。

设定蛇开开始的爬行方向向右。

2)随机确定食物位置。

由于蛇吃到食物的判断是蛇头的坐标和食物的坐标相等,所以要确保食物随机出现的位置在10的倍数位置上。

先用两个带随机函数的表达式产生一个位于围墙内的x,y坐标,然后用两个while循环将两个坐标值调整到10的倍数上,这样就可以让蛇吃到。

3)循环确定蛇身的新位置。

这里的难点是表示蛇的新位置并消除前一次的图形。

采用的方法是每次移动的时候从最后一节开始到第二节,将前一节的坐标的值赋给最后一节的坐标,移动后只要把最后一节用背景色除去即可。

这里用for循环来实现这样的新位置。

4)吃到食物后的处理。

蛇吃到食物后,首先将食物擦除,即使用背景色画出该食物,然后给蛇的节数增加1节,设置需要食物标志,使游戏成绩加10分,如果成绩达到50分的倍数,则给关数增加一关。

并加快游戏速度。

5)由按键判断的方向,这是一个内嵌的条件结构,根据按动上、下、左、右方向键来设定蛇的移动方向。

判断时还要考虑了相反方向键无效,比如蛇正在向上爬行,按下移方向键是无效。

1.4.4游戏结束处理模块处理函数

游戏结束的时候,用该调用函数来进行游戏结束处理。

其算法流程图如下:

 

 

该模块首先调用读排行榜记录文件函数读取排行榜文件记录,如果文件不存在,在函数中调用另一个函数来建立文件,然后再读出记录。

其次,判断游戏者的成绩是否可以上排行榜。

如果可上榜,则画出浅蓝色矩形界面,在界面中输入游戏者姓名,对成绩进行赋值,然后调用CompareScore函数对记录排序,并调用WriteFiles函数将记录写入排行榜文件;如果不能上榜,则直接在游戏界面输出不能上榜信息。

最后,调用pain_borad函数显示排行榜信息。

1.4.5显示排行榜信息模块pain_board函数

函数voidpain_board完成排行榜的绘制流程,流程图如图所示。

运行结果如图所示。

 

1.5程序的调试与测试

调试与测试软件的目标就是发现并改正潜伏的错误。

一个程序,必须经过认真的调试和测试,才能尽量减少错误、保证程序满足功能、性能需求,达到最初的设计、使用要求,从而保证程序的开发质量。

详细设计完成后,用C语言根据各个模块的算法来设计程序,每个模块都设计成一个自定义函数。

几个模块放在一个构成一个源程序文件,或者一个模块构成一个源程序文件。

源程序设计好后,输入到计算机,并储存到磁盘上;然后对每个源程序文件都进行独立编译和调试;并针对不同的模块设计测试用例进行单元测试;最后,将几个分别开发的模块组装到一起,形成一个完整的程序,进行集成测试,从而发现并改正程序中存在的一些潜藏的错误,并使程序的容错能力大大增强。

调试与测试过程及结果如下所述。

1.5.1动画与音乐的同步播放

预期结果:

(1)片头在显示动画的同时播放音乐;

(2)按任意键后进入游戏主界面;(3)进入游戏主界面后动画音乐同时停止。

实际运行结果:

满足

(1)和

(2),进入游戏后仍然播放片头音乐。

错误分析:

程序中使用循环播放动画,并在其循环体中插入发声函数以达到音乐和动画的同步。

由于在结束动画时没有关闭扬声器,所以进入游戏界面后仍然发声。

修改:

在动画播放完后加一条“nosound();”语句将扬声器关闭,问题得到解决。

修改后程序运行的实际结果与预期效果一致。

动画音乐的界面如图所示。

 

1.5.2蛇的运行

(1)蛇撞到墙

预期效果:

蛇运行时如果撞到墙壁,则游戏结束。

实际运行效果:

超出左右墙壁后程序结束,但超出上面墙壁后仍然运行如图所示。

错误分析:

错误程序段在蛇运行的条件判断语句中,它的判断条件是:

if(snake.x[0]<55||snake.x[0]>595),即少了上、下俩个方向的判断。

修改如下:

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)

修改后的运行效果和预期的效果一致。

 

(2)蛇头撞到蛇身

预期结果:

当蛇的头部和蛇身相撞的时候,游戏应当结束。

实际运行的效果:

蛇头撞到蛇身时,程序停止了。

如图所示。

修改后的代码为:

for(i=3;i

{if(snake.x[i]==snake.x[0]&&sanke.[i]==snake.y[0])

{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

#defineN200

#defineLEFT0x4b00

#defineRIGHT0x4d00

#defineDOWN0x5000

#defineUP0x4800

#defineESC0x011b

#defineFILENAME"c:

\\person.dat"

structperson

{

charname[20];

intscore;

};

structpersonper[5];

structSnow

{

intx;

inty;

intspeed;

}snow[100];

intsnownum=0;

intsize;

intchange=10;

intscore=0;

void*save;

inti,key;

intgamespeed=400;

structFood

{

intx;

inty;

intyes;

}food;

structSnake

{

intx[N];

inty[N];

intnode;

intdirection;

intlife;

}snake;

voidDrawSnow();

voidReadFiles();

voidWriteFiles(structperson*);

voidInitScoreFiles();

voidCompareScore(structperson);

voidEndPlay();

voidGameOver();

voidPr()

{ints[15]={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,"GAMEWORLD!

!

");

sound(s[change/10]);

}

voidDrawSnow()

{inti1,i2;

intsx[100];

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;i1<100;i1++)

sx[i1]=(i1+4)*10;

setlinestyle(SOLID_LINE,0,THICK_WIDTH);

line(10,1,10,10);

for(i2=0;i2<100;i2++)

sx[i2]=(i2+4)*20;

while(!

kbhit())

{Pr();

if(snownum!

=100)

{snow[snownum].speed=2+random(10);

i1=random(50);

snow[snownum].x=sx[i1];

snow[snownum].y=10-random(10);

i2=random(20);

snow[snownum].x=sx[i2];

snow[snownum].y=100-random(10);

}

for(i=0;i

putimage(snow[i].x,snow[i].y,save,COPY_PUT);

delay(50);

cleardevice();

Pr();

if(snownum!

=100)snownum++;

setfillstyle(SOLID_FILL,4);

for(i=0;i

{snow[i].y+=snow[i].speed;

putimage(snow[i].x,snow[i].y,save,COPY_PUT);

if(snow[i].y>500)snow[i].y=10-random(200);

}

change++;

if(change==140)change=10;

}

nosound();

cleardevice();

}

voidInit(void)

{intgd=DETECT,gm;

initgraph(&gd,&gm,"D:

\\tc3\\BGI");

cleardevice();

}

voidDrawK(void)

{inti;

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;i<=450;i+=10)

{

rectangle(50,i,59,i+10);/*左边*/

line(601,i,610,i+10);/*右边*/

}

outtextxy(20,5,"GreedySnakeGamecomefromji11-206");

outtextxy(480,10,"scorelevel");

}

voidGamePlay(void)

{

intlevel=1;

charbuffer[10];

randomize();

food.yes=1;

snake.life=0;

snake.direction=1;

snake.x[

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2