一个简单的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 }