贪吃蛇(终极版...吧)

#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;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页