使用C语言编写一个可以在ubuntu下运行的贪吃蛇游戏
时间: 2024-02-05 11:10:47 浏览: 30
好的,下面是一个简单的贪吃蛇游戏的实现,使用C语言编写,可以在Ubuntu下运行。
在终端中打开一个新的文本编辑器,输入以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>
#define WIDTH 30
#define HEIGHT 20
int map[WIDTH][HEIGHT] = {0}; // 游戏地图
typedef struct _point {
int x;
int y;
} Point;
Point snake[WIDTH * HEIGHT]; // 蛇的身体
int length = 3; // 蛇的长度
int direction = 2; // 蛇的方向
struct termios oldt, newt; // 终端设置
void init_terminal() {
tcgetattr(0, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &newt);
}
void reset_terminal() {
tcsetattr(0, TCSANOW, &oldt);
}
void clear_screen() {
printf("\033[2J");
}
void move_cursor(int x, int y) {
printf("\033[%d;%dH", y, x);
}
void draw_wall() {
int i;
for (i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
int j;
for (j = 0; j < HEIGHT; j++) {
printf("#");
for (i = 0; i < WIDTH; i++) {
if (map[i][j] == 1) {
printf("*");
} else if (map[i][j] == 2) {
printf("@");
} else {
printf(" ");
}
}
printf("#\n");
}
for (i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
}
void generate_food() {
int x, y;
do {
x = rand() % WIDTH;
y = rand() % HEIGHT;
} while (map[x][y] != 0);
map[x][y] = 2;
}
void init_game() {
int i, j;
// 初始化地图
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
if (i == 0 || i == WIDTH - 1 || j == 0 || j == HEIGHT - 1) {
map[i][j] = 1;
}
}
}
// 初始化蛇
snake[0].x = WIDTH / 2;
snake[0].y = HEIGHT / 2;
for (i = 1; i < length; i++) {
snake[i].x = snake[i - 1].x - 1;
snake[i].y = snake[i - 1].y;
}
// 生成食物
generate_food();
}
void update_snake() {
// 记录蛇头的位置
int x = snake[0].x;
int y = snake[0].y;
// 根据方向更新蛇头的位置
if (direction == 1) {
y--;
} else if (direction == 2) {
x++;
} else if (direction == 3) {
y++;
} else if (direction == 4) {
x--;
}
// 检查蛇是否撞墙或撞到自己
if (map[x][y] == 1 || map[x][y] == 3) {
printf("Game Over!\n");
exit(0);
}
// 检查蛇是否吃到食物
if (map[x][y] == 2) {
length++;
generate_food();
} else {
// 删除蛇尾
map[snake[length - 1].x][snake[length - 1].y] = 0;
}
// 将蛇头插入到蛇身体的前面
int i;
for (i = length - 1; i > 0; i--) {
snake[i].x = snake[i - 1].x;
snake[i].y = snake[i - 1].y;
}
snake[0].x = x;
snake[0].y = y;
// 更新地图
for (i = 0; i < length; i++) {
map[snake[i].x][snake[i].y] = 3;
}
}
void get_input() {
char c = getchar();
if (c == 'w' && direction != 3) {
direction = 1;
} else if (c == 'd' && direction != 4) {
direction = 2;
} else if (c == 's' && direction != 1) {
direction = 3;
} else if (c == 'a' && direction != 2) {
direction = 4;
}
}
int main() {
srand(time(NULL));
init_terminal();
init_game();
while (1) {
clear_screen();
update_snake();
draw_wall();
get_input();
usleep(100000);
}
reset_terminal();
return 0;
}
```
保存文件并退出文本编辑器。使用以下命令编译代码:
```
gcc -o snake snake.c
```
然后运行游戏:
```
./snake
```
现在你可以使用"w"、"a"、"s"、"d"键来控制贪吃蛇的移动。