贪吃蛇游戏,现在还有很多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;
- }
- }
- }