2015-08-23 6 views
1

Недавно я работал над системой инвентаризации для текстовой игры, в которой используется глобальный массив для системы инвентаризации и соответствующая функция для чтения истинного или ложного в указанном массиве , Проблема я столкнулся это функция, я использую, чтобы изменить массивКак сделать функцию глобальным глобальным массивом

void playerGet(bool items[], int itemNumber) //this function takes an assigned argument of the array indices variable, and changes that array indices from true, to false. 
{ 
    items[itemNumber] = true; 
} 

только изменяет массив в пределах области видимости функции его размещались в. Массив определен в файле .cpp как это:

void inventoryArray(bool items[]) //This function establishes all the items in the game, the true false statement expresses whether or not the item is in the player's inventory. 
{ 
    items[WEAPON_RELIC_RIFLE] = false; 
    items[WEAPON_SCALPEL] = false; 
    items[MISC_ACTION_FIGURE] = false; 
    items[MISC_FIRE_EXTINGUISHER] = false; 
    items[MISC_LIFE_RAFT] = false; 
} 

и затем объявлен в файле .h, как это:

void inventoryArray(bool items[]); 

перечислений, используемые в массиве определены в файле заголовка, как это:

enum equipment //This declares a list of enums for each item in the game, consumables, not included. 
{ 
    WEAPON_RELIC_RIFLE, // = 0 
    WEAPON_SCALPEL, // = 1 
    MISC_ACTION_FIGURE, // = 2 
    MISC_FIRE_EXTINGUISHER, // = 3 
    MISC_LIFE_RAFT, // = 4 
    MAX_EQUIPMENT 
}; 

функция, которая считывает массив инвентаризации заключается в следующем:

void twoScavengerCombat(bool items[]) 
{ 
    for (int item = 0; item < MAX_EQUIPMENT; ++item) 
    { 
     if (items[item] == true) //if true proceed 
     { 
      switch (item) 
      { 
      case 0: //if array indices identifier = 0, print relic rifle 
       cout << "1: Use the Relic Rifle\n"; 
       break; 
      case 1: 
       cout << "2: Use the Scalpel\n"; 
       break; 
      case 2: 
       break; 
      case 3: 
       cout << "3: Use the Fire Extingusher\n"; 
       break; 
      case 4: 
       cout << "4: Use the Life Raft\n"; 
       break; 
      default: 
       cout << "Error"; 
       break; 
      } 
     } 
     else 
      cout << "Option Unavailible\n"; //if false print Option Unavailible 
    } 

компиляции с массивами и Перечисления заголовки объявили основной файл будет выглядеть следующим образом:

int toolSearch() 
{ 
    bool items[MAX_EQUIPMENT]; 
    inventoryArray(items); 
    playerGet(items, 0); 
} 

void twoScavengerCombat(bool items[])\\ declared in this file, but since its just above here i left it as a forward declaration to save space 

int main() 
{ 
    toolSearch(); 
    twoScavengerCombat(items); 
    return 0; 
} 

В идеале это будет произвести результат: Использовать реликвенную винтовку Опция недоступна Опция недоступна Опция недоступна Опция Недоступна

, но вместо этого она производит 5 вариантов недоступных. Что мне не хватает?

+3

«Элементы», объявленные в 'toolSearch()', являются локальными для этой функции и будут переопределять любой объявленный глобальный массив. –

+0

@JonathanPotter, do вы подразумеваете тот, который объявлен в 'inventoryArray (items)'? Если да, то как вы предлагаете изменить его, потому что я просто попытался удалить эту строку, и результат не изменился. –

+1

@ SawyerAdlaiVierra-Hatch 'inventoryArray' не объявляет никаких массивы.Как бы он ни выглядел, это не так. На самом деле ни один из фрагментов кода не объявляет глобальный массив. – PaulMcKenzie

ответ

1

Вы хотели бы

//bunch of #include<> directives 
bool items[MAX_EQUIPMENT]; 

int toolSearch() 
{ 
    inventoryArray(); 
    playerGet(0); 
} 

void twoScavengerCombat() 
... 
// other functions here 

int main() 
{ 
    toolSearch(); 
    twoScavengerCombat(); 
    return 0; 
} 

bool items[MAX_EQUIPMENT]; Обратите внимание, что не определено в функции. Он выключен на своем собственном месте в верхней части файла в виде простого представления о чем-либо, что указано ниже. Это то, что значит быть глобальным. Любой и каждый могут получить к нему доступ, если они знают, где он находится, или вы сообщаете им, где находится, с заявлением extern. Он создается, когда программа запускается (даже до основного, и это может вызвать некоторую действительно забавную отладку, если логика инициализации переменной ошибочна) и умирает только тогда, когда программа выполняет.

Lightness Races in Orbit delves a bit deeper here, но больше озабочены сделать глобальную переменную выходить за один файл

Там нет необходимости передавать элементы в любой функции, потому что каждый может видеть items Недостатком является то, есть один и только один items так если у вас есть несколько игроков с разными списками элементов, у вас будут проблемы.

Возможно, вы захотите заглянуть в std :: vector (resizable array) и std :: map (что позволит вам искать предметы по имени items["sword"].attackFoe(foe);) и std :: set (что позволяет очень легко увидеть, что у игрока есть (if (items.find("Vorpal Hand Grenade") != items.end()) BlowStuffUp();), а не на поиск по каждому элементу каждый раз.

Смежные вопросы