C语言贪吃蛇程序设计报告.docx
《C语言贪吃蛇程序设计报告.docx》由会员分享,可在线阅读,更多相关《C语言贪吃蛇程序设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
C语言贪吃蛇程序设计报告
山东交通学院
C语言课程设计
贪吃蛇游戏编程
院(系)别信息工程系
班级
学号
姓名
指导教师
时间2011-03-28—2011-04-01
课程设计任务书
题目贪吃蛇游戏编程
系(部)信息工程系
专业
班级
学生姓名
学号
03月28日至04月01日共1周
指导教师(签字)
系主任(签字)
年月日
一、设计内容及要求
贪吃蛇游戏是一个经典小游戏,本设计分为三个等级。
一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时等级为1计1分,等级为2计2分,等级为3计3分。
接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
二、设计原始资料
C语言程序设计和应用
三、设计完成后提交的文件和图表
见正文内容
四、进程安排
第一天:
选择课题,认真分析。
第二~三天:
查找资料,利用学过的知识初步编程。
第四~五天:
写好源代码,进行调试.
第六天:
整理代码,完善代码.
第七天:
答辩.
五、主要参考资料
1.《C语言程序设计》(谭浩强清华大学出版社)
2.《C语言程序设计》(张磊高等教育出版社)
3.《C语言课程设计案例精编》(郭翠英中国水利水电出版社)
4.《C语言程序设计教程》(李丽娟人民邮电出版社)
5.《C语言程序设计思想与实践》(林华聪冶金工业出版社)
6.《C语言程序设计教程》(张继温高等教育出版社)
成绩评定表
作品成绩
报告成绩
口试(答辩)成绩
总评成绩
一.摘要………………………………………………06
.
二.题目要求………………………………………………07
三.设计思想………………………………………………07
四.数据结构设计及用法说明………………………………07
五.程序描述………………………………………………08
六.程序流程图……………………………………………09
七.程序源代码及注释…………………………………11
八.运行结果…………………………………………23
九.课程设计总结………………………………25
十.参考文献…………………………………26
一.摘要:
食いしん坊な蛇ゲームは1つのすばらしくて小さいゲームで、当設計は3つの等級に分けます。
1匹の蛇は閉鎖的な塀の中で、塀の中で無作為の出現の1つの食品、キーボードの4つのカーソルキーによってを通じて(通って)上下左右の4つの方向のモバイルに蛇を制御して、スネークヘッドは食品をぶつかって倒して、食品は食べてしまわれて、蛇の体の長さの1節(つ)、同時に等級は1のために1分計算して、等級は2のために2分計算して、等級は3のために3分計算します。
引き続いてまた食品が現れて、蛇が食べにくることを待って、もし蛇はモバイル中で壁あるいは体の交差するスネークヘッドにぶつかって自分の体のゲームオーバーをぶつかって倒すならば。
索引のキーワー:
ド:
食いしん坊な蛇プログラミングします
二.题目要求
A用键盘的方向键控制蛇的上下左右移动。
B游戏分为三种难度,SLUG为慢速,每吃一朵花得1分;WORM
为中速,每吃一朵花得2分;PYTHON为快速,每吃一朵花得3分。
C游戏目标:
操纵屏幕上那条可爱的小蛇,在黑框中不停吃花,而每吃一朵花,蛇的身体都变的更长一些,游戏的难度也会随之加大。
D游戏终止:
终止条件1——蛇头撞到墙上;终止条件2——蛇身形成一个圈,也就是蛇头碰到自身的任何一处。
三.设计思想
1.这个程序的关键是表示蛇的图形以及蛇的移动。
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。
移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。
如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现和消失也是画矩形块和覆盖矩形块
四.数据结构设计及用法说明
1.开始部分:
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。
标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重要变量的初始化。
2.运行部分:
作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:
某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。
当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗……它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。
但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。
第一轮循环:
第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):
A:
第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;
B:
第四步,蛇碰到自己或墙壁,终止游戏。
3.结束部分:
游戏结束时,显示“GAMEOVER”
五.程序描述
蛇:
基本描述:
长度,颜色,位置。
对应数据与数据类型:
长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型;位置--X,Y坐标。
增加的描述:
蛇运动的方向,蛇的生命。
对应数据与数据类型:
这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。
方向只有四个方向:
上下左右。
可以设置与之对应的四个整型数:
3、4、2、1。
生命就只有两种情况:
死或生,对应0或1。
食物:
基本描述:
颜色,位置。
对应数据与数据类型:
由于颜色设成固定的,所以不再讨论。
位置—X、Y坐标。
增加的描述:
食物的存在。
对应数据与数据类型:
这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。
只有两个值:
0或1(没有食物或有食物)
其他的元素:
墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。
还需要的变量:
键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。
六.程序流程图
七.程序源代码及注释
#include
#include
#include
#include/*引用的库函数*/
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b/*宏定义键名*/
#defineN200
inti,key;
intlevel;/*游戏等级*/
intscore=0;/*得分*/
intgamespeed;/*游戏速度*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;/*蛇的结构体*/
voidChoicelevle(void);/*选择游戏等级*/
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDRAW(void);/*游戏区域*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{
Init();/*图形驱动*/
Choicelevle();/*选择游戏等级*/
DRAW();/*游戏区域*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"\\turboc2");/*初始化图形系统*/
cleardevice();/*清除图形界面*/
}
/*选择游戏等级*/
voidChoicelevle(void)
{
setcolor(YELLOW);
settextstyle(0,0,6);
outtextxy(150,150,"Snake");
setcolor(GREEN);
settextstyle(0,0,1);
outtextxy(200,250,"Choicelevlefrom");
outtextxy(200,275,"1.SLUG2.WORM3.PYTHON");
outtextxy(220,300,"pleasechoice1or2or3.");
getch();
printf("pleasechoicelevle:
");
scanf("%d",&level);
gamespeed=100000-5000*level;
if(level>3||level<1)
{cleardevice();/*清除图形界面*/
setcolor(RED);/*设置字体颜色*/
settextstyle(0,0,2);/*设置字体类型*/
outtextxy(150,200,"levelinputerror");/*显示文本*/
getch();
level=1;
}
}
voidDRAW(void)
{cleardevice();/*清屏*/
setcolor
(2);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
rectangle(50,40,610,460);
}
/*玩游戏具体过程*/
voidGamePlay(void)
{setcolor(5);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=320;snake.y[0]=240;/*蛇头*/
snake.x[1]=330;snake.y[1]=240;/*蛇的第二节位置*/
snake.node=3;/*节数*/
PrScore();/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%360+70;
food.y=rand()%250+60;
while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个控制来移动蛇头*/
switch(snake.direction)
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
for(i=3;i{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;/*蛇死*/
break;
}
}
/*如果蛇头碰到墙壁,蛇头从对面墙出来*/
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
{
GameOver();
snake.life=1;
}
if(snake.life==1)/*如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);/*用当前线型和颜色画一矩形*/
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
if(level==1)
{
score+=1;
}
elseif(level==2)
{
score+=2;
}
elseif(level==3)
{
score+=3;
}
else
score+=level;
if(score%12==0)
{
level++;gamespeed=gamespeed-5000;
}
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;irectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);/*控制游戏速度*/
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}/*endwhile(!
kbhit)*//*用黑色去除蛇的的最后一节*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按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;
}/*endwhile
(1)*/
}
/*游戏结束*/
voidGameOver(void)
{
cleardevice();/*清屏*/
PrScore();
setcolor(RED);/*设置字体颜色*/
settextstyle(0,0,4);/*设置字体类型*/
outtextxy(200,200,"GAMEOVER");/*显示文本*/
getch();
}
/*输出成绩及游戏等级*/
voidPrScore(void)
{
charstr1[20];/*设置字符型数组*/
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,350,35);/*填充矩形框*/
setcolor(6);/*设置文本颜色*/
settextstyle(0,0,2);/*设置数组显示位置*/
sprintf(str1,"score%dlevel%d",score,level);/*显示数组内容*/
outtextxy(55,20,str1);
setcolor(YELLOW);/*设置字体颜色*/
settextstyle(0,0,2);/*设置字体类型*/
outtextxy(250,461,"EXIT=ESC");/*显示文本*/
}
voidClose(void)
{
closegraph();
}
八.运行结果
图1.初始界面
图2.选择等级
图3.游戏界面
图4.结束界面
九.课程设计总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。
回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。
而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。
所以认真仔细就是非常重要的了。
开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。
又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。
无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
十.参考文献
1.《C语言程序设计》(谭浩强清华大学出版社)
2.《C语言程序设计》(张磊高等教育出版社)
3.《C语言课程设计案例精编》(郭翠英中国水利水电出版社)
4.《C语言程序设计教程》(李丽娟人民邮电出版社)
5.《C语言程序设计思想与实践》(林华聪冶金工业出版社)
6.《C语言程序设计教程》(张继温高等教育出版社)