RPG游戏库存系统

时间:2017-01-31 19:09:03

标签: c++ class console format

好的,所以我浏览了这个网站以及其他一些网站(但如果有类似问题的链接,请告诉我),我会了解库存系统应该如何运作的所有细节。我的问题来自一个非常广泛的,一般性的观点。这仅适用于控制台文本RPG。我应该如何构建项目的类?到目前为止我的想法是:

    // Item.h

    class Item {
    public:
        int Id;
        std::string Name;
        bool CanUse, CanEquip;

        virtual void Use();
    }

    class Weapon: public Item {
    public:
        int Attack, Defense, Health; // stat changes when equipped
        void Use() { std::cout << "Can't use\n"; }

    }

    class Sword: public Weapon {
        // constructor defining stat changes for a sword
        // and to define Name = "Sword"
    }

那么我应该继承那么多次,还是我可以做的更容易?最终,我会有其他各种各样的武器,但在我看来,从Weapon继承它们比我可能做的其他方式更加麻烦?

也许我可以在Weapon中定义一个枚举或结构来定义每种类型的武器?如果我像上面的代码一样,我可能会将virtual void Use();函数移动到类class Consumables: public Item中,因为这些应该是唯一“可用”的东西。

提前感谢愿意提供帮助的任何人。我通过书籍和在线教程自学了所有我知道的东西,所以我很缺乏经验:)

1 个答案:

答案 0 :(得分:0)

所以我最终决定这样做:

enum class ItemType {
    Sword,
    Axe,
    Health_potion,
    Helmet,
    Random
}

Item CreateItem(ItemType Names) {
    Item item;
    if (Names == ItemType::Random)
    {
        Names = (ItemType)Rand0toN1(4); // just a function spitting
    }                                  // out a rand number 0 to N-1
    switch (Names)
    {
        case ItemType::Sword:
            item = Item("Sword", 5, 0, 0, 0, false, true, 6);
            break; // constructor Item(Name, attack, defense, health
        case ItemType::Axe:    // maxhealth, canUse, canEquip, slot)
            item = Item("Axe", 3, 1, 0, 0, false, true, 6);
            break;
        case ItemType::Helmet:
            item = Item("Helmet", 0, 3, 0, 1, false, true, 4);
            break;
        case ItemType::Health_potion:
            item = Item("Health Potion", 0, 7, 0, 0, true, false, 0);
            break;
        default:
            break;

    }
    return item;
}

做这样的事情有什么不对吗?我没有拥有所有这些继承的类,而是拥有了Item类。