2016-10-22 22 views
1

我目前正在使用SDL进行一些更高级的C编程,并且我在函数和总体程序结构方面遇到了很多麻烦。使用Structs在C游戏中保存所有变量?

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

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

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

这更多的是一个理论问题,并没有任何特定的代码,我可以告诉你的基础。

+2

也许这可能是最好的softwareengineering.stackexchange.com问,如果没有代码来显示。 – GrandMasterFlush

+1

它比所有变量都是全局的要好 - 现在例如你可以在同一个过程中运行两个游戏! - 但不是太多。你基本上从没有真正的程序结构过渡到[God object anti-pattern](https://en.wikipedia.org/wiki/God_object)。 你正在做的观察是一个好的开始。你有的基本问题是可见性;如果你的所有代码都可以随时触及你所有的状态,那么你就会陷入一片混乱。确保你的代码可以访问它需要的东西,而仅仅这些是一个相当困难的工程挑战。 – Cubic

+0

这是一个合理的方法。根据具体情况,主要选择是管理相关游戏资源集的函数集,您可以调用这些集来查找或更改值。它的优点在于,如果更改其中一个较低级别的依赖模块,则需要重新编译的代码更少。问题的严重程度取决于您直接嵌入主游戏结构中的信息量,以及隐藏在结构中不透明指针背后的多少信息。这在某种程度上控制了您必须重新编译所有内容的次数,而不是仅更改的部分。 –

回答

0

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

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

/* 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); 
} 

$ make main 
$ ./main 
Health: 42 | Level: 0 
The monster hits you! 
Health: 41 | Level: 0 

你写因此,任何功能只需要访问结构而不需要传递它。

您也可以使用Ularn方法:

/* Character.h */ 

#define NUMBER_ATTRIBUTES 4 

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

int c[NUMBER_ATTRIBUTES]; 
+0

但这不就像宣布一堆全局变量一样吗?纠正我,如果我错了 – AceFirebird

+0

是的,但它有点更好。 – Blacksilver