您的位置:首页 > 其它

贪吃蛇

2015-12-26 15:49 120 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define SNAKE_HEAD 'H'                        //对所用到的字符的标识
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

int snake_X[100] = {5, 4, 3, 2, 1};            //表示蛇的坐标
int snake_Y[100] = {1, 1, 1, 1, 1};
int food_X, food_Y;                            //食物的坐标
int length = 5;                                //蛇身长度

char maze[12][12] = {                        //定义字符矩阵,初始状态
"***********",
"*XXXXH    *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"***********",
};

void output(void) {                            //输出字符矩阵
for (int i = 0; i <= 11; i++) {
for (int j = 0; j <= 11; j++) {
printf("%c", maze[i][j]);
}
printf("\n");
}
}

void Food_() {                                //随机产生食物
srand((unsigned)(time(NULL)));
do {
food_X = rand() % 9;
food_Y = rand() % 9;
} while (maze[food_Y][food_X] != ' ');
maze[food_Y][food_X] = '$';
}

void snake_Move() {                            //蛇移动的实现
maze[snake_Y[length - 1]][snake_X[length - 1]] = ' ';
for (int i = length - 1; i > 0; i--) {
snake_X[i] = snake_X[i - 1];
snake_Y[i] = snake_Y[i - 1];
maze[snake_Y[i]][snake_X[i]] = 'X';
}
}

int Gameover(void) {                        //作为游戏结束的判断
if (snake_X[0] == 10 || snake_Y[0] == 10 || snake_X[0] == 0 || snake_Y[0] == 0) {
return 0;
}
for (int j = 1; j < length; j++) {
if (snake_X[0] == snake_X[j] && snake_Y[0] == snake_Y[j]) {
return 0;
}
}
return 1;
}

int main() {
char shuru;
int judge;
Food_();
output();
while(1) {
scanf(" %c", &shuru);    //用户输入方向键
snake_Move();
if (shuru == 'a') {        //按键‘a ’表示向左走一步
snake_X[0] -= 1;
maze[snake_Y[0]][snake_X[0]] = 'H';
}
if (shuru == 'd') {        //按键‘d ’表示向右走一步
snake_X[0] += 1;
maze[snake_Y[0]][snake_X[0]] = 'H';
}
if (shuru == 'w' ){        //按键‘w ’表示向上走一步
snake_Y[0] -= 1;
maze[snake_Y[0]][snake_X[0]] = 'H';
}
if (shuru == 's') {        //按键‘a ’表示向下走一步
snake_Y[0] += 1;
maze[snake_Y[0]][snake_X[0]] = 'H';
}
if (snake_X[0] == food_X && snake_Y[0] == food_Y) {    //实现吃完一个食物后蛇长一截
Food_();
length++;
snake_X[length - 1] = snake_X[length - 2];
snake_Y[length - 1] = snake_Y[length - 2];
maze[snake_Y[length - 1]][snake_X[length - 1]] = 'X';
}
judge = Gameover();
if (judge == 0){
printf("Game over!\n");            //游戏结束的实现
return 0;
} else {
system("cls");        //清屏
output();
}
}
return 0;
system("pause");
}


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

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

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

②输出矩阵直接用for

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

:#include <stdlib.h>
#include <stdio.h>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#define MAX 10

int main( void)
{
int number[MAX] = {0};
int i;
srand((unsigned) time(NULL)); /*播种子*/
for(i = 0; i < MAX; i++)
{
number[i] = rand() % 100; /*产生100以内的随机整数*/
printf("%d ", number[i]);
}
printf("\n");
return 0;
}


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

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

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

scanf(“%c”, &shuru);

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

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

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

#include <stdio.h>
#include <stdlib.h> //其必须包含头文件 #include <stdlib.h>
int main()
{
int i;
for(i =0;i<5;i++)
printf("%d******************\n",i);
getchar();
system("cls");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: