1 // 2 //main.c 3 //snake 4 // 5 //Created by Yubei Xiao on 12-12-16 6 //Copyright (c) 2015年 Sun Yat-sen University.All rights reserved. 7 // 8 9 #include<stdio.h> 10 #include<stdlib.h> 11 #include<time.h> 12 13 #define SNAKE_MAX_LENGTH 20 14 #define SNAKE_HEAD ‘H‘ 15 #define SNAKE_BODY ‘X‘ 16 #define BLANK_CELL ‘ ‘ 17 #define WALL_CELL ‘*‘ 18 19 //snake stepping: dy = -1(up),1(down); dx = -1(left),1(right),0(no move) 20 void snakeMove(int, int); 21 //put a food randomized on a blank cell 22 void put_money(void); 23 //our cells of the grid 24 void output(void); 25 //outs when gameover 26 void gameover(void); 27 //蛇是否碰到墙或者自身 28 int pd(); 29 30 char map[12][13] =//这里稍作了修改,因为12*12的字符矩阵每一行还要有‘\0‘必须要13长度才行 31 {"************", 32 "*XXXXH *", 33 "* *", 34 "* *", 35 "* *", 36 "* *", 37 "* *", 38 "* *", 39 "* *", 40 "* *", 41 "* *", 42 "************"}; 43 44 // define vars for snake, notice name of vars in C 45 int snakeY[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};//蛇身和蛇头的坐标 46 int snakeX[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};//这里稍作了修改,因为原本的X和Y反了 47 int snakeLength = 5; 48 49 int main() { 50 while (pd()){//WHILE not 游戏结束 DO 51 output();//输出字符矩阵 52 char ch; 53 scanf("%c", &ch);// ch=等待输入 54 char t = getchar();//将输入的回车符清掉 55 if (t != ‘\n‘) { 56 printf("Please input the right angle!\n"); 57 while (t != ‘\n‘) { 58 t = getchar(); 59 } 60 continue; 61 }//因为游戏中可能玩家输入错误,如:AA,避免这种错误的出现导致程序混乱 62 switch (ch) {// CASE ch DO 63 case ‘A‘:// ‘A’:左前进一步,break 64 snakeMove(0, -1); 65 break; 66 case ‘D‘ :// ‘D’:右前进一步,break 67 snakeMove(0, 1); 68 break; 69 case ‘W‘:// ‘W’:上前进一步,break 70 snakeMove(-1, 0); 71 break; 72 case ‘S‘:// ‘S’:下前进一步,break 73 snakeMove(1, 0); 74 break; 75 default:// END CASE 76 printf("Please input the right angle!\n");//避免玩家输入错误,如:X 77 } 78 }//END WHILE 79 gameover();//输出 Game Over!!! 80 } 81 82 int pd() {//whether snake head on wall & body 83 int i; 84 if (snakeX[snakeLength - 1] > 0 && snakeX[snakeLength - 1] < 11 85 && snakeY[snakeLength - 1] > 0 && snakeY[snakeLength - 1] < 11) { 86 for (i = 0; i < snakeLength - 1; i++) { 87 if ((snakeX[snakeLength - 1] == snakeX[i]) && (snakeY[snakeLength - 1] == snakeY[i])) { 88 return 0;//snake head on body 89 } 90 } 91 return 1;//snake head on blank 92 } else return 0;//snake head on wall 93 } 94 void snakeMove(int i, int j) { 95 int dx = i, dy = j, k; 96 map[snakeX[0]][snakeY[0]] = BLANK_CELL;//蛇前进了 97 for (k = 0; k <= snakeLength - 2; k++) { 98 snakeX[k] = snakeX[k + 1]; 99 snakeY[k] = snakeY[k + 1]; 100 map[snakeX[k]][snakeY[k]] = SNAKE_BODY; 101 }//蛇前进的坐标变化 102 snakeX[snakeLength - 1] += dx; 103 snakeY[snakeLength - 1] += dy;//蛇头的坐标变化 104 map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD; 105 } 106 void output(void) {//输出矩阵 107 int i, j; 108 for (i = 0; i <= 11; i++) { 109 for (j = 0; j <= 11; j++) { 110 printf("%c", map[i][j]); 111 } 112 printf("\n"); 113 } 114 } 115 void gameover(void) {//游戏输了的结束语 S 116 printf("Game Over!!!\n"); 117 }
贪吃蛇task1 readme txt
实验环境:Dev C++
程序运行方式:
在游戏最开始会输出初始矩阵
①通过WASD键盘键操控贪吃蛇进行上左下右移动;
②每一次输入W/A/S/D后需要回车,确保输入完毕;
③速度太快输入错误不要紧,例如输入了“AA”,程序不会进行错误执行,会给你温馨的报错提示
“Please input the right angle!”同时再回输出原先(输入错误之前的即没有改变)的矩阵,方便进行下一步行走;
④同时输入成其他字符不要紧,同样也会报错;
⑤输入之后,程序会判断输入字符从而进行坐标变化以及map矩阵变化,之后输出矩阵,等待你输入下一个方向;
⑥如果你的操作使得蛇撞墙或者撞到了自己,那么系统会提示GAME OVER同时游戏结束。
将原先的程序头(pdf上面的)修改了的部分:
①map二位数组的第二个维度开小了,因为还会有‘\0‘的存在,所以应该是13;
②snakeX和snakeY数组反了,已经改正。
1 // 2 //main.c 3 //snake 4 // 5 //Created by Yubei Xiao on 12-12-16 6 //Copyright (c) 2015年 Sun Yat-sen University.All rights reserved. 7 // 8 9 #include<stdio.h> 10 #include<stdlib.h> 11 #include<time.h> 12 13 #define SNAKE_MAX_LENGTH 150//稍微了修改,因为这个长度要加到100才能够让蛇可以不断的吃食物长长,直到占满为止 14 #define SNAKE_HEAD ‘H‘ 15 #define SNAKE_BODY ‘X‘ 16 #define BLANK_CELL ‘ ‘ 17 #define WALL_CELL ‘*‘ 18 19 //snake stepping: dy = -1(up),1(down); dx = -1(left),1(right),0(no move) 20 void snakeMove(int, int); 21 //put a food randomized on a blank cell 22 void put_money(void); 23 //our cells of the grid 24 void output(void); 25 //outs when gameover 26 void gameover(void); 27 //蛇是否碰到墙或者自身 28 int pd(); 29 //eat the food 30 void eat_money(int i, int j); 31 //are player win 32 int Are_you_win(void); 33 34 char map[12][13] =//这里稍作了修改,因为12*12的字符矩阵每一行还要有‘\0‘必须要13长度才行 35 {"************", 36 "*XXXXH *", 37 "* *", 38 "* *", 39 "* *", 40 "* *", 41 "* *", 42 "* *", 43 "* *", 44 "* *", 45 "* *", 46 "************"}; 47 48 // define vars for snake, notice name of vars in C 49 int snakeY[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};//蛇身和蛇头的坐标 50 int snakeX[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};//这里稍作了修改,因为原本的X和Y反了 51 int snakeLength = 5; 52 53 int main() { 54 output();//输出初始字符矩阵 55 int counter = 0; 56 while (pd()){//WHILE not 游戏结束 DO 57 counter++;//计数器,使得放食物不要太频繁,运行5次放一次食物 58 if ((counter % 5) == 1) put_money();//放置食物 59 system("cls");//每一次清屏只剩下当前局面的矩阵 60 output();//输出字符矩阵 61 if (Are_you_win()) return 0;//如果赢了则退出 62 char ch; 63 scanf("%c", &ch);// ch=等待输入 64 char t = getchar();//将输入的回车符清掉 65 if (t != ‘\n‘) { 66 printf("Please input the right angle!\n"); 67 while (t != ‘\n‘) { 68 t = getchar(); 69 } 70 continue; 71 }//因为游戏中可能玩家输入错误,如:AA,避免这种错误的出现导致程序混乱 72 switch (ch) {// CASE ch DO 73 case ‘A‘:// ‘A’:左前进一步,break 74 snakeMove(0, -1); 75 break; 76 case ‘D‘ :// ‘D’:右前进一步,break 77 snakeMove(0, 1); 78 break; 79 case ‘W‘:// ‘W’:上前进一步,break 80 snakeMove(-1, 0); 81 break; 82 case ‘S‘:// ‘S’:下前进一步,break 83 snakeMove(1, 0); 84 break; 85 default:// END CASE 86 printf("Please input the right angle!\n");//避免玩家输入错误,如:X 87 } 88 }//END WHILE 89 gameover();//输出 Game Over!!! 90 } 91 92 int Are_you_win(void) {//判断玩家是否赢 93 int i, j; 94 for (i = 1; i <= 10; i++) { 95 for (j = 1; j <= 10; j++) { 96 if (map[i][j] != ‘X‘||map[i][j] != ‘H‘) { 97 return 0;//如果玩家有一个格子未占满则没有赢 98 } 99 } 100 } 101 printf("You are winner!!!");//如果玩家的贪吃蛇将所有的格子均占满则赢 102 return 1; 103 } 104 void put_money(void) { 105 srand((unsigned)time(NULL));//随机函数的种子 106 int i = 0; 107 int j = 0; 108 int tot = 0;//用来计数,因为如果格子满了,那么就没有格子可以放食物了,那么下面循环会陷入死循环,避免这种情况发生 109 while (map[i][j] != ‘ ‘&&tot <= 100) {//随机生成食物的坐标 110 i = rand()%11 + 1; 111 j = rand()%11 + 1; 112 tot++; 113 } 114 if (map[i][j] == ‘ ‘) map[i][j] = ‘$‘;//用‘$‘来表示食物 115 } 116 int pd() {//whether snake head on wall & body 117 int i; 118 if (snakeX[snakeLength - 1] > 0 && snakeX[snakeLength - 1] < 11 119 && snakeY[snakeLength - 1] > 0 && snakeY[snakeLength - 1] < 11) { 120 for (i = 0; i < snakeLength - 1; i++) { 121 if ((snakeX[snakeLength - 1] == snakeX[i]) && (snakeY[snakeLength - 1] == snakeY[i])) { 122 return 0;//snake head on body 123 } 124 } 125 return 1;//snake head on blank 126 } else return 0;//snake head on wall 127 } 128 void eat_money(int i, int j) {//蛇吃食物模块 129 int dx = i, dy = j, k; 130 map[snakeX[0]][snakeY[0]] = SNAKE_BODY;//蛇的最后一个坐标还是不变因为长长了 131 snakeLength++;//长度加一 132 map[snakeX[snakeLength - 2]][snakeY[snakeLength - 2]] = SNAKE_BODY;//原本是头的现在变成了身体 133 snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx; 134 snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;//计算头坐标 135 map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;//头坐标的map置为头 136 } 137 void snakeMove(int i, int j) { 138 if (map[snakeX[snakeLength - 1] + i][snakeY[snakeLength - 1] + j] == ‘$‘) {//碰到了食物 139 eat_money(i, j); 140 return; 141 } 142 int dx = i, dy = j, k; 143 map[snakeX[0]][snakeY[0]] = BLANK_CELL;//蛇前进了 144 for (k = 0; k <= snakeLength - 2; k++) { 145 snakeX[k] = snakeX[k + 1]; 146 snakeY[k] = snakeY[k + 1]; 147 map[snakeX[k]][snakeY[k]] = SNAKE_BODY; 148 }//蛇前进的坐标变化 149 snakeX[snakeLength - 1] += dx; 150 snakeY[snakeLength - 1] += dy;//蛇头的坐标变化 151 map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD; 152 } 153 void output(void) {//输出矩阵 154 int i, j; 155 for (i = 0; i <= 11; i++) { 156 for (j = 0; j <= 11; j++) { 157 printf("%c", map[i][j]); 158 } 159 printf("\n"); 160 } 161 } 162 void gameover(void) {//游戏输了的结束语 163 printf("Game Over!!!\n"); 164 }
贪吃蛇task2 readme txt
实验环境:Dev C++
程序运行方式:
(由于屏幕会出现很多幕矩阵,所以我使用了system("cls")进行每一次输出矩阵之前清一次屏,方便查看,
这个可以不要)
在游戏最开始会输出初始矩阵
①通过WASD键盘键操控贪吃蛇进行上左下右移动;
②每一次输入W/A/S/D后需要回车,确保输入完毕;
③速度太快输入错误不要紧,例如输入了“AA”,程序不会进行错误执行,会给你温馨的报错提示
“Please input the right angle!”同时再回输出原先(输入错误之前的即没有改变)的矩阵,方便进行下一步行走;
④同时输入成其他字符不要紧,同样也会报错;
⑤输入之后,程序会判断输入字符从而进行坐标变化以及map矩阵变化,之后输出矩阵,等待你输入下一个方向;
⑥如果你的操作使得蛇撞墙或者撞到了自己,那么系统会提示GAME OVER同时游戏结束。
⑦加入了随机生成食物,第一次会出现一次食物,然后每隔5次操作出现一次,避免出现频率国语频繁;
⑧每当吃到食物蛇会长长一截,从尾巴后面;
⑨只要当玩家将所有的矩阵格占满才能够赢(很难赢~)赢了程序会输出“You are winner!!!”
将原先的程序头(pdf上面的)修改了的部分:
①map二位数组的第二个维度开小了,因为还会有‘\0‘的存在,所以应该是13;
②snakeX和snakeY数组反了,已经改正。
③因为蛇可以吃食物,最大长度增加到100,所以发现在开始的
#define SNAKE_MAX_LENGTH 150//稍微了修改,因为这个长度要加到100才能够让蛇可以不断的吃食物长长,直到占满为止
版权声明:欢迎转载本人博客的内容,只需注明作者和主博客文章地址的链接,另有约定者除外。
//
//
//Created by Yubei Xiao on 12-12-16
//Copyright (c) 2015年 Sun Yat-sen University.All rights reserved.
//