//我把缩进给优化了下,再次感谢原作者
//可以吃自己的贪吃蛇源代码
#include<iostream.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 30
void gotoxy(int x,int y)//位置函数
{
    COORD pos;
    pos.X=2*x;
    pos.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a + 1);
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
    int i,j;//初始化围墙
    int wall[N+2][N+2]= {{0}};
    for(i=1; i<=N; i++)
    {
        for(j=1; j<=N; j++)
            wall[i][j]=1;
    }
    color(11);
    for(i=0; i<N+3; i++)
    {
        for(j=0; j<N+3; 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;
    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);
    for(i=0; i<len; i++)
        snake[i]=(int*)malloc(sizeof(int)*2);
    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())
        {
            gotoxy(0,N+2);
            ch=getche();
        }
        switch(ch)
        {
        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(3);
        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)+1;
            apple[1]=rand()%(N-1)+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<<"失败!!!"<<endl;
            for(i=0; i<len; i++)
                free(snake[i]);
//Sleep(INFINITE);
            return 0;
        }
    }
    return 0;
}