2015-06-27 8 views
1

Я создаю систему инвентаризации text-rpg, но я не уверен, как правильно создавать оборудованные предметы. Например, я могу экипировать предмет, который находится в инвентаре игрока, но я не могу определить, какой предмет (Sword, Shield, Gloves или что-то еще), потому что предмет должен быть экипирован в нужном месте (Шлем на голове, меч в руки и т. д.). Есть ли способ сделать это?C++ Text-RPG Система инвентаризации

#include <iostream> 
#include <vector> 
#include <Windows.h> 
#include <string> 

using namespace std; 

void Red() 
{ 
    SetConsoleTextAttribute 
    (GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY); 
} //Intensive red console text color. 

void Green() 
{ 
    SetConsoleTextAttribute 
     (GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); 
} //Intensive green console text color. 

void Normal() 
{ 
    SetConsoleTextAttribute 
     (GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); 
} //Default console text color. 

struct Item{ 
    string name; //Item name. 
    int price; //Item price. 
    int purpose; // 0 - Head, 1 - Neck, 2 - Torso, 3 - Hands, 4 - Legs, 5 - Feets. 
    int attribute; //Attack, Defense... 
}; 

int main() 
{ 
    //Isn't the smartest way to do so... 
    Item Sword{ 
     "Sword", //This item name is 'Short Sword'. 
     87, //Cost 87 gold pieces. 
     3, //Use this item with hands. :D. 
     10 //+10 attack. 
    }; 

    string input; // input is for player commands. 
    vector<string> Equipment = { "<Empty>", "<Empty>", "<Empty>", "<Empty>", "<Empty>","<Empty>" }; //Current equipment. 
    vector<string> Inventory = {Sword.name}; //Player Inventory. 
    string InventorySlots[] = { "Head", "Neck", "Torso", "Hands", "Legs", "Feets" }; //Player parts where items can be equiped. 

    while (true){ 
     cin >> input; 
     if (input == "equipment"){ 
      for (int i = 0; i < 6; i++){ 
       Normal(); 
       cout << InventorySlots[i]; 
       if (Equipment[i] == "<Empty>") 
        Red(); 
       cout << " " << Equipment[i] << endl << endl; 
      } 
      Normal(); 
     } 

     if (input == "equip"){ 
      cout << "What do you want to equip? "; 
      cin >> input; 
      for (int i = 0; i < Inventory.size(); i++){ 
       //Search for item player want to equip and equip it in the right place. 
       if (input == Inventory[i]){ 
        //Inventory[i] = input; 
        //But how to identify what kind of item it is? 
        cout << "Successfully equiped!" << endl; 
       } 
      } 
     } 

     if(input == "inventory"){ 
      for (int i = 0; i < Inventory.size(); i++){ 
       cout << "______________________________________________________________" << endl; 
       cout << "| " << Inventory[i] << endl; 
       cout << "| Carried items " << Inventory.size() << "/" << 20 << endl; 
       cout << "|_____________________________________________________________" << endl; 
      } 
     } 

    } 
    system("PAUSE"); // or 'cin.get()' 
    return 0; 
} 
+1

Добавить эту информацию в свой пункте структуру ... – oobivat

ответ

2

Существует множество возможностей для этого.

Простой подход

Во-первых, вы должны держать инвентаризацию предметов, а не строк:

vector<Item> Inventory = {Sword, Helmet}; //Player Inventory. 

Тогда вы должны seacrh с помощью Inventroy[i].name и использовать inventory[i].purpose, чтобы найти правильный слот:

 for(int i = 0; i < Inventory.size(); i++){ 
      //Search for item player want to equip and equip it in the right place. 
      if(input == Inventory[i].name){ 
       Equipment[Inventory[i].purpose] = Inventory[i].name; 
       cout << "Successfully equiped!" << endl; 
      } 
     } 

Незначительные улучшения

Обратите внимание, что для следующего улучшения вашей игры вы столкнетесь с аналогичной проблемой с вашим оборудованием: поскольку это вектор строк, вы не получите прямого доступа к свойствам элемента, например, эффект от атаки или защита оборудования.

Поэтому вы должны также сделать Equipment в vector<Item>:

Item Empty{"<Empty>", 0, 0, 0}; 
vector<Item> Equipment{6, Empty}; //Current equipment: 6 x Empty. 
... 

Вы также могли бы рассмотреть возможность сделать инвентарь map<string, Item> для легкого доступа по имени

+0

Спасибо. Еще один вопрос: как удалить элемент из инвентаря? Например, если игрок хочет отбросить элемент или предмет экипирован (если экипирован, элемент не должен появляться в инвентаре) –

+1

Ну, в этом случае вы могли бы [стереть] (http://www.cplusplus.com/reference/vector/vector/erase /) используемый элемент из инвентаря. В зависимости от правил игры вы также можете вернуть предыдущий элемент слота в инвентарь, когда экипируете слот другим. – Christophe

+0

Я попробовал _'Inventory [i] .name.erase() '_, но он удаляет только имя элемента из инвентаря игрока, а не весь элемент. –

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

  • Нет связанных вопросов^_^