指导老师:第页实训一贪吃蛇游戏一、实训目的和要求根据老师布置的任务,对项目进行需求分析;确定数据结构和算法;画流程图或N-S图并形成相关文档。根据算法编写程序并且调试程序直到程序通过。本程序实现的主要技巧在二维数组的应用上。目的是通过游戏程序增加编程的兴趣,提高编程水平。二、主要仪器设备安装了Windows操作系统、TurboC或VisualC++的计算机。三、实训内容和原理贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。四、实训小结1、功能描述2、总体设计贪吃蛇游戏图形驱动图形结束开始画面结束游戏游戏过程、、输出成绩江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页(1)功能模块设计图形驱动功能模块:图形结束功能模块:Startgd=DETECTinitgraph(&gd,&gm,c:\\tc)cleardevice()End对显示器进行自检图像模式初始化清除图形屏幕江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页开始画面模块:Startclosegraph()End图形结束江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页游戏过程模块:i=50i=600setcolor(11)setlinestyle(SOLID_LINE,0,THICK_WIDTHStartrectangle(i,40,i+10,49)rectangle(i,451,i+10,460)i=i+10i=40i=450rectangle(50,i,59,i+10)rectangle(601,i,610,i+10)i=i+10End是否是否围墙上边围墙下边围墙左边围墙右边江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页(a)食物出现:非是(b)蛇的自增及死亡:放置食物位置Startrandomize();food.yes=1;/*1snake.life=0;snake.direction=1;snake.x[0]=100;snake.y[0]=100;snake.x[1]=110;snake.y[1]=100;snake.node=2;1!kbhitFood.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=0setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);初始化界面及蛇的出现江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页条件一:撞到自己条件二:撞到墙是非非输出成绩模块:if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)GameOver()snake.life=1for(i=3;isnake.node;i++){if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])}1Startfor(i=snake.node-1;i0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页(2)数据结构设计Startcleardevice()outtextxy(200,200,Gameover)End清除图形屏幕输出分数PrScore()setcolor(RED)settextstyle(0,0,4)设置背景颜色为红色设置字符的显示风格在当前位置输出一个文本字符串江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页structFood{intx;inty;intyes;}food;x表示食物的横坐标;y表示食物的纵坐标;yes用来判断是否要出现食物。structSnake{intx[N];inty[N];intnode;intdirection;intlife;}snake;node表示蛇的节数;direction表示蛇移动方向life表示蛇的生命,其中0活着,1死亡(3)函数功能描述1)函数名称:Init函数原型:voidInit(void);函数实现的的功能:图形驱动2)函数名称:Close函数原型:voidClose(void)函数实现的的功能:图形结束3)函数名称:DrawK函数原型:voidDrawK(void);函数实现的的功能:开始画面4)函数名称:Gameplay函数原型:voidGamePlay(void)江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页函数实现的的功能:游戏的具体过程5)函数名称:Gameover函数原型:voidGameOver(void);函数实现的的功能:游戏结束6)函数名称:prScore函数原型:voidPrScore(void)函数实现的的功能:输出成绩3、程序实现(1)源码分析#defineN200#includegraphics.h#includestdlib.h#includedos.h//里面包含了很多BIOS和DOS调用函数#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000//#defineUP0x4800#defineESC0x011binti,key;intscore=0;/*得分*/intgamespeed=50000;/*游戏速度自己调整*/structFood{intx;/*食物的横坐标*/inty;/*食物的纵坐标*/intyes;/*判断是否要出现食物的变量*/}food;/*食物的结构体*/structSnake{intx[N];inty[N];江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页intnode;/*蛇的节数*/intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/}snake;voidInit(void);/*图形驱动*/voidClose(void);/*图形结束*/voidDrawK(void);/*开始画面*/voidGameOver(void);/*结束游戏*/voidGamePlay(void);/*玩游戏具体过程*/voidPrScore(void);/*输出成绩*//*主函数*/voidmain(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/voidInit(void){intgd=DETECT,gm;/*initgraph(&gd,&gm,c:\\tc);*/initgraph(&gd,&gm,D:\ProgramFiles\WINYES\TC20H);//可以更换TC的位置,initgraph表示图形模式的初始化DETECT系统自动检测图形适配器的最高分辩率模式,并装入相应的图形驱动程序cleardevice();//清除图形屏幕}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/voidDrawK(void){/*setbkcolor(LIGHTGREEN);*///设置背景色setcolor(11);//设置前景色江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/*/voidfarsetlinestyle(intlinestyle,unsignedpattern,intwidth);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);/*右边*/}}/*玩游戏具体过程*/voidGamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*///kbhit()检查当前是否有键盘输入,若有,则输入一个非0的数;否则返回哦;{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);//构造函数Rectangle(intx,inty,intwidth,intheight)}for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];//从最后一个往前移snake.y[i]=snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case1:snake.x[0]+=10;break;case2:snake.x[0]-=10;break;case3:snake.y[0]-=10;break;case4:snake.y[0]+=10;break;}for(i=3;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){江西科技师范学院实验报告年级班号姓名同组姓名实验日期年月日成绩指导老师:第页GameOver();/*显示失败*/snake.life=1;//死亡break;}}if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)/*蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1;/*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if(snake.x[0]==f