C语言贪吃蛇小游戏演示和说明
设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。
游戏开始后,会在中间位置出现一条只有三个节点的贪吃蛇,并随机出现一个食物,如下图所示:
图1:游戏初始化
按下键盘上的任意一个键,贪吃蛇开始移动。和大部分游戏一样,你可以通过W、A、S、D四个键来控制移动方向,如下图所示:
图2:游戏进行中
当贪吃蛇出界或者撞到自己时,游戏结束,如下图所示:
图3:游戏结束
这个版本的贪吃蛇将有以下特点:
- 使用控制台(终端)
- ASCII字符表示蛇和食物
- 方向控制(W, A, S, D)
- 简单的游戏结束逻辑(蛇撞墙或撞到自己)
c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // 注意:这是特定于某些编译器的,如Borland C或Turbo C
#include <windows.h> // 用于Sleep函数 #define WIDTH 20
#define HEIGHT 10
#define SNAKE_LEN 100 typedef struct { int x, y;
} Point; Point snake[SNAKE_LEN], food;
int snakeSize = 3;
int direction = 2; // 0: left, 1: up, 2: right, 3: down
int gameOver = 0; void initialize() { for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) printf(" "); printf("#\n"); } for (int i = 0; i < 3; i++) { snake[i].x = WIDTH / 2 + i; snake[i].y = HEIGHT / 2; } food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 1) + 1; while (snake[0].x == food.x && snake[0].y == food.y) { food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 1) + 1; } draw();
} void draw() { system("cls"); for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { if (j == 0 || j == WIDTH - 1) printf("#"); else if (i == snake[0].y && j == snake[0].x) printf("O"); else { int eat = 0; for (int k = 0; k < snakeSize; k++) if (snake[k].x == j && snake[k].y == i) { printf("o"); eat = 1; break; } if (!eat && i == food.y && j == food.x) printf("F"); else printf(" "); } } printf("#\n"); } for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n");
} void input() { if (_kbhit()) { switch (_getch()) { case 'w': case 'W': if (direction != 1) direction = 0; break; case 's': case 'S': if (direction != 0) direction = 1; break; case 'a': case 'A': if (direction != 3) direction = 2; break; case 'd': case 'D': if (direction != 2) direction = 3; break; } }
} void move() { Point head = snake[0]; switch (direction) { case 0: head.x--; break; case 1: head.y--; break; case 2: head.x++; break; case 3: head.y++; break; } // Check collision if (head.x >= WIDTH || head.x < 0 || head.y >= HEIGHT || head.y < 0) gameOver = 1; for (int i = 1; i < snakeSize; i++) if (snake[i].x == head.x && snake[i].y == head.y) gameOver = 1; for (int i = snakeSize - 1; i > 0; i--) snake[i] = snake[i - 1]; snake[0] = head; if (head.x == food.x && head.y == food.y) { food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 1) + 1; snakeSize++; while (snake[0].x == food.x && snake[0].y == food.y) { food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 1) + 1; } }
} int main() { initialize(); while (!gameOver) { input(); move(); draw(); Sleep(100); // 控制游戏速度 } printf("Game Over!\n"); return 0;
}
注意:
代码中使用了_kbhit()和_getch()函数,这些函数是特定于某些编译器的(如Borland C或Turbo C),在标准C库中并不包含。如果你使用的是GCC或其他不支持这些函数的编译器,你可能需要寻找替代方法(如使用curses库等)。
Sleep()函数用于Windows平台,如果你在其他平台上编译,可能需要替换为相应的函数(如usleep()在Unix/Linux上)。
演示程序百度网盘下载地址:百度网盘 请输入提取码 密码:u5ee