贪吃蛇毕业论文范本模板.docx
- 文档编号:7900649
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:18
- 大小:43.95KB
贪吃蛇毕业论文范本模板.docx
《贪吃蛇毕业论文范本模板.docx》由会员分享,可在线阅读,更多相关《贪吃蛇毕业论文范本模板.docx(18页珍藏版)》请在冰豆网上搜索。
贪吃蛇毕业论文范本模板
ﻩ
c:
\iknow\docshare\data\cur_work\\l
一.功能描述2
三、设计的具体实现ﻩ3
(1)函数定义3
(2)主函数main( )4
(3)画界面函数DrawK( )5
(5)游戏结束函数GameOver()8
五、测试结果ﻩ10
六、设计心得体会12
七、参考文献ﻩ12
八、源代码ﻩ13
一.功能描述
基本功能:
开始蛇向右方移动。
按键盘上定义的上下左右键,蛇改变游动的方向,可以上下左右游动。
蛇不能碰到图中的灰色栅栏,如碰到游戏结束.若蛇碰到图中一粒豆子,则豆子被蛇吃掉,图中的豆子消失,蛇身变长。
最终所有的豆子都被吃掉,游戏结束.
增强要求:
(1)必须改进游戏的界面,增加显示相关的统计信息。
左边的显示区保持不变,右边动态显示积分和总时间统计信息,其中积分栏目显示当前已经吃下的豆子数目,总时间显示本局游戏从开始到现在经过的时间。
(2)优化主程序,注意CPU和内存的使用效率。
(3)考虑一个合理的得分算法,得分值应该取决于吃下去的豆子和游戏持续的时间.
(4)得分可以在发光二极管上显示出来。
二.基本原理
游戏开始后进入游戏界面。
首先初始化蛇的坐标,食物的坐标。
线程基本流程:
判断是否是暂停阶段,是否有有退出按键,游戏是否有结束,如果都没有就执行,如果游戏结束了就重新游戏或者退出.开启键盘功能,实现通过方向键来控制蛇的移动方向; 开启数码管功能,实现蛇吃到食物后能够更新和显示分数; 利用变量,实现吃了6个食物后,游戏能够结束,并能通过增加蛇的移动速度来增加游戏的难度。
三、设计的具体实现
(1)函数定义
函数定义是对各个
基础函数的定义,并且设置需要运用的信息,便于调用
#defineN200
#defineM 200
#include"gra
phics。
h"
#include<stdlib。
h>
#include〈stdio。
h〉
#include<string.h〉
#include<iostream.h〉
#include h> #include〈conio。 h> #include 〈windows.h> #define LEFT97//A #define RIGHT100//D #defineDOWN 115//S #defineUP119//W #defineEsc0x011b inti,key; intscore=0; intgamespeed=250;//游戏速度可根据实际情况自行调整 structFood { intx;//食物的横坐标 inty;//食物的纵坐标 ﻩintyes;//判断是否要出现食物的变量 }food;//食物的结构体 struct Snake { intx[M]; ﻩinty[M]; ﻩint node;//蛇的节数 intdirection;//蛇的移动方向 ﻩintlife;//蛇的生命,0表示活着,1表示死亡 }snake; voidInit();//图形驱动 void Close();//图形结束 voidDrawK();//开始画面 voidGamePlay();//玩游戏的具体过程 voidGameOver();//游戏结束 voidPrScore();//输出成绩 (2)主函数main() 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序 voidmain()//主函数 { Init();//图形驱动 DrawK();//开始画面 GamePlay();//玩游戏的具体过程 Close();//图形结束 } voidInit()//图形驱动 { intgd=DETECT,gm; initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/ cleardevice(); } (3)画界面函数DrawK() 主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色. voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 { setbkcolor(GREEN); setcolor(LIGHTRED); ﻩsetlinestyle(0,0,5);//设置线型 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);//右边 } } (4)游戏具体过程函数GamePlay( ) 这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。 void GamePlay()//玩游戏的具体过程 { ﻩrand();//随机数发生器 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())//在没有按键的情况下,蛇自己移动身体 ﻩ{ ﻩﻩ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;i〉0;i--)//蛇的每个环节往前移动,也就是贪吃蛇的关键算法 ﻩﻩ{ ﻩﻩﻩsnake.x[i]=snake.x[i-1]; ﻩﻩﻩsnake。 y[i]=snake。 y[i-1]; } switch(snake。 direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头 ﻩ{ case 1: ﻩﻩﻩﻩ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;i<snake。 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]==food.x&&snake.y[0]==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(WHITE);//画出蛇 ﻩﻩfor(i=0;i<snake.node;i++) rectangle(snake。 x[i],snake。 y[i],snake。 x[i]+10,snake.y[i]-10); ﻩﻩﻩSleep(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); ﻩﻩ} ﻩﻩif(snake.life==1)//如果蛇死就跳出循环 ﻩbreak; key=getchar();//接受案件 ﻩ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; else if(key==DOWN&&snake.direction! =3) ﻩﻩsnake。 direction=4; ﻩ}//endwhile (1) } (5)游戏结束函数GameOver() 游戏结束,清除屏幕,输出分数,显示游戏结束信息 voidGameOver()//游戏结束 { ﻩcleardevice(); ﻩPrScore(); setcolor(RED); ﻩouttextxy(100,100,”我会回来的! ! ! ! ! ”); ﻩgetch(); } void PrScore()//输出成绩 { charstr[10]; ﻩsetfillstyle(SOLID_FILL,YELLOW); ﻩbar(50,15,220,35); setcolor(6); sprintf(str,”score: %d”,score); outtextxy(55,20,str); } voidClose()//图形结束 { getch(); closegraph(); } 四、调试及解决方法 可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功。 五、测试结果 六、设计心得体会 在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识 1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序 十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增 加了程序的可读性。 2)分析函数先从main()函数入手.Main()函数是C++源程序编译时的开始, 从main()函数开始读函数可将其他函数的功能理解得更透彻。 3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出 来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。 4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行 处理的函数,起功能我都有所了解。 5)学会了有关头文件的使用方法,及系统调配问题的解决方法等. 6)了解到了注释的重要性. 七、参考文献: 谭浩强,《C++程序设计》 清华大学出版社 郭翠英,《C语言课程设计案例精编》,中国水利水电出版社,2004.3 李丽娟,《C语言程序设计教程》 人民邮电出版社 林华聪,《C语言程序设计思想与实践》 冶金工业出版社 八、源代码 #defineM 200 #include”graphics.h" #include<stdlib。 h〉 #include #include<string.h〉 #include h〉 #include〈dos。 h〉 #include〈conio.h> #include h> #defineLEFT97//A #define RIGHT100//D #defineDOWN 115//S #defineUP 119//W #defineEsc0x011b inti,key; intscore=0; intgamespeed=250;//游戏速度可根据实际情况自行调整 struct Food { intx;//食物的横坐标 inty;//食物的纵坐标 ﻩintyes;//判断是否要出现食物的变量 }food;//食物的结构体 structSnake { int x[M]; inty[M]; intnode;//蛇的节数 ﻩintdirection;//蛇的移动方向 int life;//蛇的生命,0表示活着,1表示死亡 }snake; voidInit();//图形驱动 voidClose();//图形结束 voidDrawK();//开始画面 void GamePlay();//玩游戏的具体过程 voidGameOver();//游戏结束 voidPrScore();//输出成绩 void main()//主函数 { Init();//图形驱动 ﻩDrawK();//开始画面 GamePlay();//玩游戏的具体过程 ﻩClose();//图形结束 } void Init()//图形驱动 { ﻩint gd=DETECT,gm; ﻩinitgraph(&gd,&gm,”");/*此处为turboc的路径,读者可以根据自己的电脑而改*/ ﻩcleardevice(); } voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 { ﻩsetbkcolor(GREEN); setcolor(LIGHTRED); setlinestyle(0,0,5);//设置线型 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()//玩游戏的具体过程 { ﻩrand();//随机数发生器 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())//在没有按键的情况下,蛇自己移动身体 ﻩ{ ﻩﻩﻩ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;i>0;i--)//蛇的每个环节往前移动,也就是贪吃蛇的关键算法 { ﻩﻩﻩsnake。 x[i]=snake.x[i—1]; ﻩsnake。 y[i]=snake。 y[i—1]; ﻩﻩ} ﻩswitch(snake。 direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头 ﻩﻩ{ case 1: ﻩﻩﻩsnake.x[0]+=10;break; ﻩﻩﻩcase2: ﻩﻩsnake.x[0]-=10;break; ﻩﻩcase3: ﻩﻩsnake。 y[0]—=10;break; ﻩcase 4: ﻩsnake。 y[0]+=10;break; } ﻩﻩfor(i=3;i<snake.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]==food.x&&snake.y[0]==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(WHITE);//画出蛇 ﻩfor(i=0;i〈snake.node;i++) ﻩﻩﻩrectangle(snake。 x[i],snake。 y[i],snake.x[i]+10,snake。 y[i]-10); ﻩ ﻩSleep(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); } ﻩif(snake。 life==1)//如果蛇死就跳出循环 ﻩﻩbreak; ﻩkey=getchar();//接受案件 ﻩﻩif(key==Esc)//按ESC键退出 ﻩﻩﻩbreak; else if(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; ﻩelse if(key==DOWN&&snake。 direction! =3) ﻩﻩsnake。 direction=4; }//endwhile(1) } voidGameOver()//游戏结束 { cleardevice(); ﻩPrScore(); setcolor(RED); outtextxy(100,100,"我会回来的! ! ! ! ! "); getch(); } voidPrScore()//输出成绩 { ﻩcharstr[10]; ﻩsetfillstyle(SOLID_FILL,YELLOW); ﻩbar(50,15,220,35); ﻩsetcolor(6); sprintf(str,”score: %d",score); outtextxy(55,20,str); } void Close()//图形结束 { getch(); closegraph(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 毕业论文 范本 模板