C语言链表实现贪吃蛇游戏

  

阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读。

  

程序可在VS2013下编译运行。

        # include   # include   # include   # include      #定义你1   #定义D 2   #定义L 3   #定义4 R//蛇的状态,U:上;D:下,李:左R:右      typedef struct蛇//蛇身的一个节点   {   int x;   int y;   struct蛇*下;   }蛇;//全局变量//int得分=0,添加=10;//总得分与每次吃食物得分。   int地位,sleeptime=200;//每次运行的时间间隔   蛇*,*食物;//蛇头指针,食物指针   蛇* q;//遍历蛇的时候用到的指针   int endGamestatus=0;//游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。//声明全部函数//空白Pos ();   空白creatMap ();   空白initSnake ();   int biteSelf ();   空白createFood ();   空白cantCrossWall ();   空白snakeMove ();   空白暂停();   空白runGame ();   空白initGame ();   无效的结局();   空白gameStart ();      空白Pos (int x, int y)//设置光标位置   {   COORD pos;   处理hOutput;   pos.X=x;   pos.Y=y;   hOutput=GetStdHandle (STD_OUTPUT_HANDLE);//返回标准的输入,输出或错误的设备的句柄,也就是获得输入,输出/错误的屏幕缓冲区的句柄   SetConsoleCursorPosition (hOutput pos);   }      空白creatMap()//创建地图   {   int我;   (我=0;i<58;我+=2)//打印上下边框   {   Pos (0);   printf("■");//一个方块占两个位置   Pos(我,26岁);   printf (“■”);   }   (i=1;i<26;我+ +)//打印左右边框   {   Pos (0, 1);   printf (“■”);   Pos(56岁的我);   printf (“■”);   }   }      空白initSnake()//初始化蛇身   {   蛇*尾巴;   int我;   蛇的尾巴=(*)malloc (sizeof(蛇));//从蛇尾开始,头插法,以x, y设定开始的位置//尾巴→x=24;   尾巴→y=5;   尾巴→下=零;   (i=1;我& lt;=4;我+ +)//初始长度为4   {   头=(蛇*)malloc (sizeof(蛇));   头→下=尾;   头→x=24 + 2 *我;   头→y=5;   尾=头;   }   而(尾巴!=NULL)//从头到为,输出蛇身   {   Pos(尾部→x,尾巴→y);   printf (“■”);   尾=尾→下;   }   }//& # 63;& # 63;   int biteSelf()//判断是否咬到了自己   {   蛇*自我;   自我=头→下;   而(自我!=NULL)   {   如果(自我→x==头→x和,自我→y==头→y)   {   返回1;   }   自我=自我→下;   }   返回0;   }      空白createFood()//随机出现食物   {   蛇* food_1;   将srand ((unsigned)时间(NULL));//为了防止每次产生的随机数相同,种子设置为时间   蛇food_1=(*) malloc (sizeof(蛇));   在((food_1→x % 2) !=0)//保证其为偶数,使得食物能与蛇头对其   {   food_1→x=rand () % 52 + 2;   }   food_1→y=rand () % 24 + 1;   q=头;   而(q→下一==NULL)   {   如果(q→x==food_1→x和,问→y==food_1→y)//判断蛇身是否与食物重合   {   免费(food_1);   createFood ();   }   q=q→下;   }   Pos (food_1→x, food_1→y);   食物=food_1;   printf (“■”);   }      空白cantCrossWall()//不能穿墙   {   如果(头→x==0 | |头→x==56 | |头→y==0 | |头→y==26)   {   endGamestatus=1;   结局();   }   }      空白snakeMove()//蛇前进,上U,下D, L左,右R   {   蛇* nexthead;   cantCrossWall ();      蛇nexthead=(*) malloc (sizeof(蛇));   如果(状态==U)   {   nexthead→x=头→x;   nexthead→y=头→y - 1;   如果(nexthead→x==食品→x和,食品→nexthead→y==y)//如果下一个有食物//{   nexthead→下=头;   头=nexthead;   q=头;   而(q !=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   分数=得分+添加;   createFood ();   }//其他如果没有食物//{   nexthead→下=头;   头=nexthead;   q=头;   而(q→下一步→下一个!=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   Pos (q→下一步→x,问→下一步→y);   printf (" ");   免费(q→下一个);   问:接下来,=零;   }   }   如果(状态==D)   {   nexthead→x=头→x;   nexthead→y=头→y + 1;   如果(nexthead→x==食品→x和,食品→nexthead→y==y)//有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q !=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   分数=得分+添加;   createFood ();   }//还没有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q→下一步→下一个!=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   Pos (q→下一步→x,问→下一步→y);   printf (" ");   免费(q→下一个);   问:接下来,=零;   }   }   如果L(状态==)   {   nexthead→x=头→x - 2;   nexthead→y=头→y;   如果(nexthead→x==食品→x和,食品→nexthead→y==y)//有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q !=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   分数=得分+添加;   createFood ();   }//还没有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q→下一步→下一个!=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   Pos (q→下一步→x,问→下一步→y);   printf (" ");   免费(q→下一个);   问:接下来,=零;   }   }   如果(状态==R)   {   nexthead→x=头→x + 2;   nexthead→y=头→y;   如果(nexthead→x==食品→x和,食品→nexthead→y==y)//有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q !=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   分数=得分+添加;   createFood ();   }//还没有食物   {   nexthead→下=头;   头=nexthead;   q=头;   而(q→下一步→下一个!=NULL)   {   Pos (q→x,问→y);   printf (“■”);   q=q→下;   }   Pos (q→下一步→x,问→下一步→y);   printf (" ");   免费(q→下一个);   问:接下来,=零;   }   }   如果(biteSelf()==1)//判断是否会咬到自己   {   endGamestatus=2;   结局();   }   }      空白暂停()//暂停   {   而(1)   {   睡眠(300);   如果(GetAsyncKeyState (VK_SPACE))   {   打破;   }      }   }      空白runGame()//控制游戏   {      Pos (64、15);   printf("不能穿墙,不能咬到自己\ n”);   Pos(64年,16);   printf("用↑↓。←,→分别控制蛇的移动。”);   Pos(64年,17);   printf (" F1为加速,F2为减速\ n”);   Pos(64年,18);   printf (" ESC:退出游戏.space:暂停游戏。”);   Pos(64年,20);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

C语言链表实现贪吃蛇游戏