2017-01-31 165 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類。