【c语言课程设计贪吃蛇】

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【c语言课程设计贪吃蛇】
【c语言课程设计贪吃蛇】
XX 大学C语言程序设计课程设计(论文)题目:
贪吃蛇院(系):
软件学院专业班级:
学号:
学生姓名:
指导教师:
教师职称:
起止时间:2010.12.20至2010.12.31 课程设计(报告)任务及评语院(系):软件学院教研室:软件教研窒学号学生姓名专业班级程序设计(报告)题目贪吃蛇程序设计(报告)任务程序设计的任务与要求:
(1)掌握C语言编程的基础知识。

(2)较熟练地编写C语言应用程序。

(3)了解C语言的常用标准函数、编程技巧、异常处理。

(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。

(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。

(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。

课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。

正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。

指导教师评语及成绩成绩:
指导教师签字:
2011 年X 月X 日目录第1章课程设计的目的与要求1
1.1 课程设计目的 1 1.2 课程设计的实验环境 1 1.3 课程设计的预备知识1 1.4 课程设计要求1 第2章课程设计内容2
2.1程序功能介绍2 2.2程序整体设计说明2 2.2.1设计思路2 2.2.2数据结构设计及用法说明3 2.2.3程序结构(流程图)4 2.2.4各模块的功能及程序说明5 2.2.5程序结果5 2.3程序源代码及注释6 第3章课程设计总结15 参考资料…………………………………………………………………………………….17 第1章课程设计的目的与要求 1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。

本课程设计的目的和任务:
1. 巩固和加深学生对C语言课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言解决实际问题的能力 1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。

C语言程序设计及相应的开发环境。

1.3 课程设计的预备知识熟悉C语言及C语言开发工具。

1.4 课程设计要求 1. 分析课程设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用
5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍贪吃蛇是一个小游戏,在封闭围墙里,随机出现一个食物,通过按键盘上下左右四个光标键控制蛇移动方向,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,如果蛇在移动中撞到墙或身体交叉蛇头撞到自己身体,则游戏结束。

2.2程序整体设计说明2.2.1设计思路用一个小矩形块表示蛇的一节身体,每增加一个矩形块,蛇身长一节,蛇头用俩节表示。

必须从蛇头开始移动,所以蛇不能向相反的方向移动,如果不按光标键,蛇将自行在当前方向向前移动,但是当按有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按有效方向键后,应先确定蛇头
的位置,然后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置相差一个单位,所以看起来蛇就会多一节身体,所以将蛇的最后一节用背景色覆盖。

食物的出现与消失也是画矩形块和覆盖矩形块。

为了便于理解,定义两个结构体:食物与蛇表示食物与蛇的矩形块设计为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,表示蛇死,则游戏结束。

2.2.2数据结构设计及用法说明int key; 按键的获得int score=0; 得分int gamespeed=*****; 游戏速度自己调整struct Food { int x; 食物的横坐标int y; 食物的纵坐标int yes; 判断是否要出现食物的变量}food; 食物的结构体struct Snake { int x[N]; int y[N]; int node; 蛇的节数int direction; 蛇移动方向int life; 蛇的生命,0活着,1死亡}snake; 2.2.3程序结构(流程图)2.2.4各模块的功能及程序说明主函数定义常数,全局变量,函数原型说明,初始化图形系统,调用drawk()画开始画面。

调用gameplay()关闭图形系统,成语结束。

画界面函数drawk用主面是一个封闭的围墙,两循环语句分别在水平和垂直方向输出连续的宽度和高度均为10单位的矩形方块,表示围墙,函数setlinestyle(solid-line,thick-width)设置线形宽度3像素。

设置3像素围墙线。

游戏函数gameplay(),每次移动时重最后一节到倒数第2节,将前一节坐标付给后一节坐标移动后把最后一节用颜色覆盖,然后蛇头按方向键更改位置。

游戏结束函数gameover (),函数结束,清屏,输出分数,显示游戏结束信息。

Prscore()输出分数,在指定位置用Prscore()将整数转为字符串,用outtextxy ()函数输出。

void main() 游戏主程序算法如下:(1)设置初始值。

食物要设置随机数发生器。

初始时,蛇只有蛇头,设定一个开始方向。

(2)循环执行,按esc退出。

1)没按键时循环执行。

若没有食物,随机出现食物;
有食物,显示食物;
蛇移动身体,根据蛇移动的方向改变坐标,并判断蛇是否撞到墙或自己,是则蛇死,调用结束函数gameover(),结束本游戏,重新开始。

若蛇吃到食物,蛇身体长一节,数组元素增加一个,身体节数和分数都增加。

在新位置画出蛇。

2)如果有按键,识别键值。

按键ESC 结束游戏,按键为方向键,则根据该键改变代表蛇方向的变量direction的值,反方向键无效。

游戏结束函数gameover()游戏结束,清屏,输出分数,显示游戏结束信息。

prscore()输出分数在指定位置用sprintf()将整数转为字符串,用outtextxy()输出,bar()函数的用处是覆盖原来的值。

close()图形结束显示游戏结束信息画面时,按任意键关闭图形系统,程序结束。

2.2.5程序结果下图为贪吃蛇运行图,在运行中按方向键上,下,左,右。

来控制蛇身的运行方向,若蛇吃到食物则蛇身加长,继续游戏。

若蛇身体交叉蛇头撞到自己的身体或撞到墙则蛇死,游戏结束。

如图2.2.5.1和图2.2.5.2所示图2.2.5.1 贪吃蛇运行过图图2.2.5.2贪吃蛇运行结果图 2.3程序源代码及注释#define N 200 #include graphics.h #include stdlib.h #include dos.h #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0; /*得分*/ int gamespeed=*****; /*游戏速度自己调整*/ struct Food { int x; /*食物的横坐标*/ int y; /*食物的纵坐标*/ int yes; /*判断是否要出现食物的变量*/ }food; /*食物的结构体*/ struct Snake { int x[N]; int y[N]; int node; /*蛇的节数*/ int direction ;/*蛇移动方向*/ int life; /* 蛇的生命,0活着,1死亡*/ }snake; void Init(void); /*图形驱动*/ void Close(void); /*图形结束*/ void DrawK(void); /*开始画面*/ void GameOver(void) ;/*结束游戏*/ void GamePlay(void); /*玩游戏具体过程*/ void
PrScore(void);/*输出成绩*/ /*主函数*/ void main(void) { Init(); /*图形驱动*/ DrawK(); /*开始画面*/ GamePlay(); /*玩游戏具体过程*/ Close(); /*图形结束*/ } /*图形驱动*/ void Init(void) { int gd=DETECT,gm; registerbgidriver(EGAVG A_driver); initgraph(gd,gm,“c:\\program files\\winyes\\tc20h\\bgi“); cleardevice(); } /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void) { /*setbkcolor(*****EEN);*/ 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); /*右边*/ } } /*玩游戏具体过程*/ void GamePlay(void) { randomize(); /*随机数发生器*/ food.yes=1; /*1表示需要出现新食物,0表示已经存在食物*/ snake.life=0; /*活着*/ snake.direction=1; /*方向往右*/ snake.x=100;snake.y=100; /*蛇头*/ snake.x=110;snake.y=100; snake.node=2; /*节数*/ PrScore(); /*输出得分*/ while(1) /*可以重复玩游戏,压ESC键结束*/ { while(!kbhit()) /*在没有按键的情况下,蛇自己移动身体*/ { if(food.yes==1) /*需要出现新食物*/ { 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; /*画面上有食物了*/ } if(food.yes==0) /*画面上有食物了就要显示*/ { setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); } for(i=snake.node-1;ii--) /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case 1:snake.x+=10;break; case 2: snake.x-=10;break; case 3: snake.y-=10;break; case 4: snake.y+=10;break; } for(i=3;isnake.node;i++) /*从蛇的第四节开始判断是否撞到自己了,
因为蛇头为两节,第三节不可能拐过来*/ { if(snake.x[i]==snake.xsnake.y[i]==snake.y) { GameOver(); /*显示失败*/ snake.life=1; break; } } if(snake.x55||snake.x595||snake.y55|| snake.y455) /*蛇是否撞到墙壁*/ { GameOver(); /*本次游戏结束*/ snake.life=1; /*蛇死*/ } if(snake.life==1) /*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break; if(snake.x==food.xsnake.y==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; /*画面上需要出现新的食物*/ score+=10; PrScore(); /*输出新得分*/ } setcolor(4); /*画出蛇*/ for(i=0;isnake.node;i++) rectangle(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==UPsnake.direction!=4) /*判断是否往相反的方向移动*/ snake.direction=3; else if(key==RIGHTsnake.direction!=2) snake.direction=1; else if(key==LEFTsnake.direction!=1) snake.direction=2; else if(key==DOWNsnake.direction!=3) snake.direction=4; }/*endwhile(1)*/ } /*游戏结束*/ void GameOver(void) { cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,“GAME OVER“); getch(); } /*输出成绩*/ void PrScore(void) { char str; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,“score:%d“,score); outtextxy(55,20,str); } /*图形结束*/ void
Close(void) { getch(); closegraph(); } ? 第3章课程设计总结通过这次的课程设计,我学到了很多关于计算机方面的知识。

