2017-01-31 11 views
0

Хорошо, поэтому я просмотрел весь этот сайт и несколько других (но, пожалуйста, дайте мне знать, если есть ссылка на аналогичный вопрос), и я получаю все подробности о том, как система инвентаризации должно сработать. Мой вопрос исходит из очень широкой, общей перспективы. И это только для консольной текстовой RPG. Как мне структурировать классы для элементов? То, что я имею в виду/до сих пор что-то вроде этого: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

Просто примечание об именовании. Вероятно, стоит использовать более подробные описания. Например, int attackModifier, int uniqueItemId. Создание описательных переменных может сэкономить вам некоторое время, когда вы вернетесь через год и должны отредактировать этот код. В другом случае вам может понадобиться описание элемента, чтобы пользователь мог навешивать элемент и получать имя и данные. – user3853544

+0

@ user3853544 Вот что я на самом деле сделал в коде, который я запускаю. Я просто не хотел набирать этот материал здесь, чтобы сэкономить место. Я даже не знал, что могу сделать описание предмета, так что это полезно и круто. Благодаря! –

+0

Обычно я делаю ограниченное количество элементов и иду с строкой описания. Помимо немного большего или меньшего урона и достижения, меч - это меч, насколько это касается игровой механики. У меня будет другой класс, если меч сделает что-то необычное, как есть души. Вот ответ, который я написал некоторое время назад, который может быть полезен: http://stackoverflow.com/questions/41003408/c-determine-if-class-can-use-an-object-text-rpg-game/41006740# 41006740 – user4581301

ответ

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.

 Смежные вопросы

  • Нет связанных вопросов^_^