写一个贪吃蛇的c语言代码
时间: 2023-08-28 08:28:40 浏览: 93
以下是一个简单的贪吃蛇C语言代码,基于控制台窗口实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAX_X 20
#define MAX_Y 20
#define INIT_SNAKE_LEN 3
typedef struct {
int x;
int y;
} Position;
void draw(Position snake[], int len, Position food);
void move(Position snake[], int len, int dir);
Position generate_food(Position snake[], int len);
int main() {
Position snake[MAX_X * MAX_Y]; // 蛇的最大长度
int len = INIT_SNAKE_LEN; // 蛇的初始长度
int dir = 1; // 蛇的初始移动方向
Position food = generate_food(snake, len); // 食物的初始位置
int score = 0; // 得分
int speed = 300; // 蛇移动速度,单位为毫秒
int gameover = 0; // 游戏结束标志
// 初始化蛇头和身体
snake[0].x = MAX_X / 2;
snake[0].y = MAX_Y / 2;
for (int i = 1; i < len; i++) {
snake[i].x = snake[i - 1].x;
snake[i].y = snake[i - 1].y + 1;
}
// 绘制初始状态
draw(snake, len, food);
// 游戏循环
while (!gameover) {
// 判断是否吃到食物
if (snake[0].x == food.x && snake[0].y == food.y) {
len++;
score++;
food = generate_food(snake, len);
if (speed > 50) {
speed -= 10;
}
}
// 检测是否碰到边界或自身
if (snake[0].x < 0 || snake[0].x >= MAX_X || snake[0].y < 0 || snake[0].y >= MAX_Y) {
gameover = 1;
}
for (int i = 1; i < len; i++) {
if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
gameover = 1;
break;
}
}
// 移动蛇
move(snake, len, dir);
// 绘制新状态
draw(snake, len, food);
// 休眠一段时间,控制蛇移动速度
Sleep(speed);
// 检测方向键输入
if (_kbhit()) {
int ch = _getch();
if (ch == 224) {
ch = _getch();
switch (ch) {
case 72: // 上
if (dir != 2) {
dir = 0;
}
break;
case 80: // 下
if (dir != 0) {
dir = 2;
}
break;
case 75: // 左
if (dir != 1) {
dir = 3;
}
break;
case 77: // 右
if (dir != 3) {
dir = 1;
}
break;
}
}
}
}
// 输出游戏结束信息
system("cls");
printf("Game Over!\n");
printf("Your Score: %d\n", score);
return 0;
}
// 绘制游戏界面
void draw(Position snake[], int len, Position food) {
system("cls");
for (int i = 0; i < MAX_X; i++) {
for (int j = 0; j < MAX_Y; j++) {
int is_snake = 0;
for (int k = 0; k < len; k++) {
if (snake[k].x == i && snake[k].y == j) {
is_snake = 1;
break;
}
}
if (is_snake) {
printf("*");
} else if (i == food.x && j == food.y) {
printf("#");
} else {
printf(" ");
}
}
printf("\n");
}
}
// 移动蛇
void move(Position snake[], int len, int dir) {
// 记录蛇尾的位置,用于后面更新蛇身体的位置
Position tail = snake[len - 1];
for (int i = len - 1; i > 0; i--) {
snake[i] = snake[i - 1];
}
switch (dir) {
case 0: // 上
snake[0].x--;
break;
case 1: // 右
snake[0].y++;
break;
case 2: // 下
snake[0].x++;
break;
case 3: // 左
snake[0].y--;
break;
}
// 更新蛇身体的位置
for (int i = len - 1; i > 0; i--) {
snake[i - 1].x = snake[i].x;
snake[i - 1].y = snake[i].y;
}
snake[len - 1] = tail;
}
// 生成食物的位置
Position generate_food(Position snake[], int len) {
Position food;
// 随机生成食物位置,直到位置不在蛇身上
do {
food.x = rand() % MAX_X;
food.y = rand() % MAX_Y;
} while (food.x == snake[0].x && food.y == snake[0].y);
for (int i = 1; i < len; i++) {
if (food.x == snake[i].x && food.y == snake[i].y) {
food = generate_food(snake, len);
break;
}
}
return food;
}
```
注:代码中使用了 `_kbhit()` 和 `_getch()` 函数来检测方向键输入,需要注意这两个函数是 Windows 系统下的特有函数,所以在其他操作系统下可能无法编译通过。
阅读全文