1、C 语 言 课 程 设 计 (小游戏贪吃蛇程序设计汇报) 设计人: 班级: 201 年 月 号
2、 目 录 一:概述 1:研究背景及意义 2:设计任务和需要知识点 3:具体完成设计内容 二:需求分析 1:功效需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:具体设计 1:主空摸块设计 2:绘制游戏界面 3:游戏具体过程 4:游戏结束处理 5:显示排行榜信息模块 五:程序调试和测试 1:动画和音乐同时 2:蛇运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文件 一. 概述 本课程设计以软件工程方法为指导,采取了结构化,模块化程序设计方法,以
3、C语言技术为基础,使用Turbo C++3.0为关键开发工具,对贪吃蛇游戏进行了需求分析,总体设计,具体设计,最终完成系统实现和测试。 1.1 研究背景及意义 伴随社会发展,大家生活节奏日益加紧,越来越多人加入了全球化世界。大家不再拘泥和一小块天地,加班,出差成了现代人不可避免公务。而此时一款能够随时随地娱乐游戏成为了大家需要。此次课程设计完成贪吃蛇小游戏,正是为了满足上述需求而设计出来。贪吃蛇游戏虽小,却设计很多知识点。经过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程和那个发,技术和工具开发软件过程,深入掌握结构化,模块化程序设计方法和步骤,深入掌握总体数据结构设计,模块
4、划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构使用方法,掌握图形,声音,随机数等多个库函数使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,深入学会软件调试,测试,组装等软件测试方法,为后续课程学习和未来实际软件开发打下坚实基础。 1.2 设计任务和需要知识点 1.2.1 课程设计关键完成任务 1) . 经过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计思想,培养处理实际问题能力。 2) 有同时播放动画,声音效果。 3) 设计好数组元素和蛇,食物对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存放等功效。
5、 经过此次课程设计,期望使读者能更深入了解和掌握课程教学中基础概念,培养读者应用基础技术处理实际问题能力,从而深入提升分析问题和处理问题能力。 1.2.2需要掌握和利用知识点 1.2.3此次课程设计需要掌握和利用以下知识点: 1) 数组应用。 2) 全局变量使用。 3) 按键处理。 4)结构体应用。 5)图形,音乐和动画相关知识。 6)随即函数使用。 7)文件基础出操作。 8) 结构化,模块化设计方法。 1.3具体完成设计内容 在此次课程设计中需要完成任务有:包含命令,全局变量定义和宏定义,函数申明等(50行),主控模
6、块(MAIN函数,14行),动画,音乐播放模块(DRAWSNOW函数,33行),画出游戏开始界面模块,具体游戏过程模块,游戏结束处理模块。开发中工作量约为215行源代码。 二 .需求分析 贪吃蛇游戏是个简单小游戏,能让游戏者身心得到娱乐,从而能够愈加好地投入到学习或工作当中。即使现在市面上出来这多种多样游戏版本,可是贪吃蛇这类小游戏其市场还是相当大,因为它玩法简单易行,不管是手机,还是小游戏机,全部能很顺利运行。对于在外忙碌人,不可能花费大量时间在娱乐上,大型游戏是行不通,这么小游戏刚好迎合了她们需求。 2.1功效需求 要开发贪吃蛇游戏程序,首先要分析改程序
7、应实现哪些功效。对贪吃蛇游戏程序功效需求可描述以下: 程序运行后显示动画,音乐,按ESC键退出游戏界面后,左边有一个矩形区,外游戏区域,在矩形区中有食物和贪食蛇,上方有统计分数及关数显示区域。 蛇在封闭围墙利用绿色矩形表示,围墙里随机出现一个食物,经过按键盘四个光标键控制蛇向上,下,左右四个方向移动,蛇头撞到食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等候蛇来吃。食物用一个点表示,而且每次食物位置全部是随机出现。游戏中要使贪吃蛇尽可能长,不过不能使贪吃蛇撞到四面墙壁,而且蛇身体不能撞到一起,不然游戏结束。游戏中每吃掉一个食物要有积分,伴随分数增加可进入下一关,即使速度
8、会加紧。游戏结束时,假如分数进入前5名则重新排榜并存放。显示排行榜。因为相关贪吃蛇和食物数据较多,而且关系亲密,贪吃蛇及食物全部是定义结构体数据类型,这么定义便于操作和处理。 2.2 操作方法 2.2.1.进入游戏 2.2.2.游戏界面 2.2.3.游戏操作 2.2.4.游戏结束 三 总体设计 确定贪吃蛇游戏体系结构,给出总体模块结构图,确定程序关键函数及之间调用关系,同时设计蛇和游戏者等数据结构。 3.1 模块划分 本程序采取结构化程序设计方法,根据自顶向下,逐步细化方法对要处理问题进行逐层分解。首先画出顶层模块,即主控模块,之完成对下层模块调
9、用功效,即调用其它功效模块;接着,按需求分析中功效需求设计第一层模块,有音乐动画,图形驱动,画主界面,游戏过程,结束处理,退出等第6个关键功效;接着,画出第二层模块。总体模块结构图6-1所表示。 主 控 模 板 退 出 结束处理 游戏过程 画主界面 图形驱动 动画音乐 排 行榜 写入文件 成绩排序 读取统计 3.1.1. 主控模块。 3.1.2. 动画音乐模块 3.1.3. 画主界面模块 3.1.4. 游戏过程模块 3.1.5. 游戏结束处理模块
10、 3.1.6. 读取统计模块 3.1.7. 成绩排序模块 3.1.8. 写入文件模块 3.1.9. 排行榜模块 3.1.10. 退出 3.2 总体数据结构设计 设计思绪:测序关键在于表示蛇图形及蛇移动。用一个小不足方块表示蛇一节身体,身体每长一节,增加一个矩形块,蛇头业用一样一节小矩形方块表示移动时必需从蛇能够上向前爬行,档案下有效方向键后,应先确定蛇头位置,以后蛇身体虽蛇头移动,图形实现是从身体新位置开始画出蛇。这时,因为未清屏原因,原来蛇位置和新蛇位置差一节蛇身,即看起来蛇多一节身体,所以将蛇最终一节用背景色覆盖。食物出现和消失意识画矩形块和覆盖矩形块。为了便于了解,
11、定义两个结构体:食物和蛇。下面介绍贪吃蛇游戏程序关键数据结构。 3.2.1 食物和蛇数据结构 表示食物和蛇矩形块设计为10*10个像素单位,食物基础数据域为它所出现位置,用X和Y坐标表示,则矩形块用函数RECTANGLE(X,Y,X+10,Y+10)或RECTANGLE(X,Y,X+10,Y-10)能够画出。因为每次只出现一个食物,所以设定YES表示是否需要出现食物。YES=1表示没有食物或食物已经被蛇吃掉,需要画出食物。放置食物后,置YES=0。蛇一节身体为一个矩形块,表示矩形块只需左上角点坐标(X,Y)。因为在游戏过程中蛇身体不停增加,需用数组存放每节坐标,最大设定为N=20
12、0,NODE表示目前节数。DIRECTION是保留蛇移动方向变量,其值可为1、2、3、4之一,分别表示右、左、上、下方向。LIFE是表示生命变量,LIFE=0表示蛇活着,一旦LIFE=1,一旦LIFE=1,表示蛇死,结束游戏。 #define N 200 Struct Food { int x; int y; Int yes; }food; Struct Snake { int x[N]; Int y[N]; Int node; Int derection; Int life
13、 }snake; 3.2.2 排行榜中优胜者数据结构 排行榜关键统计优胜者姓名和成绩。为了存放排行榜信息,可定义以下结构体类型,其中字符数组name组员存放优胜者姓名,整型变量score组员存放优胜者成绩。 Struct person { char name[20]; Int score; }; 3.2.3 其它全局变量定义 Struct person per[5]; Int score=0; Int gamespeed=400; 3.2.4 符号常量宏定义 #define LEFT 0x4b00;
14、 #define RIGHT 0x4d00; #define DOWN 0x5000; #define UP 0x4800 #define ESC 0x011b #define FILENAME 四. 具体设计 依据总体设计模块功效和结构,完成所负担程序模块算法设计。给出每个模块具体算法,算法分别用传统步骤图和文字说明来描述。 4.1 主控模块main函数 主函数是程序主控模块。首先初始化图形系统,然后使用drawsnow函数播放动画和声音,接着调用init函数初始化图形系统,以后调用drawk函数画出游戏开始画面,在调用
15、gameplay函数,即开始了游戏具体过程,游戏结束后调用endplay函数进行游戏结束处理;从文件中读取统计信息,排序,显示排行榜信息,最终关闭图形系统,结束程序。主控模块步骤图图6-2所表示。其中带有两个竖线矩形框表示对自定义函数调用。 开始 初始化图形系统 播放动画音乐 余下步骤图在下页 初始化图形系统 画游戏开始界面 游戏具体过程 游戏结束处理 关闭图形系统
16、 结束 4.2 绘制游戏开始界面drawk函数 绘制游戏界面函数算法步骤图图6-3所表示。 主界面就是一个封闭围墙,用两个循环语句分别在水平方向和垂直方向输出连续宽度和高均为10个像素单位距行小方块,围成封闭图形表示围墙,为了醒目,设置为淡青色,用函数setlinestyle设直线型宽度为3个像素,设置3个像素围墙线,。最终,在界面左上部输出游戏程序版本信息,在右上部输出游戏成绩(score)和关(level)表头。 4.3 游戏具体过程gameplay函数 该函数是游戏关键部分。游戏具体过程gameplay函数大致算法步骤图图
17、6-4所表示。 下面对该算法不够具体地方作深入描述。 开 始 初始化 未按键 为食物 质优食物标志 随即确定食物 有食物 画食物 输出成绩和关数 输出蛇位置 确定蛇头位置 窗蛇身,蛇死 蛇撞墙 置蛇死标志 蛇死 吃到物 吃后处理 循环画蛇 延迟10秒 除蛇尾,增节 蛇死 接收按键 key
18、 key=ESC 结 束 由按键判蛇位置 4.3.1 初始化 为预防食物总是出现在一个位置上,要设置随机数发生器种子数,产生真正随机数。因为还没有画出食物,并设置需要食物,并设置蛇活着。初始时,蛇只有蛇头和1节蛇尾,设置这2节坐标。设定蛇开始爬行方向左右。 4.3.2 随机确定食物位置 因为蛇吃到食物判定是蛇头坐标和食物坐标相等,所以要确保食物出现位置在10倍数位置上。先用两个带随机函数表示式产生一个在围墙内x、y坐标,然后用两个while循环将两个坐标值调整到10倍数上,这么就能够让蛇吃到。 4.3.3 循环确定蛇身新坐标
19、 这里难点是表示蛇新位置并消除前一次图形。采取方法是每次移动时候从最终一节开始到第二节,将前一节坐标值赋给后一节坐标,移动后只要把最终一节用背景色擦出即可,因为新位置0到n-1节还是要出现在画面上。这里用一个for循环来确定蛇身新坐标。 4.3.4 吃到食物后处理 蛇吃到食物后,首先将食物擦除,即用背景色画出该食物,然后给蛇节数加1,设置需要食物标志,是游戏成绩加10分,假如成绩达成50分倍数,则给关数加1,并加紧游戏速度。 4.3.5 有按键判定蛇方向 这是一个内嵌嵌套条件选择结构,依据安东上下左右键来设定蛇移动方向。其中1=向右,2=向左,3=向上,4=向下
20、判定是还考虑相反方向键无效,比如蛇正在向上爬行,按下一键方向是无效。 4.4 游戏结束处理木块ENDPLAY函数 游戏结束时,应该用ENDPLAY函数进行游戏结束处理,其算法步骤图图6-5所表示 。开 始 读排行榜统计文件 score>per[4].score 画出填充矩形界面 输出提醒信息 输出空格建立输入框 余下步骤图在下页 输出不够上排行榜信息 输入游戏者姓名 成绩赋值 统计按成绩排序 统计写入排行榜文件 显示排行榜 返回 该块首先调用读取排行榜文件统计
21、假如文件不2存在,则在READFILES函数中调用INITSCOREFILES函数建立该文件,然后再读出统计。 其次,判定游戏者成绩是否能够上排行榜。假如能够上榜,则画出淡蓝色矩形界面,在界面中输入游戏者姓名,对成绩进行赋值,然后调用 CompareScore 函数对统计排序,并调用 Writefiles 函数将统计写入排行榜帮文件;假如不能上榜,则直接在游戏界面输出不能上榜信息。 最终,调用 pain_board 函数显示排行榜信息。 4.5 函数void pain_board完成排行榜绘制. 五. 程序调试和测试 调试和测试软件目标就
22、是发觉并更正潜伏错误。一个程序,必需经过认真调试和测试,才能尽可能降低错误、确保程序满足功效、性能需求,达成最初设计、使用要求,从而确保程序开发质量。 具体设计完成后,就能够用C语言依据各个模块算法来设计程序,每个模块全部要设计成一个自定义函数。多个模块能够放在一起组成一个原函数程序文件,也能够一个模块组成一个源程序文件。原程序设计好后,输入到计算机中,并存放到磁盘上;然后对每个源程序文件全部进行了独立编译和调试(具体代码能够参看程序清单);并针对不一样模块程序设计测试用例进行单元测试;最终,将多个分别开发模块组装在一起,形成一个完整程序,进行集成测试,从而发觉并更正了程序程序中存在部分潜藏
23、错误,并使程序容错能力大大增强。 5.1 动画和音乐同时播放 预期结果:片头在显示动画得同时播放音乐;按任意键后进入游戏主界面;进入游戏主界面后动画音乐同时停止。 实际运行效果:满足和,不满足,即进入游戏后仍然播放片头音乐。 错误分析:程序中使用循环播放动画,并在其循环体中插入发声函数以达成音乐和动画同时。因为在结束动画时没相关闭扬声器,所以进入游戏界面后仍然发声。 修改:在动画播放完后加一条“nosound();”语句将扬声器关闭,问题得四处理。 修改后程序运行实际效果和预期效果一致。 5.2 蛇运行 5.2.1 蛇撞到墙 预期结果:蛇运行时假如撞到
24、墙壁,则游戏结束。 实际运效果:超出左右墙壁后程序结束,但超出上面墙壁后仍然运行,图6-9所表示。 错误分析:错误程序段在蛇运行中条件判定语句中,其判定条件是: 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) 修改后程序运行结果和预期结果一致。 5.2.2 蛇头闯到蛇身 预期结果:当蛇得头部和蛇
25、身相撞时,游戏应该结束。
实际运行效果:蛇头撞到蛇身时,程序并不终止。
错误分析:在蛇运行判定程序犯错,其代码以下
Fori=3;i 26、集成测试。在集成过程中发觉了部分错误,比如全局变量反复定义、函数反复申明等,分别进行了更正。最终连续运行了5次,方便测试该游戏程序功效、性能是否达成了预期目标,并依据所使用具体机器对蛇爬行速度进行合适调整。测试内容包含蛇运行、分数、关数、排行榜及排序、文件存放、音乐动画等功效,情况均正常。
六. 结论
经过2周课程设计,在开发小组共同努力下,最终完成了贪吃蛇游戏程序开发任务。该游戏程序实现了用方向键控制蛇在围墙内爬行、随机产生食物、控制蛇吃掉食物并加分、控制游戏中闯关数目和蛇运行速度、实时显示得分和关数、结束时处理和显示排行榜等功效。该游戏程序含有界面友好、操作方便、控制正确和容错能力 27、强等特点。
这个贪吃蛇游戏还存在部分缺点,还应该在以下多个方面加以改善。
1) 进入游戏后,到蛇死亡,只能玩一次就会退出程序。应加入数次游戏控制能力。
2) 蛇样子不美观,应将蛇头、蛇尾和蛇身深入美化,使其更像真实蛇。
3) 当分数达成400分时,蛇速度变得很快,一下子就撞到围墙上了,应合适控制蛇速度和关数,方便使游戏更含有吸引力。
七.结束语
贪吃蛇游戏编程练习思索数据结构:定义食物坐标来控制它出现位置,用一系列函数时进行表示,比如用函数rectangle来画出矩形,用life变量值表示蛇生命,用direction变量值表示蛇移动方向等,还有用数组来存放蛇身各节坐标,这些 28、全部让我们熟悉了对数组操作,另外还熟悉了多种函数应用。
贪吃蛇设计有很多帮助,学习编写贪吃蛇游戏对掌握C语言知识有很大帮助。经过编程实践,还能拓展思绪,让我们去寻求需要调用那些函数,怎样提升程序质量等。
要写出好程序,需要我们有扎实基础,这么碰到部分基础算法时候就会游刃有余了。在编程时我们要有丰富想象力,不要拘泥和固定思维方法,碰到问题时侯要多想多个处理问题方案。丰富想象力是建立在丰富知识基础上,所以我们要经过多个路径来帮助自己建立较丰富知识结构。
在编程是我们碰倒了很多困难,这就需要我们多和她人交流。在编程过程中,我们也发觉有良好编程风格是十分关键,最少在时间效率上就表现了这一点 29、养成良好习惯,代码缩进编排,变量命名规则要一直保持一致,这些全部是提升我们编程能力关键点。
在进行课程设计过程中我们也学到了很多别东西。首先,我们学会了合作,要以她人眼光看看问题,可能这么得到会比各自得到全部要多;其次,我们学会了分工,分工是为了愈加好地合作,分工才能提升合作效率;最终,我们学会了奋斗,我们相信,经过四年学习,我们一定能写出更出色程序,未来会描绘出更出色人生。
在这里,我们要感谢指导课程设计张凤君老师,给我们悉心指导。老师数次问询编写进程,并为我们指点迷津,帮助我们开拓研究思绪,精心点拨、热心激励。老师一丝不苟工作作风,严谨求实态度,踏扎实实精神,不仅受我以文,而且教我 30、做人,给以终生受益无穷之道。我还要感谢我们开发小组其它同学,在设计中她们给我很大帮助。正是因为我们团结协作,才顺利完成了课程设计任务。
八.程 序 清 单
/*贪吃蛇游戏程序清单*/
#include 31、
#define esc 0x011b /*esc键*/
#define n 200 /*蛇最大节数*/
#define left 0x4b00 /*左移方向键*/
#define right 0x4d00 /*右移放向键*/
#define down 0x5000 /*下移方向键*/
#define up 0x4800 /*上移方向键*/
/*排行榜结构体*/
struct person
{int score; /*游戏者分数*/
char name[20]; /*游戏者姓名*/
}per[5];
/*小蘑菇结构体* 32、/
/*自定义函数申明*/
void drawmogu(); /*动画音乐函数*/
void readfiles(); /*从文件中读取统计信息*/
void writefiles(struct person *) ; /*将纪录写入文件中*/
void initscorefiles(); /*初始化统计文件*/
void comparescore(struct person); /*排行榜按分数进行排序*/
void endplay(); /*游戏结束处理函数*/
void paihb(); /*绘制排行榜函数*/
/*输出欢迎词并播放声 33、音函数*/
void pr()
{ int s[15]={0,100,150,200,250,300,250,150,100,250,350};
setcolor(change/10);/*改变欢迎词颜色*/
settextstyle(0,0,4);
outtextxy(20,200,"WELCOME TO OUR GAME");/*输出欢迎词*/
sound(s[change/10]);/*使扬声器以括号内频率发声*/
}
/*下雪动画并同时播放音乐函数*/
void DrawSnow()
{ int i;
int sx[62];
34、
selinestyle(SOLID_LINE,0,THICK_WIDTH);
line(1,1,9,9);/*一次3行画出白色雪花3条线*/
line(0,5,10,5);
line(9,1,1,9);
save=malloc(200);/*在堆中申请200字节空间*/
getimage(0,0,10,10,save);/*将雪花位图保留到save中*/
cleardevice();/*清屏*/
randomize();/*设置随机种子数*/
for(i=0;i<62;i++)
sx[i]=(i+2)*10/*计算 35、雪花位置横坐标数组*/
/*以下键控while循环控制播放音乐和下雪动画*/
while(!kbhit())/*假如未按键,实施循环体*/
{ Pr();/*调用Pr函数输出欢迎词并播放声音*/
if(snownum!=100)
{snow[snownum].speed=2+random(5);
i=random(62);
snow[snownum].x=sx[i];/*取横坐标*/
snow[snownum].y=10-random(100);/*取纵坐标*/
}
/*循环放置snown 36、um个雪花*/
for(i=0;i 37、m个雪花*/
{ 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();/*清屏*/
}
/*图像系统初始化函数*/
void init(void)
{ int gd=DETECT,gm;
initgraph(& 38、gd,&gm,"c:\\tc3\\BGI");
cleardevice(); /*清屏*/
}
/*游戏开始界面,左上角坐标为(50,40),右下角坐标(610,460)围墙*/
void drawk(void)
{
int i;
setcolor(BLUE);
setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*设置线性*/
for(i=50;i<=600;i+=10) /*用循环画围墙*/
{setcolor(2*i+1);
circle(i,40,5); /*画上边*/
ci 39、rcle(i,451,5);
circle(i,460,5); /*画下边*/
}
for(i=40;i<=450;i+=10)
{setcolor(2*i+1);
circle(50,i,5); /*画左边*/
circle(601,i,5);
}
for(i=40;i<=460;i+=10)
{setcolor(2*i+1);
circle(41,i,5); /*画右边*/
circle(610,i,5);
}
setcolor(LIGHTC 40、YAN);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
outtextxy(20,5," GREEDY SNAKE GAMES ji 11_1"); /*输出版本*/
outtextxy(480,10,"score level "); /*输出此文本*/
}
/*玩游戏具体过程*/
void gameplay(void)
{food.yes=1; /*0表示苹果已经存在,1表示需要出现新苹果*/
snake.life=0; /*蛇活着*/
int level=1; /*统计游戏等级*/
41、
char buffer[10]; /*字符数组用于转换整形数据*/
randomize(); /*设置随机数种子数*/
snake.direction=1; /*方向向右*/
snake.x[0]=110;snake.y[0]=100; /*蛇头坐标初值*/
snake.x[1]=100;snake.y[1]=100; /*蛇身1节坐标初值*/
snake.x[2]=90;snake.y[2]=100; /*蛇身2节坐标初值*/
snake.node=3; /*蛇节数初值*/
while(1) /*玩游戏死循环,按esc键 42、或蛇死时结束*/
{ while(!kbhit()) /*在没有按键情况下,蛇自己移动身体*/
{if(food.yes==1) /*需要出现新苹果*/
{food.x=rand()%400+60; /*在墙内随机产生苹果横坐标*/
food.y=rand()%350+60; /*在墙内随机产生苹果纵坐标*/
/*事物随机产生后必需让苹果能够在整格上,这么才能吃到*/
while(food.x%10!=0) food.x++;
while(food.y%10!=0) food.y++;
43、
food.yes=0; /*画面上有苹果了*/
}
if(food.yes==0) /*画面上有苹果就要画出来*/
{setcolor(GREEN);
setfillstyle(SOLID_FILL,GREEN);
circle(food.x,food.y,5);
fillellipse(food.x,food.y,5,5);
}
setfillstyle(1,BLUE);
bar(475,18,590,35); /*画出显示分数及关数蓝色矩形条*/
setcolor 44、WHITE);
itoa(score,buffer,10); /*将整形数据分数转换成字符串*/
outtextxy(480,20,buffer); /*输出分数*/
itoa(level,buffer,10); /*将整形数据关数转换成字符串*/
outtextxy(560,20,buffer); /*输出关数*/
/*循环使蛇每一节往前移动,这是贪吃蛇“关键算法”*/
for(i=snake.node-1;i>0;i--)
{snake.x[i]=snak 45、e.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1、2、3、4表示右、左、上、下四个方向,经过这个判定来移动蛇头*/
switch(snake.direction)
{case 1:snake.x[0]+=10;break;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0]+=10;break;
}
/*判定蛇是否撞到墙*/
i 46、f(snake.x[0]<55||snake.x[0]>595||snake.y[0]<45||snake.y[0]>445)
{snake.life=1; /*置蛇死标志*/
break;
}
/*从蛇第四节开始判定是否撞到自己,*/
for(i=3;i 47、
if(snake.life==1) /*以上两种判定以后,假如蛇死就跳出内循环*/
break; /*跳出while(!kbhit)*/
if(snake.x[0]==food.x&&snake.y[0]==food.y) /*吃到苹果以后*/
{setcolor(BLACK); /*把画面上苹果擦除*/
circle(food.x,food.y,5);
snake.node++; /*蛇身体长一节*/
food.yes=1; /*画面上需要出现新苹果*/
48、 score+=10; /*没吃一个苹果增加10分*/
if(score%50==0) /*吃够5个苹果进入下一关*/
{level+=1; /*关数加1*/
gamespeed-=60; /*控制速度值降低60,方便加紧速度*/
}
}
setcolor(RED); /*画出红色蛇循环*/
setfillstyle(SOLID_FILL,RED); /*用圆画出红色蛇头*/
fillellipse(snake.x[0],snake.y[0],5,5);
49、 setcolor(GREEN);
setfillstyle(SOLID_LINE,GREEN);
circle(snake.x[0],snake.y[0],1); /*对蛇头填充绿色小圆作为眼睛*/
setcolor(RED);
setfillstyle(SOLID_FILL,BLUE);
for(i=1;i 50、 fillellipse(snake.x[i],snake.y[i],5,5); /*对每节蛇身用蓝色填充*/
setcolor(CYAN);
circle(snake.x[i],snake.y[i],1); /*用青色小圆画在每节蛇身上*/
}
delay(gamespeed); /*延迟gamespeed毫秒,方便控制蛇爬行速度*/
setcolor(BLACK); /*用背景色黑色去除蛇最终一节*/
circle(snake.x[snake.node-1],snake.y[snake.node-1],5)






