站内搜索

C语言 小游戏之贪吃蛇

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