贪吃蛇游戏,现在还有很多BUG。等待大家挑错。。。。。
难度:
1最难,500最简单。。吃够20个食物就可以过关了 呵呵。。。无聊时候玩玩吧
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> const int maxn = 100; const int n = 20; struct node { int x, y; }; int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头. node food; node squence[maxn]; // 蛇的身子的坐标. int len; // 蛇的长度. bool eat; // 判断当前事物是否被吃了. bool gameover; // 游戏是否失败. int direction; // 判断当前蛇头是朝哪个方向. void Output(void); void Move(int direction); void Move_up(void); void Move_down(void); void Move_left(void); void Move_right(void); int main() { int i, j; double start; int gamespeed; // 游戏速度自己调整. int timeover; int game_times = 1; // 游戏的次数. char c = 'x'; printf("请输入游戏的级别(1到500,1最难,500最简单):\n"); scanf("%d", &gamespeed); gamespeed = gamespeed; // 对图的初始化. for (i = 0; i <= n + 1; i++) { for (j = 0; j <= n + 1; j++) { map[i][j] = 0; } } // 对蛇的初始化. for (i = 1; i <= n; i++) { squence[i].x = 0; squence[i].y = 0; } len = 1; // 蛇的长度为1. squence[len].x = 1; squence[len].y = 1; // 初始位置在点(1, 1). map[1][1] = 4; direction = 4; // 默认开始时蛇向右走. srand(time(0)); while (game_times <= 20) { eat = 0; // 食物还没被吃. while (true) { // 随机生出食物的坐标,注意不能与蛇身重合,否则就重新随机产生. food.x = rand() % 20 + 1; food.y = rand() % 20 + 1; if (map[food.x][food.y] == 0) { break; } } map[food.x][food.y] = 2; // 食物位置. system("cls"); Output(); // 以下这段半秒钟不按键还取原方向继续前行. while (!eat) { start = clock(); timeover=1; while(!kbhit()) { // 说明没有按键. if (clock() - start <= gamespeed) { // 如果时间超过游戏时间. timeover = 1; } else { timeover = 0; break; } } if (timeover) { // 说明有按键. // 按一次键,可以连取两个 c = getch(); c = getch(); // 以下几行告诉怎样判断用户按的哪个方向键 if(c==72) direction = 1; // printf("向上"); if(c==80) direction = 2; // printf("向下"); if(c==75) direction = 3; // printf("向左"); if(c==77) direction = 4; // printf("向右"); } Move(direction); system("cls"); if (gameover) { Output(); printf("Game Over!!!\n"); return 0; } Output(); } game_times++; // 又成功吃到一次食物. } printf("You win!!!\n"); return 0; } void Move(int direction) { switch (direction) { case 1 : Move_up(); break; case 2 : Move_down(); break; case 3 : Move_left(); break; default : Move_right(); } } void Output(void) { int i, j; for (j = 0; j <= n + 1; j++) { printf("#"); } printf("\n"); for (i = 1; i <= n; i++) { for (j = 0; j <= n + 1; j++) { if (j == 0 || j == n + 1) { if (map[i][j] == 3) { printf("!"); } else { printf("#"); } } else { if (map[i][j] == 1) { printf("*"); } else if (map[i][j] == 2) { printf("@"); } else if (map[i][j] == 3) { printf("!"); } else if (map[i][j] == 4) { switch (direction) { case 1 : printf("%c", 30); break; case 2 : printf("%c", 31); break; case 3 : printf("%c", 17); break; default : printf("%c", 16); } } else { printf(" "); } } } printf("\n"); } for (j = 0; j <= n + 1; j++) { printf("#"); } printf("\n"); } void Move_up(void) { int i; int x, y; if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1) { // 不能移动,则按原来的移动. direction = 2; // 按原来的向下移动. Move(direction); return ; } // 开始移动. x = squence[len].x - 1; y = squence[len].y; if (x == 0 || map[x][y] == 1) { // 撞到边界或者自己撞到自己. map[x][y] = 3; gameover = 1; } if (map[x][y] == 2) { // 说明已经吃到事物. map[squence[len].x][squence[len].y] = 1; len++; squence[len].x = x; squence[len].y = y; map[x][y] = 4; eat = 1; } else { map[squence[1].x][squence[1].y] = 0; for (i = 1; i <= len - 1; i++) { squence[i].x = squence[i + 1].x; squence[i].y = squence[i + 1].y; map[squence[i + 1].x][squence[i + 1].y] = 1; } squence[len].x = squence[len].x - 1; if (gameover) { map[squence[len].x][squence[len].y] = 3; } else { map[squence[len].x][squence[len].y] = 4; } } } void Move_down(void) { int i; int x, y; if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1) { // 不能移动,则按原来的移动. direction = 1; // 按原来的向上移动. Move(direction); return ; } // 开始移动. x = squence[len].x + 1; y = squence[len].y; if (x == n + 1 || map[x][y] == 1) { // 撞到边界或者自己撞到自己. map[x][y] = 3; gameover = 1; } if (map[x][y] == 2) { // 说明已经吃到事物. map[squence[len].x][squence[len].y] = 1; len++; squence[len].x = x; squence[len].y = y; map[x][y] = 4; eat = 1; } else { map[squence[1].x][squence[1].y] = 0; for (i = 1; i <= len - 1; i++) { squence[i].x = squence[i + 1].x; squence[i].y = squence[i + 1].y; map[squence[i + 1].x][squence[i + 1].y] = 1; } squence[len].x = squence[len].x + 1; if (gameover) { map[squence[len].x][squence[len].y] = 3; } else { map[squence[len].x][squence[len].y] = 4; } } } void Move_left(void) { int i; int x, y; if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1) { // 不能移动,则按原来的移动. direction = 4; // 按原来的向右移动. Move(direction); return ; } // 开始移动. x = squence[len].x; y = squence[len].y - 1; if (y == 0 || map[x][y] == 1) { // 撞到边界或者自己撞到自己. map[x][y] = 3; gameover = 1; } if (map[x][y] == 2) { // 说明已经吃到事物. map[squence[len].x][squence[len].y] = 1; len++; squence[len].x = x; squence[len].y = y; map[x][y] = 4; eat = 1; } else { map[squence[1].x][squence[1].y] = 0; for (i = 1; i <= len - 1; i++) { squence[i].x = squence[i + 1].x; squence[i].y = squence[i + 1].y; map[squence[i + 1].x][squence[i + 1].y] = 1; } squence[len].y = squence[len].y - 1; if (gameover) { map[squence[len].x][squence[len].y] = 3; } else { map[squence[len].x][squence[len].y] = 4; } } } void Move_right(void) { int i; int x, y; if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1) { // 不能移动,则按原来的移动. direction = 3; // 按原来的向左移动. Move(direction); return ; } // 开始移动. x = squence[len].x; y = squence[len].y + 1; if (y == n + 1 || map[x][y] == 1) { // 撞到边界或者自己撞到自己. map[x][y] = 3; gameover = 1; } if (map[x][y] == 2) { // 说明已经吃到事物. map[squence[len].x][squence[len].y] = 1; len++; squence[len].x = x; squence[len].y = y; map[x][y] = 4; eat = 1; } else { map[squence[1].x][squence[1].y] = 0; for (i = 1; i <= len - 1; i++) { squence[i].x = squence[i + 1].x; squence[i].y = squence[i + 1].y; map[squence[i + 1].x][squence[i + 1].y] = 1; } squence[len].y = squence[len].y + 1; if (gameover) { map[squence[len].x][squence[len].y] = 3; } else { map[squence[len].x][squence[len].y] = 4; } } }