C语言编程实现贪食蛇游戏文档格式.docx
- 文档编号:18296655
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:27
- 大小:300.30KB
C语言编程实现贪食蛇游戏文档格式.docx
《C语言编程实现贪食蛇游戏文档格式.docx》由会员分享,可在线阅读,更多相关《C语言编程实现贪食蛇游戏文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
C语言功能丰富、表达力强、使用灵活方便、应用面广、目标程序高、可移植性好,既具有高级语言的优点,有具有低级语言的许多特点,因此特别适合于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发,著名的UNIX操作系统就是用C语言编写的[1]。
C语言是由玫瑰贝尔研究所的D.Mritchie于1972年推出,1978年后,C语言已经先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序[2]。
我们利用电脑或者游戏机玩的游戏都可以利用C语言来进行编写,大部分也都是用C进行编写的,其中2D的贪食蛇游戏是利用编写的经典案例[3]。
2贪食蛇系统方案制定
2.1方案的提
出
方案一:
利用C语言编程实现贪食蛇游戏
流程图如下
图1C语言编写贪食蛇流程图
方案二:
利用JAVA语言编程实现贪食蛇游戏[4][5]
流程图如下
.
图2利用Java编写贪食蛇流程图
2.2方案比较
通过流程图可以看出,方案一与方案二的区别在于游戏可否中途退出和暂停,这一模块牵扯到很多的内容。
2.3方案的论证
利用Java设计比较复杂,它涉及面广,牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新,数据的收集与更新。
而且在这个游戏的开发中,还要应用到类的继承机制以及一些设计模式。
在设计开发过程中,需要处理好各个类之间的继承关系。
还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系[6]。
而利用C语言则比较方便,并且我们对C语言的熟悉度比较高,所以,我们选择了利用C来开发这个游戏。
2.4方案的选择
通过比较,得出利用JAVA实习目标较复杂。
且相比较而言。
我们更熟悉C编程,从而选择方案一,利用C语言来实现设计的目标。
3系统方案设计
3.1各单元模块的划分与功能介绍
本程序采用结构化程序设计的方法,按照自顶向下,逐步细化的方法对要解决的问题进行逐层分解。
首先画出顶层模块,即主控模块,之完成对下层模块的调用功能,即调用其他的功能模块;
接着,按需求分析中的功能需求设计第一层模块,有图形驱动,画主界面,游戏过程,结束处理,退出等第6个主要功能;
接着,画出第二层模块[7][8]。
总体模块结构如图
图3总体模块结构图
3.2总体数据结构设计
设计思路:
测序的关键在于表示蛇的图形及蛇的移动。
用一个小局限性方块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头业用同样的一节小矩形方块表示移动时必须从蛇可以上向前爬行,档案下有效方向键后,应先确定蛇头的位置,而后蛇的身体虽蛇头移动,图形的实现是从身体新位置开始画出蛇。
这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一节蛇身,即看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失意识画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:
食物与蛇。
下面介绍贪吃蛇游戏程序的主要数据结构。
3.3主要函数的介绍
①主控模块main函数
主函数是程序的主控模块。
首先初始化图形系统,然后使用draw函数播放动画,接着调用init函数[9]初始化图形系统,之后调用drawk函数[9]画出游戏开始画面,在调用gameplay函数[9],即开始了游戏的具体过程,游戏结束后调用endplay函数[9]进行游戏结束处理;
最后关闭图形系统,结束程序。
主控模块的流程图如下图所示。
其中带有两个竖线的矩形框表示对自定义函数的调用。
图4main函数模块
②绘制游戏开始界面drawk函数
主界面就是一个封闭的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的矩形小方块,围成封闭图形表示围墙,在界面的左上部输出游戏程序的版本信息,在右上部输出游戏成绩(score)的表头。
3.4系统整体程序设计
贪食蛇游戏具体实现过程gameplay函数,该函数是游戏的核心部分。
游戏具体过程gameplay函数的大致算法流程图如下图所示。
图5gameplay函数流程图
①初始化
为防止食物总是出现在一个位置上,要设置随机数发生器的种子数,产生真正的随机数。
由于还没有画出食物,并设置需要食物,并设置蛇活着。
初始时,蛇只有蛇头和1节蛇尾,设置这2节坐标。
设定蛇开始的爬行方向左右。
②随机确定食物位置
由于蛇吃到食物的判断是蛇头的坐标和食物的坐标相等,所以要确保食物出现的位置在10的倍数位置上。
先用两个带随机函数的表达式产生一个位于围墙内的x、y坐标,然后用两个while循环[10]将两个坐标值调整到10的倍数上,这样就可以让蛇吃到。
③循环确定蛇身的新坐标
这里的难点是表示蛇的新位置并消除前一次的图形。
采用的方法是每次移动的时候从最后一节开始到第二节,将前一节的坐标值赋给后一节的坐标,移动后只要把最后一节用背景色擦出即可,因为新位置0到n-1节还是要出现在画面上的。
这里用一个for循环来确定蛇身的新坐标。
④吃到食物后的处理
蛇吃到食物后,首先将食物擦除,即用背景色画出该食物,然后给蛇的节数加1,设置需要食物标志,是游戏成绩加10分,如果成绩达到100分的倍数,则给关数加1,并加快游戏速度。
⑤有按键判断蛇的方向
这是一个内嵌的嵌套的条件选择结构,根据按动上下左右键来设定蛇的移动方向。
判断还需考虑相反的方向键无效,比如蛇正在向上爬行,按下一键方向是无效的。
4系统仿真与调试
4.1仿真软件介绍
Win-TC软件是一款用于编写C语言程序的软件,是TC2WINDOWS平台开发的一个工具,是TurboC2.0(简称TC2.0)的一种扩展形式,是在TC2.0的基础上,增强了系统的兼容性和共享性,允许进行复制粘贴的多项可以用鼠标来操作的功能,比TC2.0使用起来方便。
该软件使用TC2为内核,提供WINDOWS平台的开发界面,因此也就支持WINDOWS平台下的功能,例如剪切、复制、粘贴和查找替换等。
而且在功能上也有它的独特特色例如语法加亮、C内嵌汇编、自定义扩展库的支持等。
它的主要特点如下:
1)在WINDOWS下编辑TC代码,可以充分利用WINDOWS的支持剪贴版和中文的特点;
2)Include和Lib路径自动定位,告别TC设置路径的历史;
3)编译错误捕捉功能,编译时不会出现烦人的DOS窗口;
4)支持C内嵌汇编从而实现C/ASM混合编程;
5)支持C扩展库(自定义LIB库);
6)允许自定义设置输入风格,能够实现VC类似的输入风格;
7)错误警告定位功能、出现编译错误时双击输出框里的出错行信息可以自动寻找到错误的行,就像DOS的TC那样;
4.2系统仿真实现
在window环境下装好win-TC之后,打开win-TC并新建文件夹,把贪食蛇游戏的源程序输入进去,然后运行,并发现错误,修改之后,把文件保存在软件的源文件里面,也就是project文件夹里。
之后就可以成功运行贪食蛇游戏了。
4.3系统测试
预期结果:
蛇运行时如果撞到墙壁,则游戏结束。
实际运效果:
与预期结果一致,如下图
图6贪吃蛇撞到墙壁
图7游戏结束
预期的结果:
当蛇得头部与蛇身相撞时,游戏应当结束。
图8贪吃蛇头部与身体相撞
图9游戏结束
4.4数据分析
经过对各个模块的调试和单元测试并修改了错误后,将各个模块组装成一个系统,并进行集成测试。
在集成的过程中发现了一些错误,比如全局变量重复定义、函数重复声明等,分别进行了改正。
最后连续运行了5次,以便测试该游戏程序的功能、性能是否达到了预期的目标,并根据所使用的具体机器对蛇的爬行速度进行适当的调整。
测试内容包括蛇的运行、分数、关数、动画等功能,情况均正常。
5总结
5.1设计小结
通过2周的课程设计,在导师的指导和开发小组共同的努力下,终于完成了贪吃蛇游戏程序的设计与编写。
该游戏程序实现了用方向键控制蛇在围墙内爬行、随机产生食物、控制蛇吃掉食物并加分、控制游戏中闯关的数目和蛇的运行速度、实时显示得分和关数、结束时处理和显示排行榜等功能。
该游戏程序具有界面友好、操作方便、控制准确和容错能力强等特点。
然而这个贪吃蛇游戏还存在一些缺陷,应该在如下几个方面加以改进。
1)进入游戏后,到蛇死亡,只能玩一次就会退出程序。
应加入多次游戏的控制能力。
2)蛇的美观不足,需将蛇头、蛇尾及蛇身做进一步美化,使其更像真实的蛇。
3)当分数超过350分后,蛇的速度变得非常快,一下子就撞到围墙上了,应适当控制蛇的速度和关数,以便使游戏更具有吸引力。
5.2收获体会
贪吃蛇的设计与编写对我们有很多帮助,学习编写贪吃蛇的游戏对掌握C语言的知识有很大的帮助。
通过编程实践,还能拓展思路,让我们去寻找需要调用那些函数,怎样提高程序的质量等。
要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候就会游刃有余了。
在编程时我们要有丰富的想象力,不要拘泥与固定的思维方式,遇到问题的时侯要多想几种解决问题的方案。
丰富的想象力是建立在丰富的知识基础上,所以我们要通过多个途径来帮助自己建立较丰富的知识结构。
贪吃蛇游戏的编程练习思考数据结构:
定义食物的坐标来控制它出现的位置,用一系列的函数时进行表示,比如用函数rectangle来画出矩形,用life变量的值表示蛇的生命,用direction变量的值表示蛇移动的方向等,还有用数组来存放蛇身各节的坐标,这些都让我们熟悉了对数组的操作,此外还熟悉了各种函数的应用。
在编程是我们碰倒了很多的困难,这就需要我们多与别人交流。
在编程的过程中,我们也发现有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。
养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程能力的要点。
在进行课程设计的过程中我们也学到了许多别的东西。
首先,我们学会了合作,要以别人的眼光看看问题,也许这样得到的会比各自得到的都要多;
其次,我们学会了分工,分工是为了更好地合作,分工才能提高合作的效率;
最后,我们学会了奋斗,我们相信,通过四年的学习,我们一定能写出更精彩的程序,将来会描绘出更精彩的人生。
在这里,我们要感谢课程设计指导老师王丽老师给予我们悉心的指导。
老师多次询问编写进程,并为我们指点迷津,帮助我们开拓研究思路,精心点拨、热心鼓励。
老师一丝不苟的工作作风,严谨求实的态度,踏踏实实的精神,不仅受我以文,而且教我做人,给以终生受益无穷之道。
还有我们设计小组之间的团结与努力,正是由于我们团结协作,才顺利的完成了课程设计任务。
5.3展望
通过这次的课程设计,使得我们对C语言有了一个更深层面的了解与认识。
从一开始的对待新事物的恐惧与无从下手到最后逐渐产生了兴趣。
我觉得这次课程设计不单是考验了我们对C语言的掌握,更是对我们的团队协作能力的一个挑战。
我们希望以后还可以更加进步。
6参考文献
[1]谭浩强.程序设计(第三版)[M].北京:
清华大学出版社,2005.
[2]王成瑞,魏先民.语言程序设计实训[M].中国水利水电出版社,2005.
[3]谭浩强.程序设计题解与上级指导(第三版)[M].北京:
清华大学出版社,2005.
[4]王路群.Java高级程序设计[M].北京:
中国水利水电出版社,2006.
[5]陈轶,姚晓昆编著.Java程序设计实验指导[M].北京:
清华大学出版社,2006.
[6]施宏斌译.JavaScript入门经典(第3版)[M].北京:
清华大学出版社,2009.
[7]谭浩强著.C程序设计(第二版)[M].北京:
清华大学出版社,1999.
[8]谭浩强,张基温,唐永炎编著.C语言程序设计教程[M].北京:
高等教育出版社,1992.
[9]戴健鹏译.C语言大全(第二版)[M].北京:
电子工业出版社,1994.
[10]C编写组编.常用C语言用法速查手册[M].北京:
龙门书局,1995.
7附录
系统主要功能展示图
元器件清单
Win-TC软件,PC机
贪吃蛇程序源码:
#include<
stdio.h>
conio.h>
dos.h>
stdlib.h>
time.h>
/*蛇的最大节数*/
#defineMAX200
#defineLEFT10
#defineTOP2
#defineRIGHT50
#defineBOTTOM23
#defineTIME0x1c/*时钟中断点*/
#defineVK_UP0x4800
#defineVK_DOWN0x5000
#defineVK_LEFT0x4b00
#defineVK_RIGHT0x4d00
#defineESC0x11b
#definerandx()(rand()%(RIGHT-LEFT-1))+LEFT+1
#definerandy()(rand()%(BOTTOM-TOP-1))+TOP+1
intiScore=0;
/*分数*/
intiTimeCount=0;
/*记录时钟中断*/
/*定义蛇节的结构*/
structsnakenode
{
intx;
inty;
};
/*定义蛇的结构*/
typedefstruct
structsnakenodes[MAX];
intiLength;
/*蛇的长度*/
intiDirection;
/*蛇移动的方向*/
}SNAKE;
/*定义食物的结构*/
}FOOD;
/*定义蛇变量*/
SNAKEsnake;
/*定义食物变量*/
FOODfood;
/*保存旧的时钟中断*/
voidinterrupt(*oldtime)();
/*新时钟函数*/
voidinterruptnewtime()
iTimeCount++;
oldtime();
}
/*设置时钟中断*/
voidSetTime(voidinterrupt(*pInterrupt)())
oldtime=getvect(TIME);
disable();
setvect(TIME,pInterrupt);
enable();
/*恢复以前的时钟中断*/
voidKillTime()
setvect(TIME,oldtime);
voidDrawFrame()/*画边框*/
intx,y;
textcolor(YELLOW);
for(x=LEFT;
x<
RIGHT+1;
x++)
gotoxy(x,TOP);
cprintf("
%c"
219);
gotoxy(x,BOTTOM);
for(y=TOP;
y<
BOTTOM+1;
y++)
gotoxy(LEFT,y);
gotoxy(RIGHT,y);
textcolor(WHITE);
/*显示分数与速度*/
voidDrawInfo()
{
textcolor(RED);
gotoxy(RIGHT+5,TOP+5);
Score:
%-5d"
iScore);
gotoxy(RIGHT+5,TOP+7);
Speed:
%-2d"
iScore/100+1);
/*产生贪吃蛇*/
voidCreateSnake()
inti;
x=randx();
y=randy();
for(i=0;
i<
4;
i++)
snake.s[snake.iLength].x=x+i;
snake.s[snake.iLength].y=y;
snake.iLength++;
snake.iDirection=2;
/*蛇向左移*/
/*显示贪吃蛇*/
voidShowSnake()
intlength=snake.iLength;
for(i=length-1;
i>
0;
i--)
gotoxy(snake.s[i].x,snake.s[i].y);
printf("
2);
gotoxy(snake.s[0].x,snake.s[0].y);
'
'
);
/*检查产生食物是否在贪吃蛇身上*/
intIsInSnake()
intflag=0;
/*食物不在贪吃蛇身上*/
length;
if((snake.s[i].x==food.x)&
&
(snake.s[i].y==food.y))
flag=1;
/*食物在贪吃蛇身上*/
break;
returnflag;
/*产生食物*/
voidCreateFood()
intflag=1;
while(1==flag)
food.x=x;
food.y=y;
if(0==IsInSnake())/*食物不在贪吃蛇身上*/
flag=0;
/*退出循环*/
/*显示食物*/
voidShowFood()
gotoxy(food.x,food.y);
4);
/*游戏初始化*/
voidInitGame()
/*初始化随机数组*/
srand((int)time(0));
/*初始化游戏时钟*/
SetTime(newtime);
/*绘制游戏边框*/
DrawFrame();
/*显示游戏分数与游戏速度*/
DrawInfo();
/*初始化蛇的位置与长度*/
CreateSnake();
ShowSnake();
/*初始化食物的位置*/
CreateFood();
ShowFood();
/*按方向移动蛇*/
voidMoveSnake()
intdir;
intlength;
dir=snake.iDirection;
length=snake.iLength;
switch(dir)
case0:
/*左移*/
length-1;
snake.s[i]=snake.s[i+1];
snake.s[length-1].x-=1;
case1:
/*上移*/
snake.s[length-1].y-=1;
case2:
/*右移*/
snake.s[length-1].x+=1;
case3:
/*下移*/
snake.s[length-1].y+=1;
default:
/*蛇的长度增加*/
voidIncreaseSnake()
switch(snake.iDirection)
snake.s[i]=snake.s[i-1];
snake.s[0].x-=1;
snake.s[0].y-=1;
snake.s[0].x+=1;
snake.s[0].y+=1;
intIsGameOver()
intx=snake.s[length-1].x;
inty=snake.s[length-1].y;
/*是否出界*/
if(x<
=LEFT||x>
=RIGHT||y<
=TOP||y>
=BOTTOM)
/*判断是否吃到自己*/
if(snake.s[i].x==x&
snake.s[i].y==y)
voidPlayGame()
intkey;
/*保存按键值*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 实现 贪食 游戏