用 Betty 风格用 C 语言编写游戏时如何避免使用全局变量?

How to avoid using global variables when coding a game in C with the betty style?

提问人:Johnny 提问时间:6/2/2023 最后编辑:Johnny 更新时间:6/4/2023 访问量:150

问:

我是编码新手,从C开始。我正在尝试重现著名的贪吃蛇游戏,目前正在使用 betty 风格的编码。显然,全局变量是不允许的,到目前为止,我想到的是将我的变量作为函数参数传递,但我不喜欢它,因为这似乎是一种相当糟糕的编码实践。我该怎么做?

我将不同源文件中使用的变量声明为头文件中的全局变量。到目前为止,它的工作原理,但贝蒂不允许使用全局变量

C 全局变量 函数参数

评论

0赞 Joel 6/2/2023
如果你的全局变量是常量,你可以使用它们。否则,你可以有这样的函数:,但是这可能只是更糟糕的风格,但可能会被 Betty 接受。或者,您可以将它们保存到文件中并一直对其进行读/写。#defineint* globalValue(void) { static int value = 0; return &value; }
1赞 Andreas Wenzel 6/2/2023
这些全局变量是否代表游戏状态,仅代表其他任何内容?如果是这种情况,那么您可以创建一个由表示游戏状态的所有变量组成的变量。然后,您可以在函数中创建一个实例,并将指向该实例的指针传递给需要它的所有函数。struct game_statestructmainstruct
0赞 Johnny 6/2/2023
我实际上已将它们定义为结构,并且它运行良好。谢谢。
0赞 Lundin 6/2/2023
“但我不喜欢它,因为它似乎是一种相当糟糕的编码实践”是什么让你突然这么认为?这通常被认为是很好的做法。然而,关键是每个代码模块都不应该关心它指定的任务。
0赞 Community 6/3/2023
请编辑问题,将其限制为具有足够详细信息的特定问题,以确定适当的答案。

答:

1赞 Allan Wind 6/4/2023 #1

纯函数,即结果仅取决于其参数的函数(以及相同的输入结果在相同的输出中),导致程序易于推理和扩展测试。这是一件值得努力的好事。保持论点数量合理通常被认为是很好的风格。为此,您可以将大型函数分解为执行一件事的较小函数,并将相关变量分组到可以轻松传递的 (s) 中:struct

enum direction { UP, RIGHT, DOWN, LEFT };

struct position {
   unsigned x;
   unsigned y;
};

struct state {
  enum direction dir;
  struct position pos;
};

void update(struct state *s) {
   if(s->dir == UP)
        s->pos.y--;
   // ...
}

另一种选择可能是创建全局变量,以便只能在给定文件中访问它们。static

如果你是混沌邪恶的类型,那么比全局变量更糟糕的是外部状态:文件、数据库或外部服务。您的数据的生存期现在超过了程序,并且您的数据可能会被可能与您的程序同时访问的其他程序访问。