贪食蛇游戏设计.docx
《贪食蛇游戏设计.docx》由会员分享,可在线阅读,更多相关《贪食蛇游戏设计.docx(14页珍藏版)》请在冰点文库上搜索。
![贪食蛇游戏设计.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/f5e44092-d35e-4ab6-a31c-6b2d101a06cf/f5e44092-d35e-4ab6-a31c-6b2d101a06cf1.gif)
贪食蛇游戏设计
高级程序设计实践(C++)课程设计
姓名:
学号:
班级:
设计内容:
贪食蛇游戏
设计时间:
目录
一、系统描述………………………………………3
二、功能模块结构…………………………………3
三、主要模块的算法说明…………………………5
四、运行结果………………………………………5
五、课程设计总结…………………………………6
六、参考文献………………………………………7
七、附录……………………………………………8
一、系统描述
产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;
蛇的运动限制在游戏区域内,游戏区域没有边界,所以蛇在区域内作循环运动;
蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;
蛇的运动速度由游戏的难度来控制,难度越高,速度越快,游戏难度分为9个等级;
蛇身体的长度从1开始每吃掉一份食物就增加一个长度;
食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;
每吃掉一份食物得分为10*游戏的难度,游戏结束后统计全部的得分;
游戏结束的条件为:
在控制蛇的过程中蛇头碰到蛇的身体的任何部位;
二、功能模块结构
退出程序
三、主要模块的算法说明
①食物的产生:
贪食蛇的食物要达到随机出现的目的,应采用rand()函数来实现。
②蛇的产生:
利用指针和sizeof函数来实现。
③移动吃食:
利用GetAsyncKeyState来指导蛇该前行的方向。
还有sleep函数,来控制其速度。
④结束控制:
当蛇碰到墙壁或咬到自己时游戏结束。
主要是对其位置进行判断。
四、运行结果
五、课程设计总结
这设计贪食蛇的过程当中遇到了许多的困难。
比如说食物的随机出现,蛇身该如何增长,速度的控制等等。
经过自己的自习思考,向老师和同学请教,上网查阅资料后,终于一点点的将这些困难解决。
如果用C++中的类来编写这个程序会是的程序更优。
但是由于自己刚开始在设想时,欠缺考虑,没有想到用类来解决这些问题。
所以,在编写程序的过程当中,一定要仔细思考。
要有良好的思维逻辑。
才能编写好的程序来。
在此次课程设计中,仍然存在着许多问题。
原本想用CImg来对贪食蛇及其食物进行处理。
但是发现难度略大。
便没有坚持下去。
编程应该是一个漫长的过程,不应该轻易放弃。
在此次课程设计中,调用到了许多函数。
温习了以前学过的许多知识。
使自己对C++有了更加深入的了解。
六、参考文献
①《C++程序设计》(第二版)谭浩强编著清华大学出版社
.②《VisualC++程序设计学习笔记》刘春辉编著北京电子工业出版社
七、附录
#include
#include//该函数主要可以提供一些函数与符号常量
#include//windows.h里定义了关于创建窗口,消息循环等函数
#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();
}