高级语言程序设计课程设计报告Experiment Designing reporter课程名称:高级语言程序设计英文名称 : C Program Experiment Designing专业:自动化 111学号: XXX姓名: XXX指导教师: XXX日期: 2012 年 6月 17日至 2011 年6 月 20 日山东工商学院信电学院山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“一:课程设计内容程序功能介绍贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。
设计思路我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”:第一步:寻找到一个真正可以运行的已用C编好的贪吃蛇。
因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。
所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。
第二步:运行游戏并了解游戏程序。
我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。
同样重要的是了解游戏程序。
因为只有看懂了程序,才能实现对他的改编,才能游刃有余。
第三步:寻找模块并分类,而后进行改编。
寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那第一页共十六页自动化 111么就应该找到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 . 贪吃蛇程序流程图如下:山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“二.贪吃蛇程序的改编:经过小组成员的认真研究我们对其进行了如下改编第一步加墙第三页共十六页自动化 111void 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代表墙块的宽度}山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“我们认为本模块最重要的是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); /*指定位置*/第五页共十六页自动化 111第三步食物的定点出现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)山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“food.y++;food.yes=0;/*画面上有食物了*/}如果将food.x=(常数a)那么食物就会出现在x=a行的随机列,对于food.y=(常数b)那么食物就出现在y=b列的随机行。
第四步对食物墙壁的颜色以及对蛇的运动速个性化调节setcolor(4);// 对颜色的调整int gamespeed=50000;/*游戏速度自己调整*/通过改变变量的值,就可以个性化选择自己喜欢的颜色,这将是一场别开生面的游戏界面。
* 红色代表解析浅蓝代表提示三.课程设计总结有言曰:“实践出真知”,在这几天的课程设计实践中,我们组三人真正的体会到了这句话的真谛。
在经历了一学期的C语言学习后,我们从以往的“纸上谈兵”第七页共十六页自动化 111直接过渡到“实际作战”。
我们实现了让静态的程序变成动态的游戏效果,虽然我们只是改编了一下别人做好的程序,但我们同样由此获益匪浅,感触颇深,当然也发现了许多自己的不足。
首先,在我们刚刚进行第一步“寻找程序”的时候,就被搁浅了,因为我们发现,在网上能找到一个真正符合我们使用标准的程序很难,就是找到了几个也没有能运行它们的程序。
我们花费了前两天的时间来寻找能够使用的程序和软件,但最后还是一无所获,正当我们一筹莫展的时候,我们的导师——杨老师给我们带来了曙光,使得我们在黑暗中找到了希望的光明,杨老师给我们传来了一个上届师哥做好的程序,并且把它的运行软件也给了我们,这对我们来说无疑是雪中送炭,得到这个程序后,我们三个人看到了C语言运行一个游戏的流程和方法,我们脑中也大概有了一个思路。
我们三个人以此程序为跳板,直接开始对程序模块进行挑选,因为我们已经浪费了两天,所以我们决定进行分工作业,分别去寻找:筑墙模块,加苹果模块,撞墙死模块。
最后我们用了一下午时间完成了三大步中的前两大步和第三步的第一部分,剩下的就是最重要而充满挑战的改编了,从以上的操作中,让我们明白了找对一个平台的重要性,这个平台就是老师给我们的程序,就是我们的前进方向。
没有了方向了的征程,一开始就是个错误。
在我们寻找程序模块的时候,我们对于程序中的很多东西都是模模糊糊的概念,比如struck是什么,比如for语句的使用,以及for语句的循环体是什么,当然我们也发现了定义字符在长的程序中的方便与重要性。
还有就是我们发现程序在编写时的规范性很重山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“要,比如同级别花括号的位置的对应,对应好了,模块就好找,对应不好就很乱。
还有定义函数及变量的时候,函数名字和变量名最好是见名知意,比如我们所看的程序中,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语言很高深,第九页共十六页自动化 111课本上的东西总是有限的,要想知道更多的东西还需多练习,多查阅资料。
总之:革命尚未成功,通知还需努力啊!四个人感受:汤X:就我个人而言,这次课程设计,我觉得我最大的收获就是:我明白了,我们其实真的没那么厉害,我们真的还有很多东西不会,我们真的连课本上的基本东西都没掌握,课本上的东西,真的也只是C 语言这个大海中的一滴水而已。