C语言实践之贪吃蛇游戏思路及代码

来源:互联网 发布:linux花屏 卡死 编辑:程序博客网 时间:2024/05/16 15:33

直入正题


思路

1.绘制地图,利用一个二维数组将地图绘制出来

2.创建蛇  利用一个结构体来构造蛇的结点,然后用数组表示一整只蛇

3.蛇的移动,利用kbhit()函数检测按键响应 并改变蛇的方向

4.蛇的添加结点,


代码如下

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <conio.h>#include <time.h>const int H = 8;//地图的高const int L = 16;//地图的宽char GameMap[H][L];//地图char key = ' ';//按键int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//上下左右int GameState = 0;//游戏状态void Check_Broder();void Check_Head(int x,int y);void CreateFood();void input();int sum =1;//蛇的长度struct snake{// 蛇int x,y;//蛇每个节点位置int now;//方向}snake[H*L];char sbody = '@',food = '*';//定义蛇的符号  食物的符号void MapCreate(){system("title 贪吃蛇");//标题改成贪吃蛇memset (GameMap,'.',sizeof(GameMap));//将GameMap中字符全部替换成'.'system("cls");//清屏srand(time(0));//置随机数种子snake[0].x = rand()%H;//产生蛇头snake[0].y = rand()%L;GameMap[snake[0].x][snake[0].y]=sbody;//画出蛇头CreateFood();for(int i =0;i<H;i++){//绘制地图  for(int j = 0;j<L;j++){  printf("%c",GameMap[i][j]);  }  printf("\n");}//getch();input();}void CreateFood(){int i=0,j=0;//定义食物坐标变量while(1){i = rand()%H;//随机食物x坐标j = rand()%L;//随机食物y坐标if(GameMap[i][j]!=sbody){//检查是否在蛇的位置GameMap[i][j] = food;break;}}}void input(){  if(kbhit()!=0){//判断键盘是否输入    while(kbhit()!=0){//可能有多个按键一次取完  以最后一个为基准key = getch();}  }  switch(key){   case 'w'://上   snake[0].now=0;   break;   case 's'://下       snake[0].now=1;   break;   case 'a'://左       snake[0].now=2;   break;   case 'd'://右       snake[0].now=3;   break;  }}void Move(){int i ,x,y;int t =sum;//保存当前蛇长度;x = snake[0].x; y = snake[0].y; GameMap[x][y]='.';snake[0].x = x + dx[snake[0].now];snake[0].y = y + dy[snake[0].now];Check_Broder();//蛇头是否越界Check_Head(x,y);//蛇头移动情况if(sum == t){  //未吃到食物即蛇身移动哦      for(i = 1; i < sum; i++)  //要从蛇尾节点向前移动哦,前一个节点作为参照   {    if(i == 1)   //尾节点设置为空再移动     GameMap[ snake[i].x ][ snake[i].y ] = '.';         if(i == sum-1)  //为蛇头后面的蛇身节点,特殊处理    {     snake[i].x = x;           snake[i].y = y;        snake[i].now = snake[0].now;    }    else   //其他蛇身即走到前一个蛇身位置    {     snake[i].x = snake[i+1].x;           snake[i].y = snake[i+1].y;        snake[i].now = snake[i+1].now;    }          GameMap[ snake[i].x ][ snake[i].y ] = '#'; //移动后要置为'#'蛇身    }  }}void Check_Broder(){//检查蛇头是否越界if(snake[0].x<0||snake[0].x>=H||snake[0].y<0||snake[0].y>=L){printf("Check_Broder");GameState = 1; }}void Check_Head(int x,int y){//检查蛇头的移动情况if(GameMap[snake[0].x][snake[0].y]=='.'){//假如是空GameMap[snake[0].x][snake[0].y]=sbody;}else if(GameMap[snake[0].x][snake[0].y]=='*'){//假如是食物GameMap[snake[0].x][snake[0].y]=sbody;snake[sum].x=x;snake[sum].y=y;snake[sum].now = snake[0].now;GameMap[snake[sum].x][snake[sum].y]=sbody;sum++;CreateFood();//吃完生成 食物}else{//假如是自己的身体printf("Check_Head");GameState = 1;}}void Show(){int i,j;while(1){_sleep(500);//每半秒刷新一次地图input();Move();if(GameState == 1){printf("游戏失败!");system("pause");break;}system("cls");for(i = 0; i < H; i++)     {      for(j = 0; j < L; j++)     {printf("%c", GameMap[i][j]);     }   printf("\n");    }  }}int main(){MapCreate();Show();return 0;}


代码略显繁琐,笔者初学,请见谅!