贪吃蛇

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<time.h>
  5 
  6 #define SNAKE_HEAD 'H'                        //对所用到的字符的标识 
  7 #define SNAKE_BODY 'X'
  8 #define BLANK_CELL ' '
  9 #define SNAKE_FOOD '$'
 10 #define WALL_CELL '*'
 11 
 12 int snake_X[100] = {5, 4, 3, 2, 1};            //表示蛇的坐标 
 13 int snake_Y[100] = {1, 1, 1, 1, 1};
 14 int food_X, food_Y;                            //食物的坐标 
 15 int length = 5;                                //蛇身长度 
 16 
 17 char maze[12][12] = {                        //定义字符矩阵,初始状态 
 18     "***********",
 19     "*XXXXH    *",
 20     "*         *",
 21     "*         *",
 22     "*         *",
 23     "*         *",
 24     "*         *",
 25     "*         *",
 26     "*         *",
 27     "*         *",
 28     "***********",
 29 };
 30 
 31 
 32 void output(void) {                            //输出字符矩阵 
 33     for (int i = 0; i <= 11; i++) {
 34         for (int j = 0; j <= 11; j++) {
 35             printf("%c", maze[i][j]);
 36         }
 37         printf("\n");
 38     }
 39 }
 40 
 41 void Food_() {                                //随机产生食物 
 42     srand((unsigned)(time(NULL)));
 43     do {
 44         food_X = rand() % 9;
 45         food_Y = rand() % 9;
 46     } while (maze[food_Y][food_X] != ' ');
 47     maze[food_Y][food_X] = '$';
 48 }
 49 
 50 
 51 void snake_Move() {                            //蛇移动的实现 
 52     maze[snake_Y[length - 1]][snake_X[length - 1]] = ' ';
 53     for (int i = length - 1; i > 0; i--) {
 54         snake_X[i] = snake_X[i - 1];
 55         snake_Y[i] = snake_Y[i - 1];
 56         maze[snake_Y[i]][snake_X[i]] = 'X';
 57     }
 58 }
 59 
 60 
 61 int Gameover(void) {                        //作为游戏结束的判断 
 62     if (snake_X[0] == 10 || snake_Y[0] == 10 || snake_X[0] == 0 || snake_Y[0] == 0) {
 63         return 0;
 64     }
 65     for (int j = 1; j < length; j++) {
 66         if (snake_X[0] == snake_X[j] && snake_Y[0] == snake_Y[j]) {
 67             return 0;
 68         }
 69     }
 70     return 1;
 71 }
 72 
 73 
 74 int main() {
 75     char shuru;
 76     int judge;
 77     Food_();
 78     output();
 79     while(1) {
 80         scanf(" %c", &shuru);    //用户输入方向键 
 81         snake_Move();
 82         if (shuru == 'a') {        //按键‘a ’表示向左走一步 
 83             snake_X[0] -= 1;
 84             maze[snake_Y[0]][snake_X[0]] = 'H';
 85         }
 86         if (shuru == 'd') {        //按键‘d ’表示向右走一步 
 87             snake_X[0] += 1;
 88             maze[snake_Y[0]][snake_X[0]] = 'H';
 89         }
 90         if (shuru == 'w' ){        //按键‘w ’表示向上走一步 
 91             snake_Y[0] -= 1;
 92             maze[snake_Y[0]][snake_X[0]] = 'H';
 93         }
 94         if (shuru == 's') {        //按键‘a ’表示向下走一步 
 95             snake_Y[0] += 1;
 96             maze[snake_Y[0]][snake_X[0]] = 'H';
 97         }
 98         if (snake_X[0] == food_X && snake_Y[0] == food_Y) {    //实现吃完一个食物后蛇长一截 
 99             Food_();                                    
100             length++;
101             snake_X[length - 1] = snake_X[length - 2];
102             snake_Y[length - 1] = snake_Y[length - 2];
103             maze[snake_Y[length - 1]][snake_X[length - 1]] = 'X';
104         }
105         judge = Gameover();
106         if (judge == 0){
107             printf("Game over!\n");            //游戏结束的实现 
108             return 0;
109         } else {
110             system("cls");        //清屏 
111             output();
112         }
113     }
114     return 0;
115     system("pause");
116 }

这道题我是看着那个博客打的,用数组实现不难理解,体会到原来可以用数组这么玩,hhhhh

由这个还是可以学到很多东西

①字符矩阵的实现char,原来还可以这样弄,要是我可能会傻傻的用for,注意“”和,的使用

②输出矩阵直接用for

③产生食物用了随机数:srand初始化随机种子,rand产生随机数,eg:

 1 :#include <stdlib.h>
 2 #include <stdio.h>
 3 #include <time.h> /*用到了time函数,所以要有这个头文件*/
 4 #define MAX 10
 5 
 6 int main( void)
 7 {
 8  int number[MAX] = {0};
 9  int i;
10  srand((unsigned) time(NULL)); /*播种子*/
11  for(i = 0; i < MAX; i++)
12  {
13  number[i] = rand() % 100; /*产生100以内的随机整数*/
14  printf("%d ", number[i]);
15  }
16  printf("\n");
17  return 0;
18 } 

④游戏结束那里,我一直纠结要是return0后又会return1怎么破,结果发现return0后就返回了,不会再执行后面的了

⑤scanf那里我一开始是这样的:

getch();  //用来吸收那个回车

scanf(“%c”, &shuru);

但是TA说不可使用 getch(), kbhit()之类 windows 扩展包(你可以简单地理解为不准使用getch() kbhit()以及禁止#include <windows.h>,#include <conio.h>,#include <dos.h>),然后又纠结了半天,然后发现他的是如上实现的,%c前加个空格,记住这样可以吸收回车键

⑥后面的走步处理,看了之后理解一下还是可以理解的

⑦清屏处理,其作用是清楚屏幕先前的显示内容

 1 #include <stdio.h> 
 2 #include <stdlib.h> //其必须包含头文件 #include <stdlib.h> 
 3 int main() 
 4 { 
 5 int i; 
 6 for(i =0;i<5;i++) 
 7 printf("%d******************\n",i); 
 8 getchar(); 
 9 system("cls"); 
10 return 0; 
11 } 

 

posted on 2015-12-26 15:49  _阿赞  阅读(199)  评论(0编辑  收藏  举报