属性数组?

时间:2014-01-18 12:57:45

标签: c++ arrays console

我正在用c ++制作一个控制台RPG,我有一个问题。我可以创建一个存储角色属性的数组,这个属性会像“Attribute [atr_health] += 200;”一样被更改(我从这个改变了属性的游戏中得到了这个想法“hero.attribute[ATR_HITPOINTS] += 1;”)?此代码是否会“Attribute [atr_health] -= damage;”?

2 个答案:

答案 0 :(得分:1)

我会使用mapunordered_mapenum来访问其值:

#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
  • Getter方法抽象了对底层数据结构的访问,在这种情况下,我们有一个通用方法和多个具体方法。

您可以像这样使用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的武器。缺点是稍微更加冗长的访问。