#include<cstdio>
#include<windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
const int N=17,M=30;
char m[2*N][2*M],ctl;
int d[4][2]={
{
-1,0},{
1,0},{
0,-1},{
0,1}},dir=-1,len=1;
bool flag=1;
void HideCursor()//隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = {
1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void mkmap()
{
for(int i=0;i<=N+1;i++)
m[i][0]=m[i][M+1]='#';
for(int i=0;i<=M+1;i++)
m[0][i]=m[N+1][i]='#';
}
void print()//输出
{
system("cls");
for(int i=0;i<=N+1;i++)
{
for(int j=0;j<=M+1;j++)
putchar(m[i][j]);
putchar('\n');
}
}
class snake//定义snake类型
{
public:
snake* ne;
int x,y;
void move(int tox,int toy)//移动到它上一个节点的位置
{
m[x][y]=' ';
x=tox,y=toy;
m[x][y]='*';
}
snake(int a,int b)//初始化
{
x=a,y=b;
m[x][y]='*';
ne=NULL;
}
};
snake head(N/2,M/2);//蛇的头
void bmove(snake* body,int p,int q,bool add)//蛇身移动
{
int a=body->x,b=body->y;
body->move(p,q);
if(body->ne)//如果它后面有节点
bmove(body->ne,a,b,add);
else if(add)//如果要新增节点
body->ne=new snake(a,b);
}
void hmove(snake* head,int dir)//蛇头移动
{
if(dir==-1) return;
int a=head->x,b=head->y;
int p=a,q=b;
a+=d[dir][0];
b+=d[dir][1];
if(m[a][b]=='#'||m[a][b]=='*')
flag=0;
else
{
bool add=m[a][b]=='@'?1:0;//判断是否需要新增子节点
len+=add;
m[p][q]=' ';
head->x=a,head->y=b;
m[a][b]='*';
if(head->ne)//如果蛇头后面有子节点
bmove(head->ne,p,q,add);
if(add&&head->ne==NULL)//特判只有头节点的情况
head->ne=new snake(p,q);
}
}
void setap()//随机掉落苹果
{
int pd=rand()%25;
if(pd) return;
int x=rand()%N+1,y=rand()%M+1;
m[x][y]='@';
}
int main()
{
HideCursor();
mkmap();
srand(time(0));
while(flag)
{
Sleep(25);//程序暂停,给玩家反应时间
print();
hmove(&head,dir);
setap();
if(!kbhit()) continue;//如果玩家没有改变方向,就继续前进
ctl=getch();//改变方向
if(ctl=='w') dir=0;
if(ctl=='s') dir=1;
if(ctl=='a') dir=2;
if(ctl=='d') dir=3;
}
system("cls");
printf("Your point is %d",len);
return 0;
}
贪吃蛇(终极版...吧)
猜你喜欢
转载自blog.csdn.net/weixin_45383207/article/details/110257522
今日推荐
周排行