以下是一个简单的贪吃蛇游戏的C语言代码,包括代码注释和详细解释。
```c
#include
#include
#include
#include
#define WIDTH 20 // 屏幕宽度
#define HEIGHT 10 // 屏幕高度
typedef struct {
int x; // 蛇头坐标
int y;
int len; // 蛇的长度
int dx; // 蛇头移动方向(0:向右,1:向左)
char body[WIDTH][HEIGHT]; // 蛇的身体
} Snake;
int x; // 苹果坐标
} Apple;
void init(); // 初始化游戏
void draw(); // 绘制游戏界面
void move(); // 移动蛇和苹果
void collision(); // 检查碰撞
void gameOver(); // 游戏结束
int main() {
init();
while (1) {
draw();
move();
collision();
if (Snake.len == 0) {
gameOver();
break;
}
usleep(100000); // 延迟100ms,控制游戏速度
}
return 0;
}
void init() {
srand(time(NULL)); // 初始化随机数种子
Snake snake = {WIDTH / 2, HEIGHT / 2, 3, 0, {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}}; // 初始化蛇和苹果的位置和长度等参数
Apple apple = {rand() % WIDTH, rand() % HEIGHT}; // 随机生成苹果的位置
Snake.dx = rand() % 2; // 随机生成蛇的移动方向(向右或向左)
void draw() {
system("clear"); // 清屏
printf("贪吃蛇\n");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0 || j == WIDTH - 1 || i == 0 || i == HEIGHT - 1) {
printf("#"); // 绘制边界框,使用#表示墙壁或边界线
} else if (Snake.body[i][j] == ' ') { // 如果当前位置是空地,则绘制空格,使用空格表示地面或空地等空白区域
printf(" ");
} else if (Snake.body[i][j] == 'A') { // 如果当前位置是苹果,则绘制A,使用A表示苹果等可食用的物品
printf("A");
} else { // 如果当前位置是蛇的身体,则绘制相应的字符,使用不同的字符表示不同的部分,如头、身体等,这里使用数字1-9表示不同的部分,可以根据需要自定义字符或使用其他方式表示。
printf("%c", Snake.body[i][j]);
}
printf("\n");
void move() {
for (int i = Snake.len - 1; i > 0; i--) { // 从蛇尾开始向前遍历,依次将每个位置的字符复制到前一个位置的字符上,实现蛇身的移动,这里使用字符复制的方式实现,也可以使用其他方式实现。
Snake.body[Snake.body[i][Snake.dx] == ' ' ? Snake.body[i][!Snake.dx] : Snake.body[i][Snake.dx]] = Snake.body[i][!Snake.dx]; // 根据移动方向复制字符,如果当前位置是空地,则复制前一个位置的字符;否则复制当前位置的字符,这里使用了一个条件运算符实现,注意这里使用了两个变量Snake.dx和!Snake.dx来表示左右两个方向,其中Snake.dx为0表示向右移动,为1表示向左移动。!Snake.dx为0表示向左移动,为1表示向右移动,这样可以通过一个变量来表示两个方向,同样地,也可以使用其他方式表示左右两个方向。
Snake.body[Snake.body[0][Snake.dx] == ' ' ? Snake.body[0][!Snake.dx] : Snake.body[0][Snake.dx]] = ' '; // 将蛇头位置的字符设置为空格,表示蛇头移动到了新的位置