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