贪吃蛇
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 }