贪吃蛇 源代码.docx
- 文档编号:29387454
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:16
- 大小:17.43KB
贪吃蛇 源代码.docx
《贪吃蛇 源代码.docx》由会员分享,可在线阅读,更多相关《贪吃蛇 源代码.docx(16页珍藏版)》请在冰豆网上搜索。
贪吃蛇源代码
#include"stdafx.h"
#include
#include
#include
#include
usingnamespacestd;
constintX=30,Y=15;//初始边界大小
intlevel=1;//初始等级
intlength=3;//初始长度
intfood_bool=0;//食物是否存在
intfood_x,food_y;//食物存在的座标
chardirection='d';//初始方向
intsuccess=1;//成功条件
voidSetPoint(intx,inty)//构造gotoxy函数
{
COORDs={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),s);
}
structbody{//构造蛇和墙体的身体
intx,y;
body*next;
};
body*head=new(structbody);//声明蛇头
body*wall;//声明墙体的头节点
classsnake{//构造蛇类
public:
voidgaming();//声明游戏的主函数
voidmap();//声明边界构造函数
voidpaint_body();//声明蛇体构造函数
voidfood();//声明创建食物函数
voidstr_wall();//声明墙体构造函数
voidadd_wall();//声明墙体添加函数
};
voidsnake:
:
str_wall()//墙体构造函数
{
structbody*p=new(structbody);//声明并初始化操作节点
wall=p;//让墙体头节点等于p
p->x=(rand()+time(NULL))%(X-3)+2;//随机创建节点坐标
p->y=(rand()+time(NULL))%(Y-3)+2;
intk=0;
while(k==0)//判断墙体是否出现在蛇身
{
k=1;
structbody*q;
q=head;
while(q!
=NULL)
{
if(p->x==q->x&&p->y==q->y)
{
k=0;
p->x=(rand()+time(NULL))%(X-3)+2;
p->y=(rand()+time(NULL))%(Y-3)+2;
break;
}
q=q->next;
}
}
SetPoint(p->x,p->y);
cout<<"■";
for(inti=0;i<10;i++)
{
p->next=new(structbody);//构建10个初始墙体
p=p->next;
p->x=(rand()+time(NULL))%(X-3)+2;
p->y=(rand()+time(NULL))%(Y-3)+2;
while(k==0)//判断墙体是否出现在蛇身
{
k=1;
structbody*q;
q=head;
while(q!
=NULL)
{
if(p->x==q->x&&p->y==q->y)
{
k=0;
p->x=(rand()+time(NULL))%(X-3)+2;
p->y=(rand()+time(NULL))%(Y-3)+2;
break;
}
q=q->next;
}
}
k=0;
SetPoint(p->x,p->y);//墙体出现位置正确时画出墙体
cout<<"■";
}
p->next=NULL;//设置末节点为NULL
}
voidsnake:
:
add_wall()//墙体添加函数
{
structbody*p;
for(inti=0;i<3;i++)//判断墙体是否成立
{
p=new(structbody);
intk=0;
p->x=(rand()+time(NULL))%(X-3)+2;
p->y=(rand()+time(NULL))%(Y-3)+2;
while(k==0)
{
k=1;
structbody*q;
q=head;
while(q!
=NULL)
{
if(p->x==q->x&&p->y==q->y)
{
k=0;
p->x=(rand()+time(NULL))%(X-3)+2;
p->y=(rand()+time(NULL))%(Y-3)+2;
break;
}
q=q->next;
}
}
p->next=wall;
wall=p;//将新得到的墙体插入到头节点
SetPoint(p->x,p->y);
cout<<"■";
}
}
voidsnake:
:
food()//创建食物函数
{
intk;
k=0;
food_x=(rand()+time(NULL))%(X-3)+2;
food_y=(rand()+time(NULL))%(Y-3)+2;
body*p;
while(k==0)
{
k=1;
p=wall;
while(p!
=NULL)//判断食物是否出现在墙体上
{
if(p->x==food_x&&p->y==food_y)
{
k=0;
food_x=(rand()+time(NULL))%(X-3)+2;
food_y=(rand()+time(NULL))%(Y-3)+2;
break;
}
p=p->next;
}
p=head;
while(p!
=NULL)//判断食物是否出现在蛇身上
{
if(p->x==food_x&&p->y==food_y)
{
k=0;
food_x=(rand()+time(NULL))%(X-3)+2;
food_y=(rand()+time(NULL))%(Y-3)+2;
break;
}
p=p->next;
}
}
SetPoint(food_x,food_y);//画出食物
cout<<"*";
food_bool=1;
}
voidsnake:
:
map()//边界构造函数
{
system("cls");//清屏
for(inti=0;i<=X;i+=2)//画出墙体
{
SetPoint(i,0);
cout<<"■";
}
for(inti=1;i { SetPoint(0,i); cout<<"■"; } for(inti=1;i { SetPoint(X,i); cout<<"■"; } for(inti=0;i<=X+1;i+=2) { SetPoint(i,Y); cout<<"■"; } SetPoint(X+5,3);//画出信息 cout<<"长度: "< SetPoint(X+5,5); cout<<"等级: "< } voidsnake: : paint_body()//蛇体构造函数 { body*body;//构建身体,比较丑,但是不想改了 head->x=X/2;//游戏开始时,蛇出现在地图中心,此时长度为三 head->y=Y/2; body=new(structbody); head->next=body; body->x=head->x-1; body->y=head->y; body->next=new(structbody); body->next->x=head->x-2; body->next->y=head->y; body->next->next=NULL; SetPoint(head->x,head->y); cout<<"*"; SetPoint(head->next->x,head->next->y); cout<<"*"; SetPoint(head->next->next->x,head->next->next->y); cout<<"*"; } voidsnake: : gaming()//这里是gaming! ! ! ! ! ! ! ! ! ! { inttime_begin=clock(); charx; charx1; structbody*newb; newb=new(body); map();//构造边界 paint_body();//构造蛇身体 str_wall();//构造墙体 food();//构造一个食物 x=direction;//读取方向 while (1) { if(_kbhit())//如果读入缓存中有输入 { x=_getch(); while(_kbhit())//读掉剩下的输入缓存中的数 _getch(); } if(x=='') { _getch(); x=direction; } else if((x=='w'||x=='W')&&direction! ='s') { newb->x=head->x; newb->y=head->y-1; x1='w'; } elseif((x=='a'||x=='A')&&direction! ='d') { newb->x=head->x-1; newb->y=head->y; x1='a'; } elseif((x=='s'||x=='S')&&direction! ='w') { newb->x=head->x; newb->y=head->y+1; x1='s'; } elseif((x=='d'||x=='D')&&direction! ='a') { newb->x=head->x+1; newb->y=head->y; x1='d'; } else { if(x1=='w') { newb->x=head->x; newb->y=head->y-1; } elseif(x1=='a') { newb->x=head->x-1; newb->y=head->y; } elseif(x1=='s') { newb->x=head->x; newb->y=head->y+1; } elseif(x1=='d') { newb->x=head->x+1; newb->y=head->y; } } if(clock()-time_begin>(500-level*45))//移动蛇身,随时间加快 { time_begin=clock(); { direction=x1; newb->next=head; head=newb; } if(head->x==food_x&&head->y==food_y)//遇见食物吃掉,食物小时 { food_bool=0; } if(head->x==X||head->y==Y||head->x==0||head->y==0)//遇到墙体死亡 { success=0; } else { body*p=head->next; if(food_bool==1) { while(p->next! =NULL) { if(p->x==head->x&&p->y==head->y) success=0; p=p->next; } } else { while(p! =NULL) { if(p->x==head->x&&p->y==head->y) success=0; p=p->next; } } } { body*p=wall; while(p! =NULL) { if(p->x==head->x&&p->y==head->y)//遇到墙体死亡 success=0; p=p->next; } } if(success==0) { system("cls"); cout<<"你失败了"< cout<<"死的时候你的长度为"< break; } if(food_bool==1) { body*p=head; while(p->next->next! =NULL)//将指针移到末尾 { p=p->next; } SetPoint(p->next->x,p->next->y);//蛇身移动后最后一部分消失 cout<<""; delete(p->next); p->next=NULL; } else { food(); length++; if(length%5==0) { level++; add_wall(); } if(level==10) success=2; SetPoint(X+5,3); cout<<"长度: "< SetPoint(X+5,5); cout<<"等级: "< } { SetPoint(head->x,head->y);//吃到食物后蛇身增加 cout<<"*"; } if(success==2) { system("cls"); cout<<"你通关了"< break; } newb=new(body); } SetPoint(X+30,Y); } } voidprompt() { cout<<"****************************************************"< cout<<"*欢迎进入贪吃蛇世界*"< cout<<"**代表蛇身或食物*"< cout<<"*■代表墙*"< cout<<"**"< cout<<"**"< cout<<"*初试身体长度为3,每到5的倍数升一级*"< cout<<"**"< cout<<"*wasd操控,注意切换输入法哦*"< cout<<"**"< cout<<"*每升一级速度加快,同时增加三个墙体*"< cout<<"**"< cout<<"*按任意键开始游戏*"< cout<<"*ps: 按空格键暂停*"< cout<<"****************************************************"< _getch(); } intmain(intargc,charargv[]) { snakeH; prompt(); system("cls"); H.gaming(); system("pause"); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃蛇 源代码 贪吃