c语言程序贪吃蛇课程设计报告
五年级 散文 6625字 4234人浏览 tomasklxl

高级语言程序设计

课程设计报告

Experiment Designing reporter

课程名称:高级语言程序设计

英文名称 : C Program Experiment Designing

专业:自动化 111

学号: XXX

姓名: XXX

指导教师: XXX

日期: 2012 年 6月 17日至 2011 年6 月 20 日

山东工商学院信电学院

一:课程设计内容

程序功能介绍

贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。

设计思路

我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”:

第一步:

寻找到一个真正可以运行的已用C 编好的贪吃蛇。

因为我们毕竟从未看到过用C 编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。所以我们组统一决定,去寻找一个可以运行的C 编译的贪吃蛇。

第二步:

运行游戏并了解游戏程序。

我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。

同样重要的是了解游戏程序。因为只有看懂了程序,才能实现对他的改编,才能游刃有余。 第三步:

寻找模块并分类,而后进行改编。

寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那么就应该找到 void DrawK(void)

{

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);

for(i=200;i<=500;i+=10)

rectangle(i,200,i+10,209);

}

然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置的模块,让蛇见

墙死的模块,让蛇吃苹果加长的模块„„„.

并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。

对于找到的模块如何进行改编呢?怎么才能知道某个数值或函数代表什么呢?

我们有两个方法:

1. )看名字,比如snakecolor (),很明显他的意思是蛇的颜色。2. )控制变量猜想,比如设置墙的时候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309); 中的200,500,300,209 代表什么呢?我们可以猜想:它很像是坐标上的(x,y)的格式,是不是呢?可可以先让其他数值不变,只让309改变,改变后发现上面的墙变粗了,由此可见这个数字控制的是一堵墙的最下面一行的坐标。

关于该程序的相关分析思路答题模板:

1 . 贪吃蛇程序流程图如下:

二. 贪吃蛇程序的改编:

经过小组成员的认真研究我们对其进行了如下改编

第一步加墙

void DrawK(void)

{

/*setbkcolor(MAGENTA);*/

setcolor(5); // 可以改变颜色

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

横向上的墙:

for(i=100;i<=600;i+=10)// 本行代表行坐标上:100代表墙的初始位置,i<=600代表墙的结尾。

{

rectangle(i,60,i+10,69); //本行代表纵坐标上:60代表墙的最上面一行的位置,69代表墙最下面一行的位置。69-60=9,9代表墙块的厚度

}

纵向上的墙:

for(i=100;i<=400;i+=10)//本行代表纵坐标上:100代表墙的初始位置,i<=400代表墙的结尾 {

rectangle(100,i,109,i+10); //本行代表纵坐标上:100代表墙的最左边面一行的位置,69代表墙最右面一行的位置。69-60=9,9代表墙块的宽度

}

我们认为本模块最重要的是for 语句控制的坐标代表的意思。只要明白了坐标的意思,就可以实现对游戏的改编。

第二步就是进行对新加入的墙蛇是否撞上死亡

让蛇撞墙死

if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&& snake.y[0]<=215) /*其中,对x ,y 范围的控制,实际是对蛇撞击的死亡区域的限制。*/

{

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

}

相应的新添加的墙。

for(i=200;i<=500;i+=10)/*画围墙*/

