#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. Да, но это немного приятнее.