C语言贪吃蛇实验报告.docx
《C语言贪吃蛇实验报告.docx》由会员分享,可在线阅读,更多相关《C语言贪吃蛇实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
C语言贪吃蛇实验报告
C语言程序设计实训报告
姓名
专业
班级
指导教师
2011年7月14日
一.实训目的和要求
1.实训目的
本实训是软件技术专业重要的实践性环节之一,是在学生学习完《C语言程序设计》课程后进行的一次全面的综合练习。
本实训的目的和任务:
(1).巩固和加深学生对C语言课程的基本知识的理解和掌握
(2).掌握C语言编程和程序调试的基本技能
(3).利用C语言进行基本的软件设计
(4).掌握书写程序设计说明文档的能力
(5).提高运用C语言解决实际问题的能力
2.实训要求
(1).分析实训题目的要求
(2).写出详细设计说明
(3).编写程序代码,调试程序使其能正确运行
(4).设计完成的软件要便于操作和使用
(5).设计完成后提交实训报告
二.实训任务内容
设计贪吃蛇游戏玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。
演示系统功能,明确课题任务与涉及的要求,分配任务,具体分析实训内容,明确思路、任务,并可以查询相关书籍、资料,给出可行相应的设计思路与方法,继续完成相应的源代码,并最终完成相应的全部代码,仔细查阅已完成的代码是否与实际相符,以及有无错误,并整合程序、上机调试,研究运行时可能出现的错误,继续整合程序、上机调试,研究运行中出现的错误,并逐个修改和完善系统;完善,考虑附加功能。
构思实验报告。
并完成实验报告通读整个程序以及实验报告,准备答辩。
三.详细设计说明
贪吃蛇游戏是一个深受人们喜爱的游戏,一条在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:
食物与蛇。
表示食物与蛇的矩形块设计为10*10个像素单位,食物的基本数据域为他所出现的位置,用x和y座标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。
由于每次只出现一个食物,所以设定yes表示是否要出现食物。
蛇的一节身体为一个矩形块,表示矩形块只需起点座标x,y。
身体不断增长,用数组存放每节座标,最大设定为N=200,node表示当前节数。
保存蛇的移动方向的变量direction和生命的变量life,一旦life为1,表示蛇死,结束。
流程图如图1所示:
是否
否
是
否
是
图1系统流程图
四.软件使用说明
此游戏是在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
游戏画面如图2所示
图2游戏界面图
五.实训心得与体会
在初学C语言的一个学期后,我们进行了C语言实训阶段,尝试自己编写一个比较复杂的程序系统。
在为期两周的时间中,我们同组的同学共同的感受是:
C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。
好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。
在这里,我作为其中的参与者,自然感触良多。
刚开始接触到C的时候,我已经学过一些有关VB的内容,这个在算法和思维上稍微有点帮助。
回想本学期的学习,首先,最基本的,是C的数据格式,让我们知道整数,浮点数以及字符常量在C中的运用。
然后,在学会了数据转化,以及熟练的可以对各种数据处理之后,我开始进行有关数据结构,像数组,结构体等的学习,因为有的东西从现有的知识来看都是非常简单的,还没有联系到指针等等一些复杂的概念。
可是,仅仅学会这些是远远不够的,C语言中,还有很多更加经典、重要、实用的知识。
通过C语言实训,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。
不过,通过几天的实训,逐渐积攒了一些经验,有些错误可以很快就看出来。
这次实训有很大的收获,让我对C语言有了更深的认识,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。
如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣就来了,兴趣来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。
C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是一个零散的知识,实际上所有的课程都如此,不过通过实训我也知道了自己的不足,存在的很多问题。
比如自己写的写的小程序出了问题,不会解决了就叫老师帮忙,虽然说一定意义上增加了师生之间的感情,但是会养成一种依赖的心理,碰到问题了个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。
还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。
通过实训,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。
其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。
自己亲自动手编写程序让我增加了对C语言程序开发环境的了解,在上课的时候老师就讲,学习C语言最重要的是学习C语言的逻辑思维,不管以后从事什么行业,学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。
当然,我们编写的商店商品管理系统,还存在很多疏漏和不合理之处。
比如,程序复杂冗长,如果时间充裕,我们将在不改变程序运行结果的基础上,简化程序,使每一句更加精辟,总体上更加简化。
另外,在程序的外观上,我们由于时间问题,没有做更多的修饰,运行起来显得比较死板、枯燥乏味。
如果增添一些色彩和其他效果,我们的程序也许会更加完美
当初在初步接触C语言的时候,看着一堆“奇形怪状”的符号,觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态!
感谢学校安排这次实训和老师的耐心讲解,让我学到了很多知识,在实训过程中,同学之间的相互探讨,老师的循循善诱,最终让我们达到了举一反三的效果,在学知识的同时,也增加了同学老师之间的感情。
希望以后还会有更多类似的实训课程,在有限的大学时间内学到更多的实用技能,为以后的工作打下一个良好的基础。
六.参考文献
[1]陈强.C语言程序设计[M].北京:
北京大学出版社,2009.
[2]许波.C语言实例解析-精粹[M].北京:
清华大学出版社,2008.
[3]潭浩强.C语言函数速查手册[M].北京:
北京大学出版社,2006.
[4]陈正冲.C语言实训指导书[M].北京:
清华大学出版社,2007.
[5]潭浩强.C语言实训程序源代码[M].北京:
清华大学出版社,2005.
[6]潭浩强.C语言设计程序经典案例教程[M].北京:
北京大学出版社,2010.
[7]李波.C语言入门经典(第四版)[M].北京:
北京邮电大学出版社,2010.
七.部分程序清单(带有详细的注释)
#defineN200
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
inti,daan;
intchengji=0;/*积分*/
intsudu=50000;/*速度调整*/
structshiwu
{
intx;/*横坐标*/
inty;/*纵坐标*/
intshi;/*判断物体是否出现变量*/
}shiwu;
structshe
{
intx[N];
inty[N];
inttou;/*节数*/
intfangxiang;/*方向*/
intlife;/*生命*/
}she;
voidInit(void);/*移动*/
voidClose(void);/*结束*/
voidDrawK(void);/*画面*/
voidGameOver(void);/*结束*/
voidGamePlay(void);/*过程*/
voidPrScore(void);/*成绩*/
voidmain(void)
{
Init();
DrawK();
GamePlay();
Close();
}
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
}
voidDrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
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);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
voidGamePlay(void)
{
randomize();/*随机出现方块*/
shiwu.shi=1;/*出现方块*/
she.life=0;/*活着*/
she.fangxiang=1;/*向右*/
she.x[0]=100;she.y[0]=100;
she.x[1]=110;she.y[1]=100;
she.node=2;
PrScore();/*积分*/
while
(1)
{
while(!
kbhit())
{
if(shiwu.yes==1)/*出现方块*/
{
shiwu.x=rand()%400+60;
shiwu.y=rand()%350+60;
while(shiwu.x%10!
=0)
shiwu.x++;
while(shiwu.y%10!
=0)
shiwu.y++;
shiwu.shi=0;
}
if(shiwu.shi==0)/*显示方块*/
{
setcolor(GREEN);
rectangle(shiwu.x,shiwu.y,shiwu.x+10,shiwu.y-10);
}
for(i=she.tou-1;i>0;i--)
{
tou.x[i]=tou.x[i-1];
tou.y[i]=tou.y[i-1];
}
switch(tou.fangxiang)
{
case1:
tou.x[0]+=10;break;
case2:
tou.x[0]-=10;break;
case3:
tou.y[0]-=10;break;
case4:
tou.y[0]+=10;break;
}
for(i=3;i{
if(she.x[i]==she.x[0]&&she.y[i]==she.y[0])
{
GameOver();
she.life=1;
break;
}
}
if(she.x[0]<55||she.x[0]>595||she.y[0]<55||
she.y[0]>455)/*是否碰壁*/
{
GameOver();/*失败*/
she.life=1;/*死亡*/
}
if(she.life==1)
break;
if(she.x[0]==shiwu.x&&she.y[0]==shiwu.y)
{
setcolor(0);/*去掉方块*/
rectangle(shiwu.x,shiwu.y,shiwu.x+10,shiwu.y-10);
she.x[she.tou]=-20;she.y[she.tou]=-20;
she.tou++;/*增加一个方块*/
shiwu.shi=1;/*出现新方块*/
chengji+=10;
PrScore();/*积分*/
}
setcolor(4);
for(i=0;irectangle(she.x[i],she.y[i],she.x[i]+10,
she.y[i]-10);
delay(gamespeed);
setcolor(0);
rectangle(she.x[she.tou-1],she.y[she.tou-1],
she.x[she.tou-1]+10,she.y[she.tou-1]-10);
}/*endwhile(!
kbhit)*/
if(she.life==1)/*如果死亡则跳出*/
break;
daan=bioskey(0);
if(daan==ESC)/*按ESC推出*/
break;
else
if(daan==UP&&she.fangxiang!
=4)/*判断方向*/
she.fangxiang=3;
else
if(daan==RIGHT&&she.fangxiang!
=2)
she.fangxiang=1;
else
if(daan==LEFT&&she.fangxiang!
=1)
she.fangxiang=2;
else
if(daan==DOWN&&she.fangxiang!
=3)
she.fangxiang=4;
}
}/*结束*/
voidGameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAMEOVER");
getch();
}/*成绩*/
voidPrScore(void)
{
charstr[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:
%d",score);
outtextxy(55,20,str);
}/*方块结束*/
voidClose(void)
{
getch();
closegraph();
}
八.程序结果
贪吃蛇游戏界面如图3所示
图3程序结果图