c_snake_game

第 15 课:完成与扩展 🚀

恭喜你完成了教程!现在让我们完善游戏并添加新功能。


15.1 项目检查清单

确保你的项目包含:


15.2 扩展功能建议

1. 多种食物类型

typedef enum {
    FOOD_APPLE,     // 普通,10 分
    FOOD_BERRY,     // 5 分,生成快
    FOOD_GOLDEN,    // 50 分,稀有
    FOOD_POISON     // 减分,小心!
} FoodType;

typedef struct {
    Point position;
    FoodType type;
    int value;
    bool active;
} Food;

2. 道具系统

typedef enum {
    POWER_SPEED_UP,     // 加速
    POWER_SPEED_DOWN,   // 减速
    POWER_SHIELD,       // 护盾
    POWER_GHOST,        // 穿墙
    POWER_SHRINK        // 缩短
} PowerUp;

3. 多种蛇皮肤

typedef struct {
    char head_char;
    char body_char;
    int color_pair;
    const char* name;
} SnakeSkin;

SnakeSkin skins[] = {
    {'O', '#', 1, "Classic"},
    {'@', '*', 2, "Dragon"},
    {'H', 'H', 3, "Snake"},
    {'█', '▓', 4, "Block"},
};

4. 地图系统

typedef struct {
    int width, height;
    char* tiles;  // 0=空,1=墙,2=传送门
} Map;

bool is_wall(Map* m, int x, int y) {
    return m->tiles[y * m->width + x] == 1;
}

5. 排行榜系统

typedef struct {
    char name[32];
    int score;
    int level;
    time_t date;
} HighScore;

HighScore top_scores[10];

void save_score(const char* name, int score) {
    // 保存到文件
}

void load_scores(void) {
    // 从文件加载
}

void show_leaderboard(void) {
    // 显示排行榜
}

6. 音效(终端蜂鸣)

#include <stdio.h>

void play_sound(int frequency, int duration) {
    printf("\007");  // 终端蜂鸣
    // 或使用系统命令
    // system("beep -f 440 -l 100");
}

void sound_eat(void) {
    play_sound(800, 50);
}

void sound_die(void) {
    play_sound(200, 200);
    play_sound(150, 200);
}

7. 游戏存档

typedef struct {
    Snake snake;
    Food food;
    int score;
    int level;
    time_t saved_time;
} SaveData;

void save_game(const char* filename, SaveData* data) {
    FILE* f = fopen(filename, "wb");
    fwrite(data, sizeof(SaveData), 1, f);
    fclose(f);
}

SaveData* load_game(const char* filename) {
    FILE* f = fopen(filename, "rb");
    SaveData* data = malloc(sizeof(SaveData));
    fread(data, sizeof(SaveData), 1, f);
    fclose(f);
    return data;
}

8. 多人模式

typedef struct {
    Snake snake1;
    Snake snake2;
    // ...
} MultiplayerGame;

// P1 控制:WASD
// P2 控制:方向键

15.3 性能优化

1. 减少屏幕刷新

// 只刷新变化的部分
void render_delta(Game* g) {
    // 清除旧蛇位置
    draw_char(old_x, old_y, ' ');
    
    // 绘制新位置
    draw_char(new_x, new_y, 'O');
    
    // 只刷新小区域
    refresh();
}

2. 对象池

// 预分配蛇身段,避免频繁 malloc
Segment segment_pool[100];
int pool_index = 0;

Segment* alloc_segment(void) {
    if (pool_index < 100) {
        return &segment_pool[pool_index++];
    }
    return malloc(sizeof(Segment));
}

15.4 代码质量

使用静态分析工具

# cppcheck 检查代码问题
cppcheck --enable=all src/

# clang-tidy
clang-tidy src/*.c

单元测试

// test_snake.c
#include <assert.h>

void test_snake_create(void) {
    Snake* s = snake_create(10, 10);
    assert(s != NULL);
    assert(s->length == 1);
    assert(s->head->x == 10);
    snake_destroy(s);
}

int main(void) {
    test_snake_create();
    printf("All tests passed!\n");
    return 0;
}

15.5 打包发布

创建 Release

# 清理
make clean

# 编译 Release 版本
make release

# 打包
tar -czvf snake_game_v1.0.tar.gz \
    snake_game \
    README.md \
    LICENSE

# 上传到 GitHub Releases

添加安装脚本

#!/bin/bash
# install.sh

echo "Installing Snake Game..."
cp snake_game /usr/local/bin/
chmod +x /usr/local/bin/snake_game
echo "Installation complete!"

15.6 下一步学习

C 语言进阶

游戏开发

其他语言


15.7 资源推荐

书籍

网站

项目灵感


🎉 恭喜毕业!

你已经完成了从零开始实现贪吃蛇游戏的完整教程!

你学到了:

现在你可以:


📝 毕业项目

完成以下挑战来证明你的技能:

  1. 基础 - 完善当前贪吃蛇游戏
  2. 进阶 - 添加至少 3 个扩展功能
  3. 大师 - 从零实现另一个经典游戏(俄罗斯方块/打砖块)

祝你编程愉快!🐍🎮

返回目录