ziqiuqiandao

项目名称:贪吃蛇

文件:main.c

实现平台和语言:VC++6.0和C语言

说明:简单的字符小游戏,是学习c语言初期为了好玩写的,可以给初学C者参考。

  1 #include <stdio.h>
  2 #include <windows.h>
  3 #include <conio.h>
  4 #include <dos.h>
  5 
  6 #define S_FRIST_X 20
  7 #define S_FRIST_Y 10
  8 
  9 #define UP 11
 10 #define DOWN 12
 11 #define LEFT 13
 12 #define RIGHT 14
 13 
 14 #define START 22
 15 #define OVER 33
 16 
 17 //封装vc++6.0中光标移动函数
 18 int mygotoxy(int x, int y)
 19 {
 20     COORD coord = {x, y};
 21     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 22     
 23     return 0;
 24 }
 25 
 26 //打印蛇的身体
 27 int s_print(int s_arr[][2], int s_len)
 28 {
 29     int i = 0;
 30     for (i = 0; i < s_len; i++)
 31     {
 32         mygotoxy(s_arr[i][0], s_arr[i][1]);
 33         printf("*");
 34     }
 35 }
 36 
 37 //清空蛇的身体
 38 int s_print_clean(int s_arr[][2], int s_len)
 39 {
 40     int i = 0;
 41     for (i = 0; i < s_len; i++)
 42     {
 43         mygotoxy(s_arr[i][0], s_arr[i][1]);
 44         printf(" ");
 45     }
 46 }
 47 
 48 //打印食物
 49 int t_print(int x, int y)
 50 {
 51     mygotoxy(x, y);
 52     printf("*");
 53 }
 54 
 55 //清空食物
 56 int t_print_clean(int x, int y)
 57 {
 58     mygotoxy(x, y);
 59     printf(" ");
 60 }
 61 
 62 int main (void)
 63 {
 64     int i = 0;
 65     char key = 0;
 66     int speed = 0;
 67     int s_len = 0;
 68     int s_direction = 0;
 69 
 70     int t_x = 0;
 71     int t_y = 0;
 72     int t_rand = 0;
 73     int score = 0;
 74     int levels = 0;
 75 
 76     int game = OVER;
 77 
 78     int s_arr[100][2] = {{0, 0}};
 79 
 80     //打印游戏界面为宽度1-59,高度1-22
 81     for (i = 1; i <= 60; i += 2)
 82     {
 83         mygotoxy(i, 0);
 84         printf("-");
 85     }
 86     for (i = 1; i <= 60; i += 2)
 87     {
 88         mygotoxy(i, 23);
 89         printf("-");
 90     }
 91     for (i = 1; i <= 22; i++)
 92     {
 93         mygotoxy(0, i);
 94         printf("|");
 95     }
 96     for (i = 1; i <= 22; i++)
 97     {
 98         mygotoxy(60, i);
 99         printf("|");
100     }
101 
102     //打印欢迎信息
103     mygotoxy(63, 2);
104     printf("欢迎来到贪吃蛇。");
105     mygotoxy(66, 4);
106     printf("w键为上");
107     mygotoxy(66, 5);
108     printf("s键为下");
109     mygotoxy(66, 6);
110     printf("a键为左");
111     mygotoxy(66, 7);
112     printf("d键为右");
113     mygotoxy(63, 20);
114     printf("按回车开始游戏。");
115 
116     while (1)
117     {
118 _start:
119         //判定关卡
120         if(20 == score && 1 == levels)
121         {
122             mygotoxy(30, 12);
123             printf("下一关");
124             Sleep(1000);
125             mygotoxy(30, 12);
126             printf("      ");
127             speed = 250;
128             levels = 2;
129         }
130         else if(30 == score && 2 == levels)
131         {            
132             mygotoxy(30, 12);
133             printf("下一关");
134             Sleep(1000);
135             mygotoxy(30, 12);
136             printf("      ");
137             speed = 125;
138             levels = 3;
139         }
140         else if(40 == score && 3 == levels)
141         {
142             mygotoxy(30, 12);
143             printf("下一关");
144             Sleep(1000);
145             mygotoxy(30, 12);
146             printf("      ");
147             speed = 60;
148             levels = 4;
149         }
150         else if(50 == score && 4 == levels)
151         {
152             mygotoxy(30, 12);
153             printf("下一关");
154             Sleep(1000);
155             mygotoxy(30, 12);
156             printf("      ");
157             speed = 30;
158             levels = 5;
159         }
160 
161         if(OVER == game)
162         {    
163             //打印游戏信息
164             mygotoxy(68, 21);
165             printf("结束");
166 
167             //输入回车开始游戏
168             while(1)
169             {
170                 key = _getch();
171                 fflush(stdin);
172 
173                 if(13 == key)
174                 {
175                     key = 0;
176                     break;
177                 }
178             }
179 
180             //初始化移动速度和蛇的长度
181             speed = 500;
182             s_len = 3;
183 
184             //初始化关卡
185             levels = 1;
186 
187             //初始化食物坐标
188             if((t_rand = rand() % 60) != 0)
189             {
190                 t_x = t_rand;
191             }
192             
193             if((t_rand = rand() % 23) != 0)
194             {
195                 t_y = t_rand;
196             }
197             
198             //初始化蛇的身体
199             for (i = 0; i < s_len; i++)
200             {
201                 s_arr[i][0] = 20 + i;
202                 s_arr[i][1] = 10;
203             }
204 
205             //初始化方向
206             s_direction = RIGHT;
207             
208             game = START;
209 
210             //打印游戏信息
211             mygotoxy(68, 21);
212             printf("进行");
213         }
214 
215         //刷新得分
216         mygotoxy(66, 13);
217         printf("得分: %d分", score);
218 
219         //刷新关卡
220         mygotoxy(65, 11);
221         printf("关卡: 第%d关", levels);
222 
223         //判断方向
224         switch (s_direction)
225         {
226         case UP:
227         {
228             //判断是否到上边界面
229             if(0 == s_arr[s_len - 1][1] - 1)
230             {
231                 game = OVER;
232                 score = 0;
233                 mygotoxy(30, 12);
234                 printf("Game Over!");
235                 Sleep(1000);
236                 mygotoxy(30, 12);
237                 printf("          ");
238                 continue;
239             }
240 
241             //判断是否要撞上自己的身体
242             for (i = 0; i < s_len; i++)
243             {
244                 if(s_arr[i][0] == s_arr[s_len - 1][0] && s_arr[i][1] == s_arr[s_len - 1][1] - 1)
245                 {
246                     game = OVER;
247                     score = 0;
248                     mygotoxy(30, 12);
249                     printf("Game Over!");
250                     Sleep(1000);
251                     mygotoxy(30, 12);
252                     printf("          ");
253                     goto _start;
254                 }
255             }
256 
257             //判断是否吃到食物
258             if (t_x == s_arr[s_len - 1][0] && t_y == s_arr[s_len - 1][1] - 1)
259             {
260                 s_len++;
261                 s_arr[s_len - 1][0] = t_x;
262                 s_arr[s_len - 1][1] = t_y;
263 
264                 //分数加十分
265                 score += 10;
266                 
267                 //刷新食物坐标
268                 if((t_rand = rand() % 60) != 0)
269                 {
270                     t_x = t_rand;
271                 }
272                 if((t_rand = rand() % 23) != 0)
273                 {
274                     t_y = t_rand;
275                 }
276                 break;
277             }
278             else
279             {
280                 //坐标上移
281                 for (i = 0; i < s_len; i++)
282                 {
283                     if(s_len - 1 == i)
284                     {
285                         s_arr[i][1]--;                    
286                     }
287                     else
288                     {
289                         s_arr[i][0] = s_arr[i + 1][0];
290                         s_arr[i][1] = s_arr[i + 1][1];
291                     }
292                 }
293                 break;
294             }
295         }
296         case DOWN:
297         {
298             //判断是否到下边界面
299             if(23 == s_arr[s_len - 1][1] + 1)
300             {
301                 game = OVER;
302                 score = 0;
303                 mygotoxy(30, 12);
304                 printf("Game Over!");
305                 Sleep(1000);
306                 mygotoxy(30, 12);
307                 printf("          ");
308                 continue;
309             }
310 
311             //判断是否要撞上自己的身体
312             for (i = 0; i < s_len; i++)
313             {
314                 if(s_arr[i][0] == s_arr[s_len - 1][0] && s_arr[i][1] == s_arr[s_len - 1][1] + 1)
315                 {
316                     game = OVER;
317                     score = 0;
318                     mygotoxy(30, 12);
319                     printf("Game Over!");
320                     Sleep(1000);
321                     mygotoxy(30, 12);
322                     printf("          ");
323                     goto _start;
324                 }
325             }
326 
327             //判断是否吃到食物
328             if (t_x == s_arr[s_len - 1][0] && t_y == s_arr[s_len - 1][1] + 1)
329             {
330                 s_len++;
331                 s_arr[s_len - 1][0] = t_x;
332                 s_arr[s_len - 1][1] = t_y;    
333                             
334                 //分数加十分
335                 score += 10;
336                 
337                 //刷新食物坐标
338                 if((t_rand = rand() % 60) != 0)
339                 {
340                     t_x = t_rand;
341                 }
342                 if((t_rand = rand() % 23) != 0)
343                 {
344                     t_y = t_rand;
345                 }
346                 break;
347             }
348             else
349             {
350                 //坐标下移
351                 for (i = 0; i < s_len; i++)
352                 {
353                     if(s_len - 1 == i)
354                     {
355                         s_arr[i][1]++;                    
356                     }
357                     else
358                     {
359                         s_arr[i][0] = s_arr[i + 1][0];
360                         s_arr[i][1] = s_arr[i + 1][1];
361                     }
362                 }
363                 break;
364             }
365         }
366         case LEFT:
367         {
368             //判断是否到左边界面
369             if(0 == s_arr[s_len - 1][0] - 1)
370             {
371                 game = OVER;
372                 score = 0;
373                 mygotoxy(30, 12);
374                 printf("Game Over!");
375                 Sleep(1000);
376                 mygotoxy(30, 12);
377                 printf("          ");
378                 continue;
379             }
380 
381             //判断是否要撞上自己的身体
382             for (i = 0; i < s_len; i++)
383             {
384                 if(s_arr[i][0] == s_arr[s_len - 1][0] - 1 && s_arr[i][1] == s_arr[s_len - 1][1])
385                 {
386                     game = OVER;
387                     score = 0;
388                     mygotoxy(30, 12);
389                     printf("Game Over!");
390                     Sleep(1000);
391                     mygotoxy(30, 12);
392                     printf("          ");
393                     goto _start;
394                 }
395             }
396 
397             //判断是否吃到食物
398             if (t_x == s_arr[s_len - 1][0] - 1 && t_y == s_arr[s_len - 1][1])
399             {
400                 s_len++;
401                 s_arr[s_len - 1][0] = t_x;
402                 s_arr[s_len - 1][1] = t_y;
403                 
404                 //分数加十分
405                 score += 10;
406                 
407                 //刷新食物坐标
408                 if((t_rand = rand() % 60) != 0)
409                 {
410                     t_x = t_rand;
411                 }
412                 if((t_rand = rand() % 23) != 0)
413                 {
414                     t_y = t_rand;
415                 }
416                 break;
417             }
418             else
419             {
420                 //坐标左移
421                 for (i = 0; i < s_len; i++)
422                 {
423                     if(s_len - 1 == i)
424                     {
425                         s_arr[i][0]--;                    
426                     }
427                     else
428                     {
429                         s_arr[i][0] = s_arr[i + 1][0];
430                         s_arr[i][1] = s_arr[i + 1][1];
431                     }
432                 }
433                 break;
434             }
435         }
436         case RIGHT:
437         {
438             //判断是否到左边界面
439             if(60 == s_arr[s_len - 1][0] + 1)
440             {
441                 game = OVER;
442                 score = 0;
443                 mygotoxy(30, 12);
444                 printf("Game Over!");
445                 Sleep(1000);
446                 mygotoxy(30, 12);
447                 printf("          ");
448                 continue;
449             }
450 
451             //判断是否要撞上自己的身体
452             for (i = 0; i < s_len; i++)
453             {
454                 if(s_arr[i][0] == s_arr[s_len - 1][0] + 1 && s_arr[i][1] == s_arr[s_len - 1][1])
455                 {
456                     game = OVER;
457                     score = 0;
458                     mygotoxy(30, 12);
459                     printf("Game Over!");
460                     Sleep(1000);
461                     mygotoxy(30, 12);
462                     printf("          ");
463                     goto _start;
464                 }
465             }
466 
467             //判断是否吃到食物
468             if (t_x == s_arr[s_len - 1][0] + 1 && t_y == s_arr[s_len - 1][1])
469             {
470                 s_len++;
471                 s_arr[s_len - 1][0] = t_x;
472                 s_arr[s_len - 1][1] = t_y;    
473 
474                 //分数加十分
475                 score += 10;
476                 
477                 //刷新食物坐标
478                 if((t_rand = rand() % 60) != 0)
479                 {
480                     t_x = t_rand;
481                 }
482                 if((t_rand = rand() % 23) != 0)
483                 {
484                     t_y = t_rand;
485                 }
486                 break;
487             }
488             else
489             {
490                 //坐标右移
491                 for (i = 0; i < s_len; i++)
492                 {
493                     if(s_len - 1 == i)
494                     {
495                         s_arr[i][0]++;                    
496                     }
497                     else
498                     {
499                         s_arr[i][0] = s_arr[i + 1][0];
500                         s_arr[i][1] = s_arr[i + 1][1];
501                     }
502                 }
503                 break;
504             }
505         }
506         }
507 
508         //打印蛇的身体
509         s_print(s_arr, s_len);
510 
511         //打印食物
512         t_print(t_x, t_y);
513 
514         while (kbhit())
515         {
516             //输入一个字符
517             key = _getch();
518             fflush(stdin);
519 
520             //按键输入
521             switch (key)
522             {
523             case \'w\':
524                 if(DOWN == s_direction)
525                     break;
526                 else
527                 {
528                     s_direction = UP;
529                     break;
530                 }
531             case \'s\':
532                 if(UP == s_direction)
533                     break;
534                 else
535                 {
536                     s_direction = DOWN;
537                     break;
538                 }
539             case \'a\':
540                 if(RIGHT == s_direction)
541                     break;
542                 else
543                 {
544                     s_direction = LEFT;
545                     break;
546                 }
547             case \'d\':
548                 if(LEFT == s_direction)
549                     break;
550                 else
551                 {
552                     s_direction = RIGHT;
553                     break;
554                 }
555             }
556         }
557         
558         //延时函数
559         Sleep(speed);
560 
561         //清空蛇的身体
562         s_print_clean(s_arr, s_len);
563 
564         //清空食物
565         t_print_clean(t_x, t_y);
566     }
567 
568     return 0;
569 }

分类:

技术点:

相关文章: