C++ Text-RPG 库存系统
C++ Text-RPG Inventory system
我正在构建 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;
}
有很多可能性可以做到这一点。
简单的方法
首先,您必须保留物品清单,而不是字符串清单:
vector<Item> Inventory = {Sword, Helmet}; //Player Inventory.
然后您必须使用 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.
...
您还可以考虑将 Inventory 设为 map<string, Item>
以便按名称轻松访问
我正在构建 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;
}
有很多可能性可以做到这一点。
简单的方法
首先,您必须保留物品清单,而不是字符串清单:
vector<Item> Inventory = {Sword, Helmet}; //Player Inventory.
然后您必须使用 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.
...
您还可以考虑将 Inventory 设为 map<string, Item>
以便按名称轻松访问