C贪吃蛇参考模板_第1页
C贪吃蛇参考模板_第2页
C贪吃蛇参考模板_第3页
C贪吃蛇参考模板_第4页
C贪吃蛇参考模板_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)题目: 贪吃蛇游戏 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 助 教 起止时间: 2009.12.14至2009.12.26 1 / 21课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号学生姓名专业班级程序设计(报告)题目贪吃蛇游戏程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的

2、过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2009 年 12 月 31 日目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1程序功能介绍22.2程序整体设计说明22.2.1设计思路22.2.2数据结构设计及用法说

3、明22.2.3程序结构(流程图)22.2.4各模块的功能及程序说明22.2.5程序结果22.3程序源代码及注释2第3章 课程设计总结3参考资料4第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言(C)课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对C语言课程的基本知识的理解和掌握 2. 掌握C语言编程和程序调试的基本技能 3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2

4、000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。1.3 课程设计的预备知识熟悉C语言及C语言开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍贪吃蛇游戏是一个深受人们喜爱的游戏,一条在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身

5、体交叉蛇头撞到自己的身体游戏结束。2.2程序整体设计说明(1)食物随机出现在游戏区;(2)蛇的移动方向使用键盘的方向键控制;(3)蛇吃到食物身体会变长;(4)蛇头碰到游戏区边界或者自己身体会死亡. 利用图形驱动,制作美观的游戏界面.通过随机函数产生随机数,控制游戏过程食物的出现.定义键盘操作,控制游戏过程蛇的移动方向.画出边界,并判断游戏是否结束.统计游戏过程蛇吃的食物数量,计算并输出游戏成绩.2.2.1设计思路程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自

6、行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇.   两个指针(概念上的指针,不是int *p那个),一个指头一个指向尾巴。 用类似队列的方法,身体上每一块都标名其更前(靠进头部为前)一块的相对位置。比如, 身体上有一块被标识为“2”表示比他更靠前的

7、一块的位置在其上方,以此类推。2.2.2数据结构设计及用法说明 #define N 200stuct Food int x ; /*食物的横坐标*/ int y ; /*食物的纵坐标*/ int yes ; /*判断是否要出现食物的变量*/ food /*食物的结构体*/ struct Snake intxN; /*蛇的横坐标*/ intyN; /*蛇的纵坐标*/ intnode; /*蛇的节数*/ intdirection; /*蛇的移动方向*/ intlife; /*蛇生命,0活着,1死亡*/ snake; (1)主函数main():初始化图形系统,调用DrawK()画出开始画面,调用函数

8、Gameplay (),即玩游戏过程,游戏结束后调用Close()关闭图形系统,结束程序。 (2)画界面函数DrawK(); (3)游戏具体过程函数Gameplay(); (4)游戏结束函数Gameplay(),游戏结束,清除屏幕,输出分数,显示游戏结束信息。 (5)PrScore(),输出分数。 (6)Close()结束程序。函数图形结束。在显示游戏结束信息的画面时,按任意键关闭图形系统。2.2.3程序结构(流程图)图2.2.32.2.4各模块的功能及程序说明源文件: #include <stdio.h> #include <graphics.h> #include

9、<stdlib.h> #include <dos.h> 函数名 功能 void main() 游戏主程序void Init(void); 图形驱动void Close(void); 图形结束void DrawK(void); 开始画面void GameOver(void); 结束游戏void GamePlay(void); 玩游戏具体过程void PrScore(void); 输出成绩2.2.5程序结果程序运行图程序结束图2.3程序源代码及注释#define N 200#include <graphics.h>#include <stdlib.h>

10、;#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/struct Foodint x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/food;/*食物的结构体*/struct Snakeint xN;int yN;int node;/*蛇的节数*

11、/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();/*

12、图形结束*/*图形驱动*/void Init(void)int gd=DETECT,gm;initgraph(&gd,&gm,"c:tc");cleardevice();/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/void DrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/rectangle(i,40,i+10,4

13、9); /*上边*/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.x0=100;snake.y0=100;/*蛇头*/snake.x

14、1=110;snake.y1=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

15、.yes=0)/*画面上有食物了就要显示*/setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);for(i=snake.node-1;i>0;i-)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/snake.xi=snake.xi-1;snake.yi=snake.yi-1;/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction)case 1:snake.x0+=10;break;case 2: snake.x0-=10;break;case 3: sn

16、ake.y0-=10;break;case 4: snake.y0+=10;break;for(i=3;i<snake.node;i+)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/if(snake.xi=snake.x0&&snake.yi=snake.y0)GameOver();/*显示失败*/snake.life=1;break;if(snake.x0<55|snake.x0>595|snake.y0<55|snake.y0>455)/*蛇是否撞到墙壁*/GameOver();/*本次游戏结束*/snake.l

17、ife=1; /*蛇死*/if(snake.life=1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if(snake.x0=food.x&&snake.y0=food.y)/*吃到食物以后*/setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.xsnake.node=-20;snake.ysnake.node=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node+;/*蛇的身体长一节*/food.yes=1;/*画

18、面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i+)rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.xsnake.node-1,snake.ysnake.node-1,snake.xsnake.node-1+10,snake.ysnake.node-1-10); /*endwhile(!kbhit

19、)*/if(snake.life=1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key=ESC)/*按ESC键退出*/break;elseif(key=UP&&snake.direction!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key=RIGHT&&snake.direction!=2)snake.direction=1;elseif(key=LEFT&&snake.direction!=1)snake.direction=2;elseif(key

20、=DOWN&&snake.direction!=3)snake.direction=4;/*endwhile(1)*/*按键函数*/int specialkey(void) int key; while(bioskey(1)=0); /*等待键盘输入*/ key=bioskey(0); /*键盘输入*/ key=key&0xff? key&0xff:key>>8; /*只取特殊键的扫描值,其余为0*/ return(key); /*返回键值*/*窗口函数*/void mwindow( char *header ) int height; setcol

21、or( MaxColors - 1 );/* 设置当前颜色为白色*/ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );/* 设置视口大小*/ height = textheight( "H" ); /* 读取基本文本大小 */ settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/ settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/ outtextxy( MaxX/4, 2, header ); /*输出标题*/ setviewport

22、( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ drawboder(); /*画边框*/void drawboder(void) /*画边框*/ setcolor( MaxColors - 1 );/*设置当前颜色为白色*/ setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/ getviewsettings( &vp );/*将当前视口信息装入vp所指的结构中*/ rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top );

23、 /*画矩形边框*/*设计鼠标图形函数*/int arrow() int size; int raw=4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4; /*定义多边形坐标*/ setfillstyle(SOLID_FILL,2); /*设置填充模式*/ fillpoly(8,raw); /*画出一光标箭头*/ size=imagesize(4,4,16,16); /*测试图象大小*/ rar=malloc(size); /*分配内存区域*/ getimage(4,4,16,16,rar); /*存放光标箭头图象*/ putimage(4,4,rar,XOR_PUT);

24、/*消去光标箭头图象*/ return 0;/*游戏结束*/void GameOver(void)cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER");getch();/*输出成绩*/void PrScore(void)char str10;setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%

25、d",score);outtextxy(55,20,str);/*图形结束*/void Close(void)getch();closegraph();第3章 课程设计总结通过此次C语言实验程序设计实践,本人实在是获益不浅!当要开始设计的时候,还真不知从哪下手!结果,第一次的上机,我傻坐着不知道该做什么,后来就写了几个预处理命令。回去以后,我想,这样不行,这样下去还得了。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。因此作为二十

26、一世纪的大学来说掌握计算机开发技术是十分重要的。回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在整整半个学期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体通过这次课程设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论