我正在用c ++制作一个控制台RPG,我有一个问题。我可以创建一个存储角色属性的数组,这个属性会像“Attribute [atr_health] += 200;
”一样被更改(我从这个改变了属性的游戏中得到了这个想法“hero.attribute[ATR_HITPOINTS] += 1;
”)?此代码是否会“Attribute [atr_health] -= damage;
”?
答案 0 :(得分:1)
我会使用map
或unordered_map
和enum
来访问其值:
#include <map>
#include <string>
enum Attrs {DAMAGE, LIFE, ARMOUR};
class Dude
{
private:
map<int, int> attrs;
//You can use a string map instead
//map<string, int> attrs;
public:
Dude()
{
attrs[DAMAGE] = 10;
//attrs["DAMAGE"] = 10;
attrs[LIFE] = 10;
//attrs["LIFE"] = 10;
attrs[ARMOUR] = 5;
//attrs["ARMOUR"] = 10;
}
}
这样的事情可能有用。
答案 1 :(得分:0)
你应该读一下类/结构。
类是一种在单个对象中将各种相关值捆绑在一起的简洁方法,并提供对这些值的抽象访问。
在您的案例中看起来如何:
enum class Attribute
{
Health, Dexterity
}
class Character
{
std::map<Attribute, unsigned int> attributes;
public:
unsigned int GetAttribute(Attribute type) { return attributes[type]; }
unsigned int GetHealth() { return GetAttribute(Attribute::Health); }
unsigned int GetDexterity() { return GetAttribute(Attribute::Dexterity); }
}
如你所见,我在这里介绍了几种结构:
enum class
是强类型枚举std::map
包含不同键的值,它基本上将key
映射到value
您可以像这样使用Character
类:
Character myCharacter;
unsigned int health = myCharacter.GetHealth(); // usign the concrete getter
unsigned int dexterity = myCharacter.GetAttribute(Attribute::Dexterity); // using the generic getter
在示例中,我只实现了getter,setter看起来像这样:
void SetAttribute(Attribute type, unsigned int value)
{
attributes[type] = value;
}
更高级的实现,可以在Attributes
类中抽象这些值(属性)(在这种情况下,我们只需要重命名我们的类,因为它不包含任何与属性相关的字符相关信息)。这种方法的优点是,该类可以重复使用,例如具有属性boni的武器。缺点是稍微更加冗长的访问。