c语言编程笔录

首页 > C语言 > c语言

c语言

Linux下C语言实现贪吃蛇小游戏

更新时间:2023-08-09

前言:

贪吃蛇是一款经典的小游戏,在 Linux 环境下使用 C 语言实现贪吃蛇游戏可以是一个有趣且具有挑战性的项目。在这个项目中,我们将利用 C 语言的特性和 Linux 的功能来设计和编写出一个可玩的贪吃蛇游戏。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

#define WIDTH 20
#define HEIGHT 10

int score = 0;
int gameover = 0;
int snake_size = 1;
int head_x, head_y;
int fruit_x, fruit_y;
int tail_x[100], tail_y[100];

enum Direction {
    STOP,
    LEFT,
    RIGHT,
    UP,
    DOWN
};

enum Direction dir;

void Setup() {
    // 设置终端输入不需要按回车键确认
    struct termios term;
    tcgetattr(0, &term);
    term.c_lflag &= ~ICANON;
    tcsetattr(0, TCSANOW, &term);

    // 随机生成食物初始位置
    srand(time(NULL));
    fruit_x = rand() % WIDTH;
    fruit_y = rand() % HEIGHT;

    // 从中心位置生成蛇头
    head_x = WIDTH / 2;
    head_y = HEIGHT / 2;
}

void Draw() {
    // 清空终端
    system("clear");
    
    // 绘制墙壁
    for (int i = 0; i <= WIDTH + 1; i++) {
        printf("#");
    }
    printf("\n");
    
    // 绘制游戏区域
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j <= WIDTH; j++) {
            if (j == 0 || j == WIDTH) {
                printf("#");
            } else if (i == head_y && j == head_x) {
                printf("O");
            } else if (i == fruit_y && j == fruit_x) {
                printf("F");
            } else {
                int tail_drawn = 0;
                for (int k = 0; k < snake_size; k++) {
                    if (tail_x[k] == j && tail_y[k] == i) {
                        printf("o");
                        tail_drawn = 1;
                    }
                }
                if (!tail_drawn) {
                    printf(" ");
                }
            }
        }
        printf("\n");
    }
    
    // 绘制墙壁
    for (int i = 0; i <= WIDTH + 1; i++) {
        printf("#");
    }
    printf("\n");
    
    // 显示分数
    printf("Score: %d\n", score);
}

上述代码片段展示了游戏的开始部分,其中定义了一些全局变量和枚举类型,以及一些游戏需要用到的函数。在 "Setup" 函数中,我们设置了终端输入不需要按回车键确认,并初始化了食物和蛇的初始位置。在 "Draw" 函数中,我们绘制了游戏的界面,包括墙壁、蛇和食物的位置。

代码解释:

void Input() {
    // 监听键盘输入
    if (kbhit()) {
        switch (getchar()) {
            case 'a':
                dir = LEFT;
                break;
            case 'd':
                dir = RIGHT;
                break;
            case 'w':
                dir = UP;
                break;
            case 's':
                dir = DOWN;
                break;
            case 'x':
                gameover = 1;
                break;
        }
    }
}

void Logic() {
    // 更新蛇的位置
    int prev_x = tail_x[0];
    int prev_y = tail_y[0];
    tail_x[0] = head_x;
    tail_y[0] = head_y;
    int prev2_x, prev2_y;
    for (int i = 1; i < snake_size; i++) {
        prev2_x = tail_x[i];
        prev2_y = tail_y[i];
        tail_x[i] = prev_x;
        tail_y[i] = prev_y;
        prev_x = prev2_x;
        prev_y = prev2_y;
    }

    // 根据方向更新蛇头的位置
    switch (dir) {
        case LEFT:
            head_x--;
            break;
        case RIGHT:
            head_x++;
            break;
        case UP:
            head_y--;
            break;
        case DOWN:
            head_y++;
            break;
    }
    
    // 检查蛇是否吃到食物
    if (head_x == fruit_x && head_y == fruit_y) {
        score += 10;
        snake_size++;
        fruit_x = rand() % WIDTH;
        fruit_y = rand() % HEIGHT;
    }

    // 检查蛇是否碰到墙壁或自身
    if (head_x <= 0 || head_x >= WIDTH || head_y <= 0 || head_y >= HEIGHT) {
        gameover = 1;
    }
    for (int i = 0; i < snake_size; i++) {
        if (tail_x[i] == head_x && tail_y[i] == head_y) {
            gameover = 1;
            break;
        }
    }
}

int main() {
    // 游戏初始化
    Setup();
    
    // 游戏循环,直到游戏结束
    while (!gameover) {
        // 绘制游戏界面
        Draw();
        
        // 监听键盘输入
        Input();
        
        // 更新游戏逻辑
        Logic();
        
        // 控制游戏帧率
        usleep(80000);
    }
    
    // 游戏结束
    system("clear");
    printf("Game Over!\n");
    return 0;
}

上述代码片段展示了游戏的主要逻辑部分。在 "Input" 函数中,我们监听键盘输入,根据不同的按键设置蛇头的方向。在 "Logic" 函数中,我们更新蛇的位置,并检查蛇是否吃到食物或碰到墙壁或自身。在 "main" 函数中,我们将游戏的初始化、绘制、输入、逻辑更新和帧率控制放入一个循环中,直到游戏结束。

总结:

通过使用 C 语言在 Linux 环境下实现贪吃蛇小游戏,我们可以锻炼自己的编程能力和算法设计能力。这个项目中,我们利用 C 语言的特性实现了游戏的核心逻辑,利用 Linux 的终端功能绘制了游戏界面和监听键盘输入。希望通过这个项目,你能更好地理解 C 语言和 Linux 的使用,并享受编写游戏的乐趣。