在C游戏中使用Structs保存所有变量?

在C游戏中使用Structs保存所有变量?,c,function,variables,struct,C,Function,Variables,Struct,我目前正在使用SDL进行一些更高级的C编程,我在函数和整体程序结构方面遇到了很多问题 我的主要问题是,游戏需要很多变量,大多数函数都需要访问和操作这些变量。我不想创建一堆全局变量,但我也不想每次访问函数时都传递每个相关变量 为了解决这个问题,我在程序顶部创建了一个游戏结构。此结构包含所有需要传递的游戏变量,如纹理和位置。我在主函数的开头声明该结构的一个实例,初始化其中的所有变量,然后继续将该结构实例传递给不同的函数 我的问题是:这是一个好的解决方案吗?也许有更好、更传统的方法来处理这个问题;如果

我目前正在使用SDL进行一些更高级的C编程,我在函数和整体程序结构方面遇到了很多问题

我的主要问题是,游戏需要很多变量,大多数函数都需要访问和操作这些变量。我不想创建一堆全局变量,但我也不想每次访问函数时都传递每个相关变量

为了解决这个问题,我在程序顶部创建了一个游戏结构。此结构包含所有需要传递的游戏变量,如纹理和位置。我在主函数的开头声明该结构的一个实例,初始化其中的所有变量,然后继续将该结构实例传递给不同的函数

我的问题是:这是一个好的解决方案吗?也许有更好、更传统的方法来处理这个问题;如果是,请解释


这更多的是一个理论问题,在我可以向您展示的任何特定代码中都没有基础。

这是一种更好的。。。但这是一个意见问题。首先,它看起来更好。其次,如果你很聪明,你可以将整个游戏结构转储到一个文件中,以便以后加载。(我不知道怎么做,但我知道可以做到)

此外,还应在顶层声明结构:

/* main.c */

typedef struct{
    int health;
    int xp_level;
} game_t;

game_t GAME;

void takeHit(){
    printf("The monster hits you!\n")
    GAME.helath--;
}

main(){
    GAME.health = 42;
    GAME.xp_level = 0;
    printf("Health: %d | Level: %d\n",GAME.health,GAME.xp_level);
    takeHit();
    printf("Health: %d | Level: %d\n",GAME.health,GAME.xp_level);
}

因此,您编写的任何函数都可以访问结构,而无需传递它

您也可以使用Ularn方法:

/* Character.h */

#define NUMBER_ATTRIBUTES 4

#define HP 0    
#define STR 1
#define INT 2
#define WIS 3
/* etc... */

int c[NUMBER_ATTRIBUTES];

这有点好。。。但这是一个意见问题。首先,它看起来更好。其次,如果你很聪明,你可以将整个游戏结构转储到一个文件中,以便以后加载。(我不知道怎么做,但我知道可以做到)

此外,还应在顶层声明结构:

/* main.c */

typedef struct{
    int health;
    int xp_level;
} game_t;

game_t GAME;

void takeHit(){
    printf("The monster hits you!\n")
    GAME.helath--;
}

main(){
    GAME.health = 42;
    GAME.xp_level = 0;
    printf("Health: %d | Level: %d\n",GAME.health,GAME.xp_level);
    takeHit();
    printf("Health: %d | Level: %d\n",GAME.health,GAME.xp_level);
}

因此,您编写的任何函数都可以访问结构,而无需传递它

您也可以使用Ularn方法:

/* Character.h */

#define NUMBER_ATTRIBUTES 4

#define HP 0    
#define STR 1
#define INT 2
#define WIS 3
/* etc... */

int c[NUMBER_ATTRIBUTES];

如果没有代码可以显示,也许最好在softwareengineering.stackexchange.com上问这个问题。这比让所有变量都是全局变量稍微好一点——例如,现在你可以在同一个过程中运行两个游戏但不多。基本上,您正在从根本没有真正的程序结构过渡到。不过,你所做的观察是一个良好的开端。你的基本问题是可见性;如果你所有的代码都能一直触及你所有的状态,你就会陷入一片混乱。确保你的代码能够访问它需要的东西,并且只访问那些东西是一个相当困难的工程挑战。这是一个合理的方法。根据具体情况,主要的替代方案是管理相关游戏资源集的函数集,您可以调用这些函数来查找或更改值。它的优点是,如果您更改一个较低级别的依赖模块,则需要重新编译的代码更少。问题的严重程度取决于您在主
游戏
结构中直接嵌入了多少信息,而在结构中不透明指针后面隐藏了多少信息。这在某种程度上控制了您必须重新编译所有内容的次数,而不是只重新编译更改的部分。如果没有代码可显示,最好在softwareengineering.stackexchange.com上询问这一问题。这比所有变量都是全局变量要好一些-例如,现在您可以在同一个过程中运行两个游戏但不多。基本上,您正在从根本没有真正的程序结构过渡到。不过,你所做的观察是一个良好的开端。你的基本问题是可见性;如果你所有的代码都能一直触及你所有的状态,你就会陷入一片混乱。确保你的代码能够访问它需要的东西,并且只访问那些东西是一个相当困难的工程挑战。这是一个合理的方法。根据具体情况,主要的替代方案是管理相关游戏资源集的函数集,您可以调用这些函数来查找或更改值。它的优点是,如果您更改一个较低级别的依赖模块,则需要重新编译的代码更少。问题的严重程度取决于您在主
游戏
结构中直接嵌入了多少信息,而在结构中不透明指针后面隐藏了多少信息。这在某种程度上控制了您必须重新编译所有内容的次数,而不是只重新编译更改的部分。但这不就是声明一组全局变量吗?如果我错了,请纠正我是的,但这有点好。但这不就是声明一堆全局变量吗?如果我错了,请纠正我是的,但这稍微好一点。