同时通过这次的实际操作,让我对C语言有了更进一步的了解,也更加喜欢这一学科。

同样也有了一次锻炼的机会。

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。

在设计的过程中遇到问题,可以说得上是困难重重,这毕竟是第一次做,难免会遇到过各种各样的问题。

同时在这次课程设计中让我们认识到做程序设计这项工作中我们要具备以下素质:1.很强的团队精神和协作能力和文档习惯。

我从来不相信车到山前必有路的说法,认为那只是懒惰者自寻懒惰的借口,我们要积极,要把握,要努力。

我们自己能做到的仅此而已,因为人力也有所不能及。

我觉得,用到的程序段不必太高级,因为天下事有高低之分,决定优劣的不是集体中某部分的强弱,起决定作用的是组合内各元素的和谐,要能在一个集体中各能尽其用,每个人都能发挥长处,避免自己的短处,那么这个集体的实际组合能量是最优的良好的。

文档是正规研发流程中非常重要的环节,缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。

此外编程是一项高精度的工作所以我们要有规范化,标准化的代码编写习惯。

通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。

2.我们还要有模块化思维能力。

模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,3.学习和总结。

善于总结,
也是学习能力的一种体现,每次完成一个编程任务,一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高,生活就是这样,汗水预示着结果也见证着收获。

