C语言贪吃蛇游戏代码示例

想学习如何用 C 语言编写经典的贪吃蛇游戏吗?以下是一个简单的代码示例,可以帮助你入门:

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

// 定义游戏区域大小
#define WIDTH 20
#define HEIGHT 20

// 定义蛇的最大长度
#define MAX_LENGTH WIDTH*HEIGHT

// 定义蛇的方向
enum Direction { UP, DOWN, LEFT, RIGHT };

// 定义蛇的结构体
struct Snake {
    int x, y;
};

// 定义食物的结构体
struct Food {
    int x, y;
    int isEaten;
};

// 全局变量
int gameover;
int score;
enum Direction dir;
struct Snake snake[MAX_LENGTH];
struct Food food;

// 函数声明
void gotoxy(int x, int y);
void initGame();
void drawGame();
void updateGame();
void getInput();

int main() {
    initGame();
    while (!gameover) {
        drawGame();
        getInput();
        updateGame();
        Sleep(100); // 控制游戏速度,单位为毫秒
    }
    system('cls');
    printf('游戏结束!得分: %d\n', score);
    return 0;
}

// 设置控制台光标位置
void gotoxy(int x, int y) {
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

// 初始化游戏
void initGame() {
    gameover = 0;
    score = 0;
    dir = RIGHT;

    // 初始化蛇头位置
    snake[0].x = WIDTH / 2;
    snake[0].y = HEIGHT / 2;

    // 初始化蛇身为一个点
    for (int i = 1; i < MAX_LENGTH; i++) {
        snake[i].x = 0;
        snake[i].y = 0;
    }

    // 初始化食物位置
    food.x = rand() % WIDTH;
    food.y = rand() % HEIGHT;
    food.isEaten = 0;
}

// 绘制游戏界面
void drawGame() {
    system('cls');

    // 绘制上边界
    for (int i = 0; i < WIDTH + 2; i++)
        printf('#');
    printf('\n');

    // 绘制游戏区域
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (j == 0)
                printf('#'); // 绘制左边界

            if (i == snake[0].y && j == snake[0].x) {
                printf('O'); // 绘制蛇头
            } else if (i == food.y && j == food.x && !food.isEaten) {
                printf('@'); // 绘制食物
            } else {
                int isBodyPart = 0;
                for (int k = 1; k < MAX_LENGTH; k++) {
                    if (i == snake[k].y && j == snake[k].x) {
                        printf('*'); // 绘制蛇身
                        isBodyPart = 1;
                    }
                }
                if (!isBodyPart)
                    printf(' ');
            }

            if (j == WIDTH - 1)
                printf('#'); // 绘制右边界
        }
        printf('\n');
    }

    // 绘制下边界
    for (int i = 0; i < WIDTH + 2; i++)
        printf('#');
    printf('\n');

    printf('得分: %d\n', score);
}

// 更新游戏状态
void updateGame() {
    // 更新蛇身位置
    for (int i = MAX_LENGTH - 1; i > 0; i--) {
        snake[i] = snake[i - 1];
    }

    // 根据方向更新蛇头位置
    switch (dir) {
        case UP:
            snake[0].y--;
            break;
        case DOWN:
            snake[0].y++;
            break;
        case LEFT:
            snake[0].x--;
            break;
        case RIGHT:
            snake[0].x++;
            break;
    }

    // 检查碰撞
    if (snake[0].x < 0 || snake[0].x >= WIDTH || snake[0].y < 0 || snake[0].y >= HEIGHT)
        gameover = 1;

    for (int i = 1; i < MAX_LENGTH; i++) {
        if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
            gameover = 1;
    }

    // 蛇吃到食物
    if (snake[0].x == food.x && snake[0].y == food.y) {
        score++;
        food.isEaten = 1;

        // 随机生成新的食物位置
        while (food.isEaten) {
            food.x = rand() % WIDTH;
            food.y = rand() % HEIGHT;
            food.isEaten = 0;

            // 确保新食物不在蛇身上
            for (int i = 0; i < MAX_LENGTH; i++) {
                if (snake[i].x == food.x && snake[i].y == food.y)
                    food.isEaten = 1;
            }
        }
    }
}

// 获取用户输入
void getInput() {
    if (_kbhit()) {
        switch (_getch()) {
            case 'w':
                if (dir != DOWN)
                    dir = UP;
                break;
            case 's':
                if (dir != UP)
                    dir = DOWN;
                break;
            case 'a':
                if (dir != RIGHT)
                    dir = LEFT;
                break;
            case 'd':
                if (dir != LEFT)
                    dir = RIGHT;
                break;
            case 'q':
                gameover = 1;
                break;
        }
    }
}

代码说明:

  • 该代码使用 #include 语句引入了必要的头文件,如 stdio.hconio.hstdlib.hwindows.h
  • 定义了游戏区域大小、蛇的最大长度、蛇的方向、蛇的结构体、食物的结构体以及一些全局变量。
  • 声明了函数 gotoxyinitGamedrawGameupdateGamegetInput
  • main 函数是程序的入口点,它初始化游戏并进入游戏循环。
  • gotoxy 函数用于设置控制台光标位置。
  • initGame 函数用于初始化游戏状态,包括蛇的位置、食物的位置和游戏得分等。
  • drawGame 函数用于绘制游戏界面,包括游戏区域、蛇和食物。
  • updateGame 函数用于更新游戏状态,包括蛇的移动、碰撞检测和食物的生成等。
  • getInput 函数用于获取用户的键盘输入,并根据输入更新蛇的移动方向。

注意:

  • 此示例代码仅包含基本的贪吃蛇游戏逻辑,可以在此基础上进行扩展和改进。
  • 该代码使用了 Windows 平台特有的头文件和函数,如果在其他平台上运行,需要进行相应的修改。

希望这段代码可以帮助你编写自己的贪吃蛇游戏!

C语言贪吃蛇游戏代码示例

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

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