**游戏结构**

      1.知道怎么控制终端上光标的位置。

  #include<stdio.h>
  #include<stdlib.h>
  #include<windows.h>
 int main(intargc,char*argv[])
  {
      COORDpos ={};
       HANDLEhOutput=NULL;
       pos.X=10;
       pos.Y=20;
     hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//获取一个指向特定标准设备的句柄
     SetConsoleCursorPosition(hOutput,pos);
       printf("this issnake\n)
  }

将设置位置功能封装成一个函数

void SetPos(int x, int y)
{
 COORD pos = {0};//COORD是WindowsAPI中定义的一种结构,表示一个字符在控制台屏幕上的坐标。pos是一个结构体变量
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄
 pos.X = x;
 pos.Y = y;
 SetConsoleCursorPosition(handle,pos);//获取标准输出上光标的位置
}

      2:绘制地图
            
根据上图,代码如下:

void CreateMap()
{
 color(7);
 int i = 0;
 //上
 for (i = 0; i <= 58; i += 2)
 {
  SetPos(i, 0);
  printf(WALL);
 }
 //下
 for (i = 0; i <= 58; i += 2)
 {
  SetPos(i,27);
  printf(WALL);
 }
 //左
 for (i = 1; i <= 26; i++)
 {
  SetPos(0,i);
  printf(WALL);
 }
 //右
 for (i = 1; i <= 26; i++)
 {
  SetPos(58,i);
  printf(WALL);
 }
}

      3:绘制蛇
这里的蛇用链表保存。所以需要蛇身体节点,以及维护整条蛇的数据结构,另外,蛇的
前进方向我们定义成枚举,我们也一并把游戏的运行状态也定义了。

#define WALL "■"//墙
#define FOOD "▲"//蛇的食物
#define INIT_X 20//蛇的初始位置
#define INIT_Y 10
//方向
enum  Direction
{
 UP = 1,
 DOWN,
 LEFT,
 RIGHT
};
//游戏状态
enum GameStatus
{
 OK,//正常运行
 NORMAL_END,//正常结束
 KILL_BY_WALL,//撞墙
 KILL_BY_SELF//咬到自己
};
//蛇身节点
typedef struct SnakeNode
{
 int x;
 int y;
 struct SnakeNode* next;
}SnakeNode,*pSnakeNode;
typedef struct Snake
{
 pSnakeNode _pSnake;//维护整条蛇的指针
 pSnakeNode _Food;//维护食物的指针
 int _TotalScore;//总分
 int _AddScore;//加分
 int _SleepTime;//每走一步的睡眠时间
 enum  Direction _Dir;
 enum GameStatus _Status;
}Snake,*pSnake;

初始化蛇

void InitSnake(pSnake ps)
{
 color(4);
 pSnakeNode first = BuyNode();
 pSnakeNode cur = NULL;
 int i = 0;
 first->x = INIT_X;
 first->y = INIT_Y;
 for (i = 1; i <= 4; i++)
 {
  cur = BuyNode();
  cur->x = first->x + 2;
  cur->y = first->y;
  cur->next = first;
  first = cur;
 }
 //绘制蛇
 while (cur)
 {
  SetPos(cur->x,cur->y);
  printf(FOOD);
  cur = cur->next;
 }
 ps ->_pSnake = first;
 SetPos(30,13);
}

      4:产生食物

void CreateFood(pSnake ps)
{
 pSnakeNode pFood = BuyNode();
 pSnakeNode cur = ps->_pSnake;
 pFood->y = rand() % 26 + 1;
 do
 {
  pFood->x = rand() % 55 + 2;
 } while (pFood->x % 2 !=0);
 
 while (cur)
 {
  if (cur->x == pFood->x && cur->y == pFood->y)
  {
   CreateFood(ps);
   return;
  }
  cur = cur->next;
 }
 ps->_Food = pFood;
 SetPos(pFood->x,pFood ->y );
 printf(FOOD);
 //printf("\n");
} 

      5:封装成一个初始化函数
为了用户的友好,加入了一个启动界面

在这里插入代码片