在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我们收获的是黎明,这次实际操作必将成为我们人生旅途上一个非常美好的回忆!通过本次论文的设计,我初步学会了论文设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料,这为以后的大学毕业设计论文打下了一个初步的基础,使我获益最大的是享受到了一种成功的喜悦,在这两个星期之中,从开始确定要做的论文题目,然后是和去图书馆查找资料,编写C语言原程序,最后是进行编译,这个环节是一个非常痛苦和艰难的,常常会因为一小点的错误而编译失败,然后再次修改,但失败的次数越多,对人的考验就越多,在编译程序运行成功之后所享受成功的喜悦也就越多,另外在调试程序的过程中不断的思考和运用已经学过的知识,这对于自己是很大的提高。

参考资料姜仲秋.C语言程序设计基础.南京:南京大学出版社,1998 张颖江.C语言程序设计.北京:科学出版社,1998 李大友.C 语言程序设计基础.北京:清华大学出版社,1999 谭浩强.C语言程序设计.北京:清华大学出版社,2000 钱启平.C语言程序设计基础.北京:中国铁道出版社,2000 胡元义.邓亚玲等.数据结构(c语言)实践教程.西安电子科技大学出版社,2007 鲁沐浴.C语言最新编程技巧200例.电子工业出版社,2008 李春葆. 张植民,肖忠付.C语言程序设计题典.清华大学出版社,2006 刑馥生.刘志远,姜德森.C语言程序设计及应用.高等教育出版社,2008 徐金梧.杨德斌.TURBO C实用大全.机械工业出版社,2009 朱战立.数据结构—使用c.语言西安交通大学出版社,2005 刘变红.C语言高级编程实例剖析. 人民邮电出版社2008 徐德民.最新C语言程序设计.北京:电子工业出版社,2008 科
钦.C语言程序设计.北京:电子工业出版社,2010 李成付.C语言程序设计基础.北京:科学出版社,2008 辽ning工业大学。

相关文档
最新文档