{

rectangle(i,200,i+10,209); /*指定位置*/

第三步食物的定点出现

if(food.yes==1)/*需要出现新食物*/

这里说明一下:rand() 产生0-65535的数,在limits.h 里有定义%400后产生一个0-399的数+60 则为 60 –459,即:%400+60意思是在60~399之间随机产生一个数。

{

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内, 这样才可以让蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/

}

如果将food.x=(常数a )那么食物就会出现在x=a行的随机列,对于food.y=(常数b )那么食物就出现在y=b列的随机行。

第四步对食物墙壁的颜色以及对蛇的运动速个性化调节

setcolor(4);// 对颜色的调整 int gamespeed=50000;/*游戏速度自己调整*/ 通过改变变量的值,就可以个性化选择自己喜欢的颜色,这将是一场别开生面的游戏界面。

* 红色代表解析浅蓝代表提示

三 . 课程设计总结

有言曰:“实践出真知”,在这几天的课程设计实践中,我们组三人真正的体会到了这句话的真谛。

在经历了一学期的C 语言学习后,我们从以往的“纸上谈兵”直接过渡到“实际作战”。我们实现了让静态的程序变成动态的游戏效果,虽然我们只是改编了一下别人做好的程序,但我们同样由此获益匪浅,感触颇深,当然也发现了许多自己的不足。

首先,在我们刚刚进行第一步“寻找程序”的时候,就被搁浅了,因为我们发现,在网上能找到一个真正符合我们使用标准的程序很难,就是找到了几个也没有能运行它们的程序。我们花费了前两天的时间来寻找能够使用的程序和软件,但最后还是一无所获,正当我们一筹莫展的时候,我们的导师——杨老师给我们带来了曙光,使得我们在黑暗中找到了希望的光明,杨老师给我们传来了一个上届师哥做好的程序,并且把它的运行软件也给了我们,这对我们来说无疑是雪中送炭,得到这个程序后,我们三个人看到了C 语言运行一个游戏的流程和方法,我们脑中也大概有了一个思路。我们三个人以此程序为跳板,直接开始对程序模块进行挑选,因为我们已经浪费了两天,所以我们决定进行分工作业,分别去寻找:筑墙模块,加苹果模块,撞墙死模块。最后我们用了一下午时间完成了三大步中的前两大步和第三步的第一部分,剩下的就是最重要而充满挑战的改编了,从以上的操作中,让我们明白了找对一个平台的重要性,这个平台就是老师给我们的程序,就是我们的前进方向。没有了方向了的征程,一开始就是个错误。在我们寻找程序模块的时候,我们对于程序中的很多东西都是模

模糊糊的概念,比如struck 是什么,比如for 语句的使用,以及for 语句的循环体是什么,当然我们也发现了定义字符在长的程序中的方便与重要性。还有就是我们发现程序在编写时的规范性很重要,比如同级别花括号的位置的对应,对应好了,模块就好找,对应不好就很乱。还有定义函数及变量的时候,函数名字和变量名最好是见名知意,比如我们所看的程序中,gamespeed,snakecolour ,food.....

在最后的攻坚阶段,为了实现对程序的改编,我们使用控制变量猜想法是正确的选择,比如设置墙的时候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309); 中的200,500,300,209 代表什么呢?我们猜想:它很像是坐标上的(x,y)的格式,是不是呢?我们先让其他数值不变,只让309改变,改变后发现上面的墙变粗了,由此我们知道这个数字控制的是一堵墙的最下面一行的坐标。我们用这个方法知道了其他很多数值的用途。我们用这种方法先是知道了如何设置一堵墙,在我们欣喜设置一堵墙以后才发现:蛇撞了墙后不死。在我们进行了全局来看以后才知道,原来设计一堵墙,都要再设计一个if 语句来使得蛇在这个范围内会死亡。并且我们发现在设计这个if 语句的时候,不仅要计算好墙的坐标,而且还要用好逻辑语言(&&,|| !)同时语句的运算顺序也很重要。刚一开始我们忽略的&&和关系运算符级别的高低,使得我们设计的墙,总是撞不死蛇,为此我们很是恼火,着急的组员还在这里发生了点小摩擦,由此可见C 语言的严谨性!

最后我们又通过在网上查找信息,知道了随机数发生器randomize()的用法:rand()=x%+d 意思是说在d~(x-1)之间随机产生一个数字。我们很自然的联想到,如果把food.x 等于常数a; 把food.y 等于一个;x%+d的随机数,那不就能固定只在某一行出现苹果了吗?所以我们觉得,充分利用手边的资源也是很重要的,毕竟C 语言很高深,课本上的东西总是有限的,要想知道更多的东西还需多练习,多查阅资料。

总之:革命尚未成功,通知还需努力啊!

四个人感受:

汤X :

就我个人而言,这次课程设计,我觉得我最大的收获就是:我明白了,我们其实真的没那么厉害,我们真的还有很多东西不会,我们真的连课本上的基本东西都没掌握,课本上的东西,真的也只是C 语言这个大海中的一滴水而已。而在我本人还没有掌握好课本的知识点的情况下,做起这个程序自然很费事,一个简单的课本P293讲到的struct 结构体,我一开始竟然忘记它是什么意思,不知道它是什么,就更不用谈怎么用它了。还有逻辑语言的使用。我想,现在肯定有很多同学还不知道逻辑运算的优先次序吧?这个问题我本人在使用逻辑语言的时候也不太会,还查看了书。像这些小的知识点,我个人认为如果掌握不好的话,是不可能让整个大程序运行起来的。还有比如我在遇到程序显示“else 多余”的警告时候不不知所措,问了老师才知道是if ()后面加了“;”而且if 没有用“{}”来固定范围,这个错误原因是分号使得if 语句结束了,孤立的else 当然是多余的了。一个小小的分号使得程序无法运行,由此可见在今后的编程中,一定要注意谨慎,仔细。同时要注意记住平时编程的时候,出现的错误指示是什么意思。比如这次的“else 多余”就是因为if 后多了分号。还有在编程时候,书写一定要规范,特别是if 语句的花括号的位置要对应起来,因为位置决定范围。注意定义变量和函数要使用规范的英文单词,这样才能见名知意,为以后修改找变量节省时间。对于这次课题中,“设计一个墙,就要对应一个函数舍得蛇撞墙死”,让我明白,C 语言程序中各部分的联系性,牵一发而动全身,所以在编程时一定要注意全局的把握。我们最后还要说说在编程中,好好利用网络资源,因为课本里的东西总是有限的,而C 语言又那么高深,像随机数发生器,还有颜色的定都是我第一次接触,这些东西的用处可是颇大,以后一定好好学习。多看,多练,多总结。最后还要感谢指导老师,杨老师对我学习的帮助和指导。 徐XXX :

