帮我用c语言写一个贪吃蛇游戏
时间: 2023-11-18 18:03:01 浏览: 34
好的,贪吃蛇游戏是一个比较复杂的游戏,需要用到很多C语言的知识,包括控制台输出、键盘输入、数组、指针、结构体等。以下是一个简单的贪吃蛇游戏的代码,您可以参考一下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define WIDTH 30 // 地图宽度
#define HEIGHT 20 // 地图高度
// 定义地图上的元素
enum element {
EMPTY, // 空地
WALL, // 墙
SNAKE, // 蛇
FOOD // 食物
};
// 定义蛇的结构体
struct snake {
int x, y; // 蛇头坐标
int length; // 蛇的长度
int direction; // 蛇的方向(0:上,1:右,2:下,3:左)
struct snakeNode {
int x, y; // 蛇身坐标
} body[WIDTH * HEIGHT]; // 蛇的身体
};
// 定义地图和蛇
int map[WIDTH][HEIGHT];
struct snake snake;
// 初始化地图
void initMap() {
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
if (i == 0 || i == WIDTH - 1 || j == 0 || j == HEIGHT - 1) {
map[i][j] = WALL;
} else {
map[i][j] = EMPTY;
}
}
}
}
// 初始化蛇
void initSnake() {
snake.x = WIDTH / 2;
snake.y = HEIGHT / 2;
snake.length = 3;
snake.direction = 1;
for (int i = 0; i < snake.length; i++) {
snake.body[i].x = snake.x - i;
snake.body[i].y = snake.y;
}
}
// 在地图上随机生成食物
void generateFood() {
int x, y;
do {
x = rand() % (WIDTH - 2) + 1;
y = rand() % (HEIGHT - 2) + 1;
} while (map[x][y] != EMPTY);
map[x][y] = FOOD;
}
// 判断蛇是否吃到了食物
int eatFood() {
if (snake.x == snake.body[0].x && snake.y == snake.body[0].y) {
snake.length++;
return 1;
}
return 0;
}
// 移动蛇
void moveSnake() {
// 记录蛇尾的坐标
int tailX = snake.body[snake.length - 1].x;
int tailY = snake.body[snake.length - 1].y;
// 将蛇身体所在的格子清空
for (int i = snake.length - 1; i > 0; i--) {
snake.body[i].x = snake.body[i - 1].x;
snake.body[i].y = snake.body[i - 1].y;
}
// 更新蛇头的坐标
switch (snake.direction) {
case 0: // 上
snake.y--;
break;
case 1: // 右
snake.x++;
break;
case 2: // 下
snake.y++;
break;
case 3: // 左
snake.x--;
break;
}
// 更新蛇头的坐标
snake.body[0].x = snake.x;
snake.body[0].y = snake.y;
// 判断蛇是否撞到了墙壁或者自己
if (map[snake.x][snake.y] == WALL || map[snake.x][snake.y] == SNAKE) {
printf("游戏结束!\n");
exit(0);
}
// 判断蛇是否吃到了食物
if (eatFood()) {
generateFood();
} else {
// 将蛇尾所在的格子清空
map[tailX][tailY] = EMPTY;
}
// 更新蛇身体所在的格子
for (int i = 0; i < snake.length; i++) {
map[snake.body[i].x][snake.body[i].y] = SNAKE;
}
}
// 画地图
void drawMap() {
system("cls"); // 清屏
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
switch (map[i][j]) {
case EMPTY:
printf(" ");
break;
case WALL:
printf("■");
break;
case SNAKE:
printf("●");
break;
case FOOD:
printf("★");
break;
}
}
printf("\n");
}
}
// 按键响应
void handleInput() {
if (kbhit()) { // 检测是否有按键按下
switch (getch()) {
case 'w': // 上
if (snake.direction != 2) {
snake.direction = 0;
}
break;
case 'd': // 右
if (snake.direction != 3) {
snake.direction = 1;
}
break;
case 's': // 下
if (snake.direction != 0) {
snake.direction = 2;
}
break;
case 'a': // 左
if (snake.direction != 1) {
snake.direction = 3;
}
break;
}
}
}
int main() {
srand(time(NULL)); // 随机数种子
initMap();
initSnake();
generateFood();
while (1) {
drawMap();
moveSnake();
handleInput();
Sleep(100); // 控制帧率
}
return 0;
}
```
这个游戏使用了Windows.h库来控制帧率和清屏,如果您在其他操作系统上运行可能会有问题。您可以尝试将画地图和清屏的部分替换为其他库的调用,或者自己实现清屏和控制帧率的功能。