恭喜你完成了教程!现在让我们完善游戏并添加新功能。
确保你的项目包含:
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;
typedef enum {
POWER_SPEED_UP, // 加速
POWER_SPEED_DOWN, // 减速
POWER_SHIELD, // 护盾
POWER_GHOST, // 穿墙
POWER_SHRINK // 缩短
} PowerUp;
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"},
};
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;
}
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) {
// 显示排行榜
}
#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);
}
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;
}
typedef struct {
Snake snake1;
Snake snake2;
// ...
} MultiplayerGame;
// P1 控制:WASD
// P2 控制:方向键
// 只刷新变化的部分
void render_delta(Game* g) {
// 清除旧蛇位置
draw_char(old_x, old_y, ' ');
// 绘制新位置
draw_char(new_x, new_y, 'O');
// 只刷新小区域
refresh();
}
// 预分配蛇身段,避免频繁 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));
}
# 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;
}
# 清理
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!"
你已经完成了从零开始实现贪吃蛇游戏的完整教程!
你学到了:
现在你可以:
完成以下挑战来证明你的技能:
祝你编程愉快!🐍🎮