刚开始拿到题目时候什么也不会一片茫然,从网上找了一个程序一看,太吓人了,这么长怎么看啊,而且还是错误的。没办法只能硬着头皮去改了,但是在改的过程中才发现其实c 语言没有想象的那么难而且还很有意思,只是自己平时没有好好学所以在改的时候非常吃力,有很多简单的知识都不知道,没有记住。没办法只能借助与课本了。但是几天下来发现自己已经不再像以前那样是个菜鸟了,虽然很多知识还没掌握。

同时在编改程序的时候切记不能烦躁要静心慢慢来,好几次自己都因心燥出现了很多不该出现的错误浪费了很多时间。

对键盘的熟悉在编程时也是很重要的,自己在写的时候往往就是跟一指禅差不多眼睛盯着键盘打,打错了也不知道最后导致整个程序都是错误的,就因为一个打错了一个字母。

总的来说这次课程设计收获很多,也知道了自己的不足,在以后的学习中要多实践,实践很能提高自己的能力。

刘XX :

4天的C 语言课程设计上机学习让我感受颇多,每天都发现新的问题,又不得不绞尽脑汁解决问题,心情就像正弦函数,随着问题的出现和解决一起一伏。

刚开始接触贪吃蛇的C 语言成寻时,看着C-free 上面出现的有十几个错误的程序,一片茫然不知所措。只能继续在网上搜索错误较少的程序,并结合书上的基础知识查看错误所在,最终发现是<graphics.h>不能在C-free 中运行,只能在mytc5.6上运行。

作为小组中唯一的女生,明显感觉有压力,打字速度不如另外两个男生,对游戏和程序的敏感也不如他们强,有种小小的挫败感。旁边小组的同学也给我很大的压力。他们自己编写程序,我很佩服他们,越是这样想。心里越着急,越不能解决问题,每当感觉有压力的时候,就提醒自己心静,认真的看程序。在学习过程中,深深的发现了自己的不足之处,对于C 语言,只学了一点点皮毛东西,想要学好C 语言,编好程序,还要付出很多的努力,还要用更多的时间来学习C 语言这门深奥的学科。

现在只能借用别人已经写好的程序,在别人的基础上,一点点进步和学习,比如程序中筑墙,需要仿照已有的程序,结合逻辑运算,关系运算和数学知识才能让蛇撞墙死。苹果位置的出现也同样需要进一步的搜索,通过更改食物的横纵坐标以及出现的概率来确定食物的位置。 编写程序时,也发现书上的东西对于程序的某些部分来说,没有什么作用,显得太浅显,想要实现老师给出的一些要求,还需要实践,通过上机学习,自己摸索才能成功。一次次修改,一次次失败,就像贪吃蛇想方设法吃苹果会Game over,我们只有认真学好基础理论,并结合实践经验才会取得进步。

在这次学习过程中,我很感谢我的组员,虽然有时我们的意见出现分歧,但是通过大家的共同努力,我们收获了很多,一起讨论,一起研究怎样解决问题,对老师提出的要求个个击破,我们拧成一股绳共同应对问题,让我感受了团队的力量希望在以后的学习过程中,我们依然能够互相帮助,共同进步。

五 课程设计修改后的程序

1 . 加墙

for(i=200;i<=500;i+=10)/*画围墙*/

{

rectangle(i,200,i+10,209); /*指定位置1*/

}

for(i=120;i<=200;i+=10)/*画围墙*/

{

rectangle(100,i,109,i+10);/*指定位置2*/

}

2. 指定位置加苹果

if(food.yes==1)/*需要出现新食物*/

{

food.x=rand()60;

food.y=rand()%200+60;

while(food.x%10!=0)

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;

3. 指定地方撞墙死

if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&&

snake.y[0]<=215)

{

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

}

if(snake.x[0]>90&&snake.x[0]<110&&snake.y[0]>=110&&snake.y[0]<=215) {

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

} }