使用C语言遵循Betty风格开发贪吃蛇游戏,如何避免全局变量?
解决Betty规范下贪吃蛇的全局变量替代方案
- 用结构体封装所有游戏状态
把原来分散的全局变量(蛇的坐标、长度、食物位置、游戏运行状态等)打包成一个结构体,统一管理:
typedef struct { int snake_x[100]; int snake_y[100]; int snake_length; int food_x; int food_y; int game_running; // 其他游戏相关变量 } GameState;
之后所有需要操作游戏状态的函数,都通过传递这个结构体的指针来访问数据,比如:
void move_snake(GameState *state, int dir) { // 修改state中的蛇位置、长度等数据 }
这样既符合Betty的规范,又避免了零散传递多个参数的繁琐。
替换头文件中的全局变量声明
之前在头文件里声明全局变量的做法直接废弃,改成在公共头文件(比如game.h)里定义GameState结构体。各个源文件包含这个头文件后,在主函数中初始化一个GameState实例,再将其指针传递给各个模块的函数,实现状态共享。别被“传参数是不良实践”误导
Betty禁止全局变量,本质是因为全局变量会让代码耦合度高、调试困难、可维护性差。而传递结构体指针是模块化C编程的标准操作:它清晰地标明了函数依赖的数据,让逻辑更透明,也更容易做单元测试。这不仅不是不良实践,反而比全局变量的写法更健壮。小提示:简化重复传参
如果某几个函数都需要频繁访问GameState,可以把这些函数归类到同一个源文件中,用静态函数封装内部逻辑,但核心依然是通过指针传递状态,绝对不要用全局变量绕开规范。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

