由于贪吃蛇游戏的实现方式有很多种,这里提供一种比较简单的实现方式。

首先,我们需要定义一些常量和变量,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

#define ROW 20
#define COL 40
#define SNAKE_LEN (ROW * COL)

int snake[SNAKE_LEN][2];      // 蛇的位置
int food[2];                  // 食物的位置
int snake_len;                // 蛇的长度
char map[ROW][COL];           // 地图
int dir;                      // 方向
int score;                    // 分数

其中,snake 数组存储蛇的位置,每个元素表示一个坐标,例如 snake[0][0] 表示蛇头的行号,snake[0][1] 表示蛇头的列号;food 数组表示食物的位置,同样有两个元素,表示行号和列号。snake_len 表示蛇的长度,map 数组表示地图,dir 表示方向,score 表示分数。

接下来,我们需要初始化一些变量,如下所示:

void init() {
    // 初始化蛇
    snake[0][0] = ROW / 2;
    snake[0][1] = COL / 2;
    snake_len = 1;

    // 初始化地图
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) {
                map[i][j] = '#';    // 边界
            } else {
                map[i][j] = ' ';    // 空格
            }
        }
    }

    // 初始化食物
    srand((unsigned) time(NULL));   // 随机数种子
    food[0] = rand() % (ROW - 2) + 1;    // 食物不能出现在边界上
    food[1] = rand() % (COL - 2) + 1;
    map[food[0]][food[1]] = '*';

    // 初始化方向和分数
    dir = 'w';      // 初始方向向上
    score = 0;
}

init 函数中,我们用蛇头的位置初始化蛇的位置,用空格和井号初始化地图,用随机数初始化食物的位置,用字符 w 表示初始方向向上,用 0 表示初始分数。

接下来,我们需要实现一些函数来处理游戏逻辑,如下所示:

// 显示地图
void show_map() {
    system("cls");      // 清屏
    printf("score: %d\n", score);
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            printf("%c", map[i][j]);
        }
        printf("\n");
    }
}

// 移动蛇
void move_snake() {
    int x, y;
    x = snake[0][0];
    y = snake[0][1];
    switch (dir) {
        case 'w': x--; break;
        case 's': x++; break;
        case 'a': y--; break;
        case 'd': y++; break;
    }
    // 判断是否吃到食物
    if (x == food[0] && y == food[1]) {
        map[food[0]][food[1]] = ' ';
        for (int i = snake_len; i > 0; i--) {
            snake[i][0] = snake[i - 1][0];
            snake[i][1] = snake[i - 1][1];
        }
        snake_len++;
        score++;
        food[0] = rand() % (ROW - 2) + 1;
        food[1] = rand() % (COL - 2) + 1;
        map[food[0]][food[1]] = '*';
    } else {
        map[snake[snake_len - 1][0]][snake[snake_len - 1][1]] = ' ';
        for (int i = snake_len - 1; i > 0; i--) {
            snake[i][0] = snake[i - 1][0];
            snake[i][1] = snake[i - 1][1];
        }
    }
    snake[0][0] = x;
    snake[0][1] = y;
    // 判断是否撞墙
    if (map[x][y] == '#' || map[x][y] == '@') {
        printf("Game over!\n");
        exit(0);
    }
    map[x][y] = '@';
}

// 处理键盘输入
void handle_input() {
    if (_kbhit()) {
        int c = _getch();
        switch (c) {
            case 'w':
            case 's':
            case 'a':
            case 'd':
                if (dir != 'w' + c - 'a') {     // 防止蛇头掉头
                    dir = c;
                }
                break;
        }
    }
}

// 主函数
int main() {
    init();
    while (1) {
        show_map();
        move_snake();
        handle_input();
        Sleep(100);     // 休眠100毫秒
    }
    return 0;
}

show_map 函数中,我们用 printf 函数按照地图的内容输出地图,并在开头显示当前分数。

move_snake 函数中,我们根据当前方向计算出蛇头的新位置,判断是否吃到食物,如果吃到食物则将蛇长度加一并重新生成食物,否则将蛇尾的位置设置为空格,并将蛇的位置向前移动一格。最后,我们需要判断蛇头是否撞墙或撞到自己的身体,如果是则游戏结束。

handle_input 函数中,我们使用 _kbhit 函数和 _getch 函数获取键盘输入,并根据输入修改方向,注意要防止蛇头掉头。

在主函数中,我们使用 init 函数初始化游戏,然后在一个死循环中不断调用 show_map 函数、move_snake 函数和 handle_input 函数,并使用 Sleep 函数休眠一段时间,以控制游戏速度。

完整代码如下:

用C语言写一段贪吃蛇游戏代码

原文地址: https://www.cveoy.top/t/topic/bxJB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录