一个简单的c语言贪吃蛇小游戏(本人声明:水平不足,绝非原创)

代码:

  

  1  //*******************************************************  
  2 //*******************************************************  
  3 //******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****  
  4 //*******************************************************  
  5 //*******************贪吃蛇游戏*********************  
  6 //*******************************************************  
  7 #include <stdio.h>  
  8 #include <stdlib.h>  
  9 #include <conio.h>  
 10 #include <string.h>  
 11 #include <time.h>  
 12 const int H = 8;   //地图的高  
 13 const int L = 16;  //地图的长  
 14 char GameMap[H][L];   //游戏地图  
 15 int  key;  //按键保存  
 16 int  sum = 1, over = 0;  //蛇的长度, 游戏结束(自吃或碰墙)  
 17 int  dx[4] = {0, 0, -1, 1};  //左、右、上、下的方向  
 18 int  dy[4] = {-1, 1, 0, 0};  
 19 struct Snake   //蛇的每个节点的数据类型  
 20 {  
 21  int x, y;  //左边位置  
 22  int now;   //保存当前节点的方向, 0,1,2,3分别为左右上下  
 23 }Snake[H*L];  
 24 const char Shead = '@';  //蛇头  
 25 const char Sbody = '#';  //蛇身  
 26 const char Sfood = '*';  //食物  
 27 const char Snode = '.';  //'.'在地图上标示为空  
 28 void Initial();  //地图的初始化  
 29 void Create_Food(); //在地图上随机产生食物  
 30 void Show();   //刷新显示地图  
 31 void Button();  //取出按键,并判断方向  
 32 void Move();   //蛇的移动  
 33 void Check_Border();  //检查蛇头是否越界  
 34 void Check_Head(int x, int y);   //检查蛇头移动后的位置情况  
 35 int main()   
 36 {  
 37  Initial();  
 38  Show();  
 39  return 0;  
 40 }  
 41 void Initial()  //地图的初始化  
 42 {  
 43  int i, j;  
 44  int hx, hy;  
 45  system("title 贪吃蛇");  //控制台的标题  
 46  memset(GameMap, '.', sizeof(GameMap));  //初始化地图全部为空'.'  
 47  system("cls");  
 48  srand(time(0));   //随机种子  
 49  hx = rand()%H;    //产生蛇头  
 50  hy = rand()%L;  
 51  GameMap[hx][hy] = Shead;  
 52  Snake[0].x = hx;  Snake[0].y = hy;  
 53  Snake[0].now = -1;  
 54  Create_Food();   //随机产生食物  
 55  for(i = 0; i < H; i++)   //地图显示  
 56  {   
 57   for(j = 0; j < L; j++)  
 58    printf("%c", GameMap[i][j]);  
 59   printf("\n");  
 60  }  
 61      
 62  printf("\n小小贪吃蛇游戏\n");  
 63  printf("按任意方向键开始游戏\n");  
 64     
 65  getch();   //先接受一个按键,使蛇开始往该方向走  
 66  Button();  //取出按键,并判断方向  
 67 }  
 68 void Create_Food()  //在地图上随机产生食物  
 69 {  
 70  int fx, fy;  
 71  while(1)  
 72  {  
 73   fx = rand()%H;  
 74      fy = rand()%L;  
 75      
 76   if(GameMap[fx][fy] == '.')  //不能出现在蛇所占有的位置  
 77   {   
 78    GameMap[fx][fy] = Sfood;  
 79       break;  
 80   }  
 81  }  
 82 }  
 83 void Show()  //刷新显示地图  
 84 {  
 85  int i, j;  
 86  while(1)  
 87  {    
 88      _sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图  
 89   Button();   //先判断按键在移动  
 90   Move();  
 91   if(over)  //自吃或碰墙即游戏结束  
 92   {   
 93    printf("\n**游戏结束**\n");  
 94    printf("     >_<\n");  
 95    getchar();  
 96       break;  
 97   }  
 98   system("cls");   //清空地图再显示刷新吼的地图  
 99   for(i = 0; i < H; i++)   
100   {   
101    for(j = 0; j < L; j++)  
102     printf("%c", GameMap[i][j]);  
103    printf("\n");  
104   }  
105      
106   //printf("\n小小C语言贪吃蛇\n");  
107   printf("按任意方向键开始游戏\n");  
108  }  
109 }  
110 void Button()  //取出按键,并判断方向  
111 {  
112  if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0  
113  {   
114   while(kbhit() != 0)  //可能存在多个按键,要全部取完,以最后一个为主  
115       key = getch(); //将按键从控制台中取出并保存到key中  
116   switch(key)  
117   {   //
118    case 75:  Snake[0].now = 0;  
119           break;  
120             //
121             case 77:  Snake[0].now = 1;       
122           break;  
123             //
124    case 72:  Snake[0].now = 2;  
125           break;  
126             //
127    case 80:  Snake[0].now = 3;  
128           break;  
129   }  
130  }  
131 }  
132 void Move()   //蛇的移动  
133 {  
134  int i, x, y;  
135     int t = sum;  //保存当前蛇的长度  
136  //记录当前蛇头的位置,并设置为空,蛇头先移动  
137  x = Snake[0].x;  y = Snake[0].y;  GameMap[x][y] = '.';  
138  Snake[0].x = Snake[0].x + dx[ Snake[0].now ];  
139  Snake[0].y = Snake[0].y + dy[ Snake[0].now ];  
140  Check_Border();   //蛇头是否越界  
141  Check_Head(x, y);  //蛇头移动后的位置情况,参数为: 蛇头的开始位置  
142  if(sum == t)  //未吃到食物即蛇身移动哦  
143     for(i = 1; i < sum; i++)  //要从蛇尾节点向前移动哦,前一个节点作为参照  
144  {  
145   if(i == 1)   //尾节点设置为空再移动  
146    GameMap[ Snake[i].x ][ Snake[i].y ] = '.';  
147      
148   if(i == sum-1)  //为蛇头后面的蛇身节点,特殊处理  
149   {  
150    Snake[i].x = x;  
151          Snake[i].y = y;  
152       Snake[i].now = Snake[0].now;  
153   }  
154   else   //其他蛇身即走到前一个蛇身位置  
155   {  
156    Snake[i].x = Snake[i+1].x;  
157          Snake[i].y = Snake[i+1].y;  
158       Snake[i].now = Snake[i+1].now;  
159   }  
160       
161   GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身   
162  }  
163 }  
164 void Check_Border()  //检查蛇头是否越界  
165 {  
166  if(Snake[0].x < 0 || Snake[0].x >= H  
167  || Snake[0].y < 0 || Snake[0].y >= L)  
168      over = 1;  
169 }  
170 void Check_Head(int x, int y)  //检查蛇头移动后的位置情况  
171 {  
172     
173  if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')  //为空  
174   GameMap[ Snake[0].x ][ Snake[0].y ] = '@';  
175  else 
176   if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*')  //为食物  
177   {  
178    GameMap[ Snake[0].x ][ Snake[0].y ] = '@';    
179    Snake[sum].x = x;   //新增加的蛇身为蛇头后面的那个  
180       Snake[sum].y = y;  
181       Snake[sum].now = Snake[0].now;  
182          GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';   
183    sum++;  
184    Create_Food();  //食物吃完了马上再产生一个食物  
185   }  
186   else 
187    over = 1;  
188 }
View Code