user-0 提问: c语言贪吃蛇代码求分析？

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: 1. 先找到main 2. 然后顺序往下看 3. 遇到函数就看函数体内容 4. 直到看完 5. 理解不了的地方加断点，调试，看内存变量

user: user-0
content: 是一个贪吃蛇代码，运行环境VC++6.0（亲测完美运行）*/ /*该程序在dos系统下运行，不需要graphics.h头文件*/ /*该程序由C语言小方贡献，谢谢您的支持*/ //这是原版代码，提问时一些符号不让输入。。。。。。 #include <windows.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #include <string.h> #include <conio.h> #define N 21  int apple[3]; char score[3]; char tail[3];   void gotoxy(int x, int y)    //输出坐标  {         COORD pos;         pos.X = x;          pos.Y = y;         SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); }  void color(int b)         //颜色函数  {     HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;      SetConsoleTextAttribute(hConsole,b) ; }   int Block(char head[2])   //判断出界  {         if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))                 return 1;         return 0; }  int Eat(char snake[2])   //吃了苹果  {         if ((snake[0] == apple[0]) && (snake[1] == apple[1]))        {                 apple[0] = apple[1] = apple[2] = 0;                 gotoxy(N+44,10);                 color(13);                 printf("%d",score[0]*10);                 color(11);                 return 1;            }         return 0; }  void Draw(char **snake, int len)    //蛇移动  {         if (apple[2]) {                 gotoxy(apple[1] * 2, apple[0]);//apple[1] 这里为什么要乘以2？？？？？？                 color(12);                 printf("●");                 color(11);         }         gotoxy(tail[1] * 2, tail[0]);         if (tail[2])           {  color(14);                 printf("★");                 color(11);          }     else          printf("■");         gotoxy(snake[0][1] * 2, snake[0][0]);         color(14);         printf("★");         color(11);         putchar('\n'); }  char** Move(char **snake, char dirx, int *len)   //控制方向  {         int i, full = Eat(snake[0]);         memcpy(tail, snake[(*len)-1], 2);         for (i = (*len) - 1; i > 0; --i)                  memcpy(snake[i], snake[i-1], 2);         switch (dirx)            {             case 'w': case 'W': --snake[0][0]; break;               case 's': case 'S': ++snake[0][0]; break;            case 'a': case 'A': --snake[0][1]; break;            case 'd': case 'D': ++snake[0][1]; break;            default: ;          }           if (full)               {                  snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));                 snake[(*len)] = (char *)malloc(sizeof(char) * 2);                 memcpy(snake[(*len)], tail, 2);                 ++(*len);                 ++score[0];                 if(score[3] < 16)                  ++score[3];                 tail[2] = 1;            }            else                  tail[2] = 0;                 return snake; }  void init(char plate[N+2][N+2], char ***snake_x, int *len)  //初始化  {         int i, j;         char **snake = NULL;          *len = 3;         score[0] = score[3] =3;         snake = (char **)realloc(snake, sizeof(char *) * (*len));         for (i = 0; i < *len; ++i)                 snake[i] = (char *)malloc(sizeof(char) * 2);                          for (i = 0; i < 3; ++i)                  {                 snake[i][0] = N/2 + 1;                 snake[i][1] = N/2 + 1 + i;              }                        for (i = 1; i <= N; ++i)                  for (j = 1; j <= N; ++j)                          plate[i][j] = 1;                                   apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;         apple[2] = 1;          for (i = 0; i < N + 2; ++i)                  {                 gotoxy(0, i);                 for (j = 0; j < N + 2; ++j)                          {                         switch (plate[i][j])                                  {                              case 0:                                   color(12);printf("□");color(11); continue;                         case 1: printf("■"); continue;                              default: ;                              }                     }                    putchar('\n');             }          for (i = 0; i < (*len); ++i)        {                 gotoxy(snake[i][1] * 2, snake[i][0]);                 printf("★");             }          putchar('\n');         *snake_x = snake; }  void Manual() {         gotoxy(N+30,2);         color(10);         printf("按 W S A D 移动方向");         gotoxy(N+30,4);         printf("按 space 键暂停");          gotoxy(N+30,8);         color(11);         printf("历史最高分为: ");         color(12);         gotoxy(N+44,8);         printf("%d",score[1]*10);         color(11);         gotoxy(N+30,12);         printf("你现在得分为: 0");          }  int File_in()     //取记录的分数  {    FILE *fp;    if((fp = fopen("C:\\tcs.txt","a+")) == NULL)    {             gotoxy(N+18, N+2);      printf("文件不能打开\n");          exit(0);    }    if((score[1] = fgetc(fp)) != EOF);    else    score[1] = 0;    return 0; }  int File_out()    //存数据  {                  FILE *fp;         if(score[1] > score[0])          {gotoxy(10,10);         color(12);         puts("闯关失败 加油耶");         gotoxy(0,N+2);          return 0;         }         if((fp = fopen("C:\\tcs.txt","w+")) == NULL)         {                 printf("文件不能打开\n");                 exit(0);         }     if(fputc(--score[0],fp)==EOF)            printf("输出失败\n");     gotoxy(10,10);         color(12);         puts("恭喜您打破记录");          gotoxy(0,N+2);         return 0; }   void Free(char **snake, int len)    //释放空间  {         int i;         for (i = 0; i < len; ++i)                  free(snake[i]);         free(snake); }  int main(void) {         int len;         char ch = 'g';         char a[N+2][N+2] = {{0}};         char **snake;         srand((unsigned)time(NULL));         color(11);         File_in();         init(a, &snake, &len);         Manual();         while (ch != 0x1B)   // 按 ESC 结束           {                  Draw(snake, len);                 if (!apple[2]) {                         apple[0] = rand()%N + 1;                         apple[1] = rand()%N + 1;                         apple[2] = 1;                 }                 Sleep(200-score[3]*10);                 setbuf(stdin, NULL);                 if (kbhit())                    {                         gotoxy(0, N+2);                         ch = getche();                     }                  snake = Move(snake, ch, &len);                   if (Block(snake[0])==1)                    {                         gotoxy(N+2, N+2);                         puts("你输了");                         File_out();                         Free(snake, len);                         getche();                         exit(0);                    }                                 }         Free(snake, len);         exit(0); }//能不能给分析一下？我看不懂，。。。。。。