贪食蛇游戏设计.docx
- 文档编号:23007243
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:131.43KB
贪食蛇游戏设计.docx
《贪食蛇游戏设计.docx》由会员分享,可在线阅读,更多相关《贪食蛇游戏设计.docx(14页珍藏版)》请在冰豆网上搜索。
贪食蛇游戏设计
高级程序设计实践(C++)课程设计
姓名:
学号:
班级:
设计内容:
贪食蛇游戏
设计时间:
目录
一、系统描述………………………………………3
二、功能模块结构…………………………………3
三、主要模块的算法说明…………………………5
四、运行结果………………………………………5
五、课程设计总结…………………………………6
六、参考文献………………………………………7
七、附录……………………………………………8
一、系统描述
产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;
蛇的运动限制在游戏区域内,游戏区域没有边界,所以蛇在区域内作循环运动;
蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;
蛇的运动速度由游戏的难度来控制,难度越高,速度越快,游戏难度分为9个等级;
蛇身体的长度从1开始每吃掉一份食物就增加一个长度;
食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;
每吃掉一份食物得分为10*游戏的难度,游戏结束后统计全部的得分;
游戏结束的条件为:
在控制蛇的过程中蛇头碰到蛇的身体的任何部位;
二、功能模块结构
退出程序
三、主要模块的算法说明
①食物的产生:
贪食蛇的食物要达到随机出现的目的,应采用rand()函数来实现。
②蛇的产生:
利用指针和sizeof函数来实现。
③移动吃食:
利用GetAsyncKeyState来指导蛇该前行的方向。
还有sleep函数,来控制其速度。
④结束控制:
当蛇碰到墙壁或咬到自己时游戏结束。
主要是对其位置进行判断。
四、运行结果
五、课程设计总结
这设计贪食蛇的过程当中遇到了许多的困难。
比如说食物的随机出现,蛇身该如何增长,速度的控制等等。
经过自己的自习思考,向老师和同学请教,上网查阅资料后,终于一点点的将这些困难解决。
如果用C++中的类来编写这个程序会是的程序更优。
但是由于自己刚开始在设想时,欠缺考虑,没有想到用类来解决这些问题。
所以,在编写程序的过程当中,一定要仔细思考。
要有良好的思维逻辑。
才能编写好的程序来。
在此次课程设计中,仍然存在着许多问题。
原本想用CImg来对贪食蛇及其食物进行处理。
但是发现难度略大。
便没有坚持下去。
编程应该是一个漫长的过程,不应该轻易放弃。
在此次课程设计中,调用到了许多函数。
温习了以前学过的许多知识。
使自己对C++有了更加深入的了解。
六、参考文献
①《C++程序设计》(第二版)谭浩强编著清华大学出版社
.②《VisualC++程序设计学习笔记》刘春辉编著北京电子工业出版社
七、附录
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineCOUTcout<<"■"
structBody
{
intx,y;
Body*next;
};
intFood=0,Food_x,Food_y,Direction=4,Grade,Score=0;
Body*body001=newBody[sizeof(Body)];
voidPosition(intx,inty)
{
COORDpos={y-1,x-1};//表示一个字符在控制台屏幕上的坐标
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);//标准输出的句柄
SetConsoleCursorPosition(Out,pos);//API中定位光标位置的函数
}
voidCreatSnake()//蛇
{
Body*body002=newBody[sizeof(Body)];
Body*body003=newBody[sizeof(Body)];
Body*body004=newBody[sizeof(Body)];
body001->x=11;body001->y=35;
body002->x=11;body002->y=33;
body003->x=11;body003->y=31;
body004->x=11;body004->y=29;
body001->next=body002;
body002->next=body003;
body003->next=body004;
body004->next=NULL;
}
voidPrt_Snake()
{
Body*p;
p=body001;
while(p!
=NULL)
{
Position(p->x,p->y);//返回节点相对与节点列表中所有选定节点的位置
COUT;
p=p->next;
}
Position(Food_x,Food_y);
COUT;
Position(7,63);
cout<<"Score:
"< Position(10,63); cout<<"Grade: "< } intJudgeOver()//结束控制 { Body*p; p=body001->next; if(body001->y==1||body001->y==57||body001->x==1||body001->x==24) return1; while(! (p->x==body001->x&&p->y==body001->y)) { if(p->next==NULL) return0; p=p->next; } return1; } voidCreat_Food()//食物 { if(Food==0) { srand((int)time(0));//随机数发生器的初始化函数 Food_x=rand()%21+2; inttemp=rand()%52+3; if(temp%2==0) Food_y=temp+1; else Food_y=temp; Food=1; } } voidMove()//控制移动 { Body*p=newBody[sizeof(Body)],*q,*temp=newBody[sizeof(Body)]; if(Direction==1) { if(body001->x==(Food_x+1)&&body001->y==Food_y) { temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5; } else { temp->x=body001->x-1;temp->y=body001->y;temp->next=body001;body001=temp; q=body001; while((q->next)->next! =NULL)q=q->next; Position((q->next)->x,(q->next)->y);cout<<""; delete(q->next); q->next=NULL; } } if(Direction==2) { if(body001->x==Food_x&&body001->y==(Food_y+2)) { temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5; } else { temp->x=body001->x;temp->y=body001->y-2;temp->next=body001;body001=temp; q=body001; while((q->next)->next! =NULL)q=q->next; Position((q->next)->x,(q->next)->y); cout<<""; delete(q->next);q->next=NULL; } } if(Direction==3) { if(body001->x==(Food_x-1)&&body001->y==Food_y) { temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5; } else { temp->x=body001->x+1;temp->y=body001->y;temp->next=body001;body001=temp; q=body001; while((q->next)->next! =NULL)q=q->next; Position((q->next)->x,(q->next)->y);cout<<""; delete(q->next);q->next=NULL; } } if(Direction==4) { if(body001->x==Food_x&&body001->y==(Food_y-2)) { temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5; } else { temp->x=body001->x;temp->y=body001->y+2;temp->next=body001;body001=temp; q=body001; while((q->next)->next! =NULL)q=q->next; Position((q->next)->x,(q->next)->y);cout<<""; delete(q->next);q->next=NULL; } } } voidGame() { while (1) { if(JudgeOver()==1)return; if(GetAsyncKeyState(VK_UP)&&Direction! =3)Direction=1; if(GetAsyncKeyState(VK_LEFT)&&Direction! =4)Direction=2; if(GetAsyncKeyState(VK_DOWN)&&Direction! =1)Direction=3; if(GetAsyncKeyState(VK_RIGHT)&&Direction! =2)Direction=4; Creat_Food(); Move(); Prt_Snake(); Sleep(550-Grade*50);//指定暂停时间 } } voidMenuShow() { cout<<""< cout<<""< cout<<""< cout<<""< cout<<"************************************"< cout<<"*welcometosnake! *"< cout<<"*说明*"< cout<<"*功能键: 上键控制向上,下键控制向下*"< cout<<"*左键控制向左,右键控制向右*"< cout<<"*3秒后自动进入游戏*"< cout<<"************************************"< Sleep(2000); for(intb=3;b>=1;--b) { system("cls"); cout< Sleep(1000); system("cls");//调用Sleep函数,即每1000毫秒(1秒)输出一次 } } voidmain() { MenuShow(); Position(12,24); cout<<"PleseSelectGrade: [1~10]"< cin>>Grade;if(Grade<1||Grade>10){cout<<"Worry! "< system("cls"); CreatSnake(); Prt_Snake(); Game(); system("cls"); Position(12,35); { cout<<"(⊙o⊙)很遗憾! "< } Position(13,31); { cout<<"最后得分"< } Position(24,29); getchar(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪食 游戏 设计