《c语言程序贪吃蛇课程设计报告.docx》由会员分享,可在线阅读,更多相关《c语言程序贪吃蛇课程设计报告.docx(16页珍藏版)》请在三一办公上搜索。
1、高级语言程序设计课程设计报告Experiment Designing reporter课程名称:高级语言程序设计英文名称 :C Program Experiment Designing专 业:自动化111学号:XXX姓名:XXX2012年6月17日至2011年6月20日指导教师:XXX日期:山东工商学院信电学院第一页共十六页一:课程设计内容程序功能介绍贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇 在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控 制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身 体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇
2、在 移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。此游戏不仅能 锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。设计思路我们小组称设计本次课题贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”: 第一步:寻找到一个真正可以运行的已用C编好的贪吃蛇。因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写 是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我 们想要达到的效果,那么肯定是高效的。所以我们组统一决定,去寻找一个可以 运行的C编译的贪吃蛇。第二步:运行游戏并了解游戏程序。我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进 和创新,如果你自己本
3、身就没玩过这个游戏,那么你就是再有技术,你也永远改 进和改编不了一个游戏,因为你根本不知道你在干什么。同样重要的是了解游戏程序。因为只有看懂了程序,才能实现对他的改编, 才能游刃有余。第二步:寻找模块并分类,而后进行改编。寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那 么就应该找到void DrawK(void)(setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);for(i=200;i=500;i+=10)rectangle(i,200,i+10,209);然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置
4、的 模块,让蛇见墙死的模块,让蛇吃苹果加长的模块并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。对于找到的模块如何进行改编呢?怎么才能知道某个数值或函数代表 什么呢?我们有两个方法:1. )看名字,比如snakecolor(),很明显他的意思是蛇的颜色。2. )控制变量猜想,比如设置墙的时候for(i=200;i=500;i+=10); rectangle(i,300,i+10,309);中的 200,500,300,209 代表什么 呢?我们可以猜想:它很像是坐标上的(x,y)的格式,是不是呢? 可可以先让其他数值不变,只让309改变,改变后发现上面的墙变 粗了,由此可见这
5、个数字控制的是一堵墙的最下面一行的坐标。关于该程序的 相关分析思路答题模板: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
6、代表墙的最上面一 行的位置,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语句控制的坐标代表的意思。只 要明白了坐标的意思,就可以实现对游戏的改编。第二步就是进行对新加入的墙蛇是否撞上死亡For(i=3;isnake.node;i-)/蛇的第四节开始判断是否撞
7、到自己了,因为蛇头为两节,第三节不可能拐过来*/ if(snake-xi=snake _x0&snake.yi=snake-yO) _ , GameOuer()齐显示失败 snake.life=1; break;if(snake.x0595|snake.y0455)GameQuer。;/*本次蜚戏结束*/snake_liFe=1; /某旅死*/ -nake-x0190&snake_x0=280& snake.yB9O&snake-x0=110&snake-y0190&snake.x0=200&snake.y0=215)/*其中,对x,y范围的控制,实际是对蛇撞击的死亡区域的限制。*/GameO
8、ver();/*本次游戏结束*/ snake.life=1; /* 蛇死*/相应的新添加的墙。for(i=200;i=500;i+=10)/* 画围墙*/rectangle(i,200,i+10,209); /* 指定位置*/第三步食物的定点出现玩游戏具体过程*/uoid GamePlay(uoid) _ _iF(Food.yes=B)/*iSj面上有食物了就要显示*/ setcolor(GREEN);rectangle(Food-x,food _y,food_x+10,Food_y-18);if(food.yes=1)/*需要出现新食物*/这里说明一下:rand。产生0-65535的数,在l
9、imits.h里有定 义400后产生一个0-399的数+60则为60 -459,即:%400+60 意思是在60399之间随机产生一个数。food.x=randO%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列的随机行第四步对食物墙壁的颜色以及对蛇的运
10、动速uoitf DrawKCuoitf)/*setbkcolor(LIGHTGREEN);*/ setcolor(11):int score=Q;/*/个性化调节int gamespeed=5000Q;/*j戏速度自己调整*/ jtruct Foodsetcolor(4);/ 对颜 色的调整 int gamespeed=50000;/*游戏速度自己调整*/通过改变变量的值,就可以个性化选择自己喜欢的颜色,这将是一场别开生面的游戏界面。*红色代表解析 浅蓝代表提示三.课程设计总结有言曰:“实践出真知二在这几天的课程设计实践中,我们组三第八页共十六页人真正的体会到了这句话的真谛。在经历了一学期的C
11、语言学习后,我们从以往的“纸上谈兵” 直接过渡到“实际作战”。我们实现了让静态的程序变成动态的游戏 效果,虽然我们只是改编了一下别人做好的程序,但我们同样由此获 益匪浅,感触颇深,当然也发现了许多自己的不足。首先,在我们刚刚进行第一步“寻找程序”的时候,就被搁浅了, 因为我们发现,在网上能找到一个真正符合我们使用标准的程序彳艮 难,就是找到了几个也没有能运行它们的程序。我们花费了前两天的 时间来寻找能够使用的程序和软件,但最后还是一无所获,正当我们 一筹莫展的时候,我们的导师杨老师给我们带来了曙光,使得我 们在黑暗中找到了希望的光明,杨老师给我们传来了一个上届师哥做 好的程序,并且把它的运行软
12、件也给了我们,这对我们来说无疑是雪 中送炭,得到这个程序后,我们三个人看到了 C语言运行一个游戏 的流程和方法,我们脑中也大概有了一个思路。我们三个人以此程序 为跳板,直接开始对程序模块进行挑选,因为我们已经浪费了两天, 所以我们决定进行分工作业,分别去寻找:筑墙模块,加苹果模块, 撞墙死模块。最后我们用了一下午时间完成了三大步中的前两大步和 第三步的第一部分,剩下的就是最重要而充满挑战的改编了,从以上 的操作中,让我们明白了找对一个平台的重要性,这个平台就是老师 给我们的程序,就是我们的前进方向。没有了方向了的征程,一开始 就是个错误。在我们寻找程序模块的时候,我们对于程序中的很多东 西都是
13、模模糊糊的概念,比如struck是什么,比如for语句的使用,以及for语句的循环体是什么,当然我们也发现了定义字符在长的程 序中的方便与重要性。还有就是我们发现程序在编写时的规范性很重 要,比如同级别花括号的位置的对应,对应好了,模块就好找,对应 不好就很乱。还有定义函数及变量的时候,函数名字和变量名最好是 见名知意,比如我们所看的程序中,gamespeed,snakecolour, fOod.在最后的攻坚阶段,为了实现对程序的改编,我们使用控制变 量猜想法是正确的选择,比如设置墙的时候for(i=200;i=500;i+=10); rectangle(i,300,i+10,309);中的
14、200,500,300,209 代表什么呢? 我们猜 想:它很像是坐标上的危矽的格式,是不是呢?我们先让其他数值不 变,只让309改变,改变后发现上面的墙变粗了,由此我们知道这个 数字控制的是一堵墙的最下面一行的坐标。我们用这个方法知道了其 他彳艮多数值的用途。我们用这种方法先是知道了如何设置一堵墙,在 我们欣喜设置一堵墙以后才发现:蛇撞了墙后不死。在我们进行了全 局来看以后才知道,原来设计一堵墙,都要再设计一个if语句来使得 蛇在这个范围内会死亡。并且我们发现在设计这个if语句的时候,不 仅要计算好墙的坐标,而且还要用好逻辑语言(&, | !)同时语 句的运算顺序也很重要。刚一开始我们忽略的
15、&和关系运算符级别 的高低,使得我们设计的墙,总是撞不死蛇,为此我们很是恼火,着 急的组员还在这里发生了点小摩擦,由此可见C语言的严谨性! 最后我们又通过在网上查找信息,知道了随机数发生器randomizeO 的用法:rand()=x%+d意思是说在d(x-1)之间随机产生一个数字。 我们很自然的联想到,如果把food.x等于常数a;把food.y等于一个;x%+d的随机数,那不就能固定只在某一行出现苹果了吗?所以我 们觉得,充分利用手边的资源也是很重要的,毕竟C语言很高深, 课本上的东西总是有限的,要想知道更多的东西还需多练习,多查阅 资料。总之:革命尚未成功,通知还需努力啊!四个人感受:汤
16、X:就我个人而言,这次课程设计,我觉得我最大的收获就是:我 明白了,我们其实真的没那么厉害,我们真的还有很多东西不会,我 们真的连课本上的基本东西都没掌握,课本上的东西,真的也只是C 语言这个大海中的一滴水而已。而在我本人还没有掌握好课本的知识 点的情况下,做起这个程序自然很费事,一个简单的课本P293讲到 的struct结构体,我一开始竟然忘记它是什么意思,不知道它是什么, 就更不用谈怎么用它了。还有逻辑语言的使用。我想,现在肯定有很 多同学还不知道逻辑运算的优先次序吧?这个问题我本人在使用逻 辑语言的时候也不太会,还查看了书。像这些小的知识点,我个人认 为如果掌握不好的话,是不可能让整个大
17、程序运行起来的。还有比如 我在遇到程序显示“else多余”的警告时候不不知所措,问了老师才 知道是if()后面加了 “厂而且if没有用“”来固定范围,这个 错误原因是分号使得if语句结束了,孤立的else当然是多余的了。一 个小小的分号使得程序无法运行,由此可见在今后的编程中,一定要 注意谨慎,仔细。同时要注意记住平时编程的时候,出现的错误指示 是什么意思。比如这次的“else多余”就是因为if后多了分号。还有 在编程时候,书写一定要规范,特别是if语句的花括号的位置要对应 起来,因为位置决定范围。注意定义变量和函数要使用规范的英文单 词,这样才能见名知意,为以后修改找变量节省时间。对于这次课
18、题 中,“设计一个墙,就要对应一个函数舍得蛇撞墙死”,让我明白,C 语言程序中各部分的联系性,牵一发而动全身,所以在编程时一定要 注意全局的把握。我们最后还要说说在编程中,好好利用网络资源, 因为课本里的东西总是有限的,而C语言又那么高深,像随机数发 生器,还有颜色的定都是我第一次接触,这些东西的用处可是颇大, 以后一定好好学习。多看,多练,多总结。最后还要感谢指导老师, 杨老师对我学习的帮助和指导。徐 XXX:刚开始拿到题目时候什么也不会一片茫然,从网上找了一个 程序一看,太吓人了,这么长怎么看啊,而且还是错误的。没办 法只能硬着头皮去改了,但是在改的过程中才发现其实c语言没 有想象的那么难
19、而且还彳很有意思,只是自己平时没有好好学所以 在改的时候非常吃力,有很多简单的知识都不知道,没有记住。 没办法只能借助与课本了。但是几天下来发现自己已经不再像以 前那样是个菜鸟了,虽然很多知识还没掌握。同时在编改程序的时候切记不能烦躁要静心慢慢来,好几次 自己都因心燥出现了很多不该出现的错误浪费了很多时间。对键盘的熟悉在编程时也是很重要的,自己在写的时候往往 就是跟一指禅差不多眼睛盯着键盘打,打错了也不知道最后导致 整个程序都是错误的,就因为一个打错了一个字母。总的来说这次课程设计收获很多,也知道了自己的不足, 在以后的学习中要多实践,实践很能提高自己的能力。刘XX:4天的C语言课程设计上机学
20、习让我感受颇多,每天都发现新 的问题,又不得不绞尽脑汁解决问题,心情就像正弦函数,随着 问题的出现和解决一起一伏。刚开始接触贪吃蛇的C语言成寻时,看着C-free上面出现的 有十几个错误的程序,一片茫然不知所措。只能继续在网上搜索 错误较少的程序,并结合书上的基础知识查看错误所在,最终发 A不能在C-free中运行,只能在mytc5.6上运 行。作为小组中唯一的女生,明显感觉有压力,打字速度不如另外两 个男生,对游戏和程序的敏感也不如他们强,有种小小的挫败感。 旁边小组的同学也给我很大的压力。他们自己编写程序,我很佩 服他们,越是这样想。心里越着急,越不能解决问题,每当感觉 有压力的时候,就提
21、醒自己心静,认真的看程序。在学习过程中, 深深的发现了自己的不足之处,对于C语言,只学了一点点皮毛 东西,想要学好C语言,编好程序,还要付出很多的努力,还要 用更多的时间来学习C语言这门深奥的学科。现在只能借用别人已经写好的程序,在别人的基础上,一点点进 步和学习,比如程序中筑墙,需要仿照已有的程序,结合逻辑运 算,关系运算和数学知识才能让蛇撞墙死。苹果位置的出现也同 样需要进一步的搜索,通过更改食物的横纵坐标以及出现的概率 来确定食物的位置。编写程序时,也发现书上的东西对于程序的某些部分来说, 没有什么作用,显得太浅显,想要实现老师给出的一些要求,还 需要实践,通过上机学习,自己摸索才能成功
22、。一次次修改,一 次次失败,就像贪吃蛇想方设法吃苹果会Game over,我们只有 认真学好基础理论,并结合实践经验才会取得进步。在这次学习过程中,我彳艮感谢我的组员,虽然有时我们的意 见出现分歧,但是通过大家的共同努力,我们收获了很多,一起 讨论,一起研究怎样解决问题,对老师提出的要求个个击破,我 们拧成一股绳共同应对问题,让我感受了团队的力量希望在以后 的学习过程中,我们依然能够互相帮助,共同进步。五课程设计修改后的程序1 .加墙fbr(i=200;i=500;i+=10)/* 画围墙*/(rectangle(i,200,i+10,209); /* 指定位置 1*/fbr(i=120;i190&snake.x0=200&snake.y090&snake.x0=110&snake.y0=215)(GameOver。;/*本次游戏结束*/snake.life=1; /* 蛇死 */