Использование структур для хранения всех моих переменных в игре на C?

#c #function #variables #struct

#c #функция #переменные #структура

Вопрос:

В настоящее время я занимаюсь более продвинутым программированием на C с SDL, и у меня было много проблем с функциями и общей структурой программы.

Моя главная проблема в том, что игры требуют большого количества переменных, к которым большинству функций требуется доступ и манипулирование. Я не хочу создавать кучу глобальных переменных, но я также не хочу передавать каждую соответствующую переменную каждый раз, когда я обращаюсь к функции.

Чтобы решить эту проблему, я создал игровую структуру в верхней части программы. Эта структура содержит все игровые переменные, которые необходимо передавать, например текстуры и местоположения. Я объявляю экземпляр этой структуры в начале моей основной функции, инициализирую все переменные внутри, а затем продолжаю передавать экземпляр struct различным функциям.

Мой вопрос: хорошее ли это решение? Возможно, есть лучший, более традиционный способ справиться с этим; если да, пожалуйста, объясните.

Это скорее теоретический вопрос и не имеет под собой оснований в каком-либо конкретном коде, который я могу вам показать.

Комментарии:

1. Возможно, это лучше всего спросить на softwareengineering.stackexchange.com если нет кода для отображения.

2. Это немного лучше, чем иметь все переменные глобальными — теперь, например, вы могли бы запускать две игры в одном процессе! — но не намного. По сути, вы переходите от отсутствия реальной структуры программы вообще к антишаблону объекта бога . Однако сделанные вами наблюдения — хорошее начало. Основная проблема, с которой вы сталкиваетесь, — это видимость; Если весь ваш код может постоянно касаться всего вашего состояния, вы получите гигантский беспорядок. Убедиться, что ваш код может получить доступ к тому, что ему нужно, и только к этому, — довольно сложная инженерная задача.

3. Это разумный подход. В зависимости от обстоятельств, основной альтернативой являются наборы функций, которые управляют связанными наборами игровых ресурсов, которые вы можете вызывать для поиска или изменения значений. Ее преимущества в том, что при изменении одного из зависимых модулей нижнего уровня требуется меньше кода для перекомпиляции. Насколько серьезна проблема, зависит от того, сколько информации вы встраиваете непосредственно в свою основную Game структуру, а сколько скрыто за непрозрачными указателями в структуре. Это в некоторой степени определяет, сколько раз вам придется перекомпилировать все, а не только те части, которые изменяются.

Ответ №1:

Это вроде как лучше… но это вопрос мнения. Во-первых, это выглядит приятнее. Во-вторых, если вы умны, вы можете сбросить всю структуру игры в файл для последующей загрузки. (Я не знаю как, но я знаю, что это можно сделать)

Кроме того, вы должны объявить структуру на верхнем уровне:

 /* 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: %dn",GAME.health,GAME.xp_level);
    takeHit();
    printf("Health: %d | Level: %dn",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];
  

Комментарии:

1. но разве это не то же самое, что объявлять кучу глобальных переменных? поправьте меня, если я ошибаюсь

2. Да, но это немного приятнее.