用c语言编程贪吃蛇游戏代码
时间: 2023-10-29 18:59:20 浏览: 154
以下是贪吃蛇游戏的C语言代码:
```c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define ROW 20 // 地图行数
#define COLUMN 30 // 地图列数
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
void draw_map(int map[ROW][COLUMN], int score); // 绘制地图
void init_snake(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int *snake_len); // 初始化蛇
void init_food(int map[ROW][COLUMN], int *x, int *y); // 初始化食物
int update_snake(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int *snake_len, int dir, int x, int y); // 更新蛇
int check_gameover(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int snake_len); // 检查游戏是否结束
int main()
{
int map[ROW][COLUMN]; // 地图
int snake[ROW*COLUMN/2][2]; // 蛇
int snake_len = 0; // 蛇长
int x, y; // 食物坐标
int dir = RIGHT; // 蛇前进方向
int score = 0; // 得分
int speed = 200; // 游戏速度
srand((unsigned int)time(NULL));
init_snake(map, snake, &snake_len); // 初始化蛇
init_food(map, &x, &y); // 初始化食物
while (1) {
if (_kbhit()) {
int ch = _getch();
if (ch == 224) {
ch = _getch();
if ((ch == UP && dir != DOWN) || (ch == DOWN && dir != UP) || (ch == LEFT && dir != RIGHT) || (ch == RIGHT && dir != LEFT))
dir = ch; // 判断输入是否为方向键
}
}
if (update_snake(map, snake, &snake_len, dir, x, y)) {
score++;
speed -= 5; // 加速
init_food(map, &x, &y);
}
draw_map(map, score);
if (check_gameover(map, snake, snake_len)) {
system("cls");
printf("Game Over!\n");
printf("Your Score: %d\n", score);
break;
}
Sleep(speed); // 等待
}
return 0;
}
void draw_map(int map[ROW][COLUMN], int score) {
system("cls"); // 清屏
printf("Score: %d\n", score); // 输出分数
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; ++j) {
if (map[i][j] == -1) printf("#"); // 墙壁
else if (map[i][j] == 0) printf(" "); // 空地
else if (map[i][j] == 1) printf("*"); // 蛇身
else if (map[i][j] == 2) printf("@"); // 食物
}
printf("\n");
}
}
void init_snake(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int *snake_len) {
*snake_len = 1; // 初始蛇长度为1
snake[0][0] = ROW/2; snake[0][1] = COLUMN/2; // 初始蛇位置为地图中心
map[ROW/2][COLUMN/2] = 1; // 标记蛇头位置
for (int i = 0; i < ROW; ++i) map[i][0] = map[i][COLUMN-1] = -1; // 画出上下两面墙
for (int i = 0; i < COLUMN; ++i) map[0][i] = map[ROW-1][i] = -1; // 画出左右两面墙
}
void init_food(int map[ROW][COLUMN], int *x, int *y) {
do {
*x = rand() % (ROW-2) + 1; // 随机生成x坐标
*y = rand() % (COLUMN-2) + 1; // 随机生成y坐标
} while (map[*x][*y] != 0);
map[*x][*y] = 2; // 标记食物位置
}
int update_snake(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int *snake_len, int dir, int x, int y) {
int head_x = snake[0][0], head_y = snake[0][1];
if (dir == UP) head_x--; // 向上移动
else if (dir == DOWN) head_x++; // 向下移动
else if (dir == LEFT) head_y--; // 向左移动
else if (dir == RIGHT) head_y++; // 向右移动
if (head_x == x && head_y == y) return 1; // 如果吃到食物,则返回1
if (map[head_x][head_y] != 0) return 0; // 如果碰到墙壁或自己,则返回0
snake[*snake_len][0] = head_x;
snake[*snake_len][1] = head_y;
map[head_x][head_y] = 1;
for (int i = 0; i < *snake_len-1; ++i) { // 如果蛇头移动到了蛇身上,则游戏结束
if (snake[i][0] == head_x && snake[i][1] == head_y)
return 0;
}
if (*snake_len == ROW*COLUMN/2) return 0; // 如果蛇长度达到上限,则返回0
map[snake[*snake_len-1][0]][snake[*snake_len-1][1]] = 0;
(*snake_len)--;
return 0;
}
int check_gameover(int map[ROW][COLUMN], int snake[ROW*COLUMN/2][2], int snake_len) {
int head_x = snake[0][0], head_y = snake[0][1];
if (head_x == 0 || head_x == ROW-1 || head_y == 0 || head_y == COLUMN-1) // 如果碰到墙壁,则游戏结束
return 1;
for (int i = 1; i < snake_len; ++i) { // 如果蛇头碰到了蛇身,则游戏结束
if (snake[i][0] == head_x && snake[i][1] == head_y)
return 1;
}
if (snake_len == ROW*COLUMN/2) return 1; // 如果蛇长度达到上限,则游戏结束
return 0;
}
```
阅读全文