2015-06-27 44 views
1

我正在构建文本-RPG库存系统,但我不确定如何正确创建equipable项目。 例如,我可以装备在玩家库存中的物品,但我不能识别什么样的物品(剑,盾,手套或其他物品),因为物品应该装在适当的地方(头盔,剑在手等)。 有没有办法做到这一点?C++文本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. 

然后,你必须使用Inventroy[i].name到seacrh和使用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; 
      } 
     } 

稍作改进

请注意,对于您的游戏的下一次改进,您会遇到类似的问题,因为它是一个字符串矢量,您不会直接访问该项目的属性,例如对攻击的影响或防守装备。

因此你也应该做一个Equipmentvector<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()'_,但它只从玩家库存中删除物品名称,而不是整个物品。 –