c++ 贪吃蛇

#include<iostream.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void gotoxy(int x,int y)//位置函数
{
	COORD pos; //WINDOWS API中定义的一个结构 表示一个字符在控制台屏幕上的坐标,坐上角(0,0)
	pos.X=2*x;
	pos.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//实例化句柄, 重新定义X,Y 就能把光标移动到预定位置,
}
void color(int a)//颜色函数
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);//设置字体颜色
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
	int i,j;//初始化围墙
	int wall[N+2][N+2]={{0}};   //一个23*23的格子
	for(i=1;i<=N;i++) //1-N全部初始化为1
	{
		for(j=1;j<=N;j++)
			wall[i][j]=1;
	}
	color(11);
	for(i=0;i<N+2;i++)
	{
		for(j=0;j<N+2;j++)
		{
			if(wall[i][j])
				cout<<"■";
			else 
				cout<<"□" ;
		}
		cout<<endl;
	}
	gotoxy(N+3,1);//显示信息
	color(20);
	cout<<"按 W S A D 移动方向"<<endl;
	gotoxy(N+3,2);
	color(20);
	cout<<"按任意键暂停"<<endl;
	gotoxy(N+3,3);
	color(20);
	cout<<"得分:"<<endl;
	apple[0]=rand()%N+1;//苹果
	apple[1]=rand()%N+1;
	gotoxy(apple[0],apple[1]); 
	color(12);
	cout<<"●"<<endl;
}
int main()
{
	int i,j;
	int** snake=NULL;
	int apple[2];
	int score=0;   //记录得分
	int tail[2];
	int len=3;
	char ch='p';
	srand((unsigned)time(NULL)); //设置时间
	init(apple);
	snake=(int**)realloc(snake,sizeof(int*)*len); //为snake分配内存
	for(i=0;i<len;i++)
		snake[i]=(int*)malloc(sizeof(int)*2);  //建立一个3*3的数组
	for(i=0;i<len;i++)
	{
		snake[i][0]=N/2; //蛇的初始位置
		snake[i][1]=N/2+i;
		gotoxy(snake[i][0],snake[i][1]);
		color(14);
		cout<<"★"<<endl;
	}
	while(1)//进入消息循环
	{
		tail[0]=snake[len-1][0];  //蛇的尾部位置
		tail[1]=snake[len-1][1];
		gotoxy(tail[0],tail[1]);
		color(11);
		cout<<"■"<<endl;
		for(i=len-1;i>0;i--)
		{
			snake[i][0]=snake[i-1][0];
			snake[i][1]=snake[i-1][1];
			gotoxy(snake[i][0],snake[i][1]);
			color(14);
			cout<<"★"<<endl;
		}
		if(kbhit()) // 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
		{
			gotoxy(0,N+2);
			ch=getche(); //输入后立即从控制台取字符
		}
		switch(ch)
		{//snake[0][0] 表示距离y轴的距离
			case 'w':snake[0][1]--;break;
			case 's':snake[0][1]++;break;
			case 'a':snake[0][0]--;break;
			case 'd':snake[0][0]++;break;
			default: break;
		}
		gotoxy(snake[0][0],snake[0][1]); //移动
		color(14);
		cout<<"★"<<endl;
		Sleep(abs(200-0.5*score));
		if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
		{
			score++;
			len++;
			snake=(int**)realloc(snake,sizeof(int*)*len);  //重新分配内存
			snake[len-1]=(int*)malloc(sizeof(int)*2);      //新分配一块
			apple[0]=rand()%N+1;  //重新生成apple位置
			apple[1]=rand()%N+1;
			gotoxy(apple[0],apple[1]);
			color(12);
			cout<<"●"<<endl;
			gotoxy(N+5,3); //显示分数
			color(20); 
			cout<<score<<endl; 
		}
		if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
		{
			gotoxy(N/2,N/2); //中间位置显示游戏失败
			color(30);
			cout<<"Game over"<<endl;
			for(i=0;i<len;i++)
			free(snake[i]); //释放内存
			Sleep(INFINITE); //永远等待
			exit(0);
		}
	}
	return 0;
}

  

posted on 2015-01-27 11:50  嘘寒问暖  阅读(578)  评论(0编辑  收藏  举报

导航