贪吃蛇c语言代码详解

admin 33 0

以下是一个简单的贪吃蛇游戏的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]] = ' '; // 将蛇头位置的字符设置为空格,表示蛇头移动到了新的位置