贪吃蛇1.0&&贪吃蛇2.0

  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.
//

posted @ 2015-12-24 21:31  小预备  阅读(294)  评论(0编辑  收藏  举报