2011-10-11 49 views
0

我在C++中製作了一個非常基礎的遊戲,以獲得語言的一些經驗,並且在進度方面我已經碰到了一些磚牆。C++遊戲的列表結構

我的問題是,當我爲玩家的武器設計一個課程時,我意識到我需要一個列表,因爲在整個遊戲中我只有一定數量的武器。所以我問你,如果你正在設計這個,你會用什麼實現來存儲遊戲中的所有武器?爲什麼?

這是我的代碼到目前爲止的武器。正如你所看到的,我剛開始用「DoubleBlades」開始手動定義它們......(編輯*我忘了注意,玩家應該可以有多個wepaon,並且他們可以拿起更多或下降一些,所以名單可以成長和縮小)

#ifndef __WEAPON_H__ 
#define __WEAPON_H__ 

#include <string> 

class Item 
{ 
    public: 
    Item(const std::string& name) 
    : name(name){ } 
    const std::string& getName(void) const { return name; } 
    int getID(void) const { return this->itemID;} 
    private: 
    std::string name; 
    int itemID; 
}; 

class Weapon 
: public Item 
{ 
    private: 
    int damage; 
    public: 
    Weapon(const std::string& name) 
    : Item(name) { } 
    virtual int getDamage(void) const = 0; 
}; 

class DoubleBlades 
: public Weapon 
{ 
    public: 
    DoubleBlades(int ammo) 
    : Weapon("DoubleBlades") { } 
    virtual int getDamage(void) const { return 12; } 
}; 

#endif 

此外,如果你發現任何不良的習慣,我真的很感激讓我知道。

+1

我想更多地瞭解您需要如何訪問它們。你需要快速打印出所有的武器嗎?你需要「檢查」一個玩家是否擁有某種武器?你是否需要在列表末尾附加一個新的武器?所有這些東西都會影響你的數據結構。 –

+1

以雙下劃線開頭的標識符被保留用於實現。我需要一個腳本自動說這個。 –

+0

您好,感謝您對此的評論,我正在思考一個陣列的問題,因爲每個玩家都會有多種武器可供選擇,所以我想向玩家展示所有當前武器。隨着遊戲的進行,他們可以獲得或放鬆更多的遊戲。謝謝你指出,貓;) – LunixFrog

回答

1

我會使用標準實現(std::list<Item*>),因爲它很容易使用(「開箱即用」),並從標準容器,這似乎是最合適的:

  • 你可能需要快速增加的武器/刪除(所以沒有std::vector或C數組)
  • 你可能不需要對列表的快速搜索支持的特定項目(所以沒有std::map

順便說一句,你需要支持至 在Item類中有一個虛擬析構函數(這是關於C++中基類的一般規則)。

哦,和另一個小問題 - 我認爲Weapon類不需要damage成員變量 - 類不使用它,它有private訪問,所以派生類也不能使用它。

您可能需要使用您的實現dynamic_cast - 一個虛擬的環境,如你可能只需要「安全」的指針從Item*Weapon*鑄造。

+0

謝謝你指出我的錯誤那裏非常感謝Anatolyg :)我認爲我給列表方法一個嘗試,然後看到它的簡單足以實現,看起來對我而言在這個階段是正確的,並且看看有多少事情會崩潰:D謝謝大家的反饋和建議:) – LunixFrog

0

如果列表大小不同,我會使用std :: vector或std :: set。有了這兩個,你會得到使用所有漂亮的stl函數,而不是。如果使用set,則可以更快地對「武器對象」進行排序。如果您想知道添加了某個特定對象的順序,該矢量更有用。

如果他們將擁有固定數量的武器,您仍然可以使用矢量或集合,只要確保您將要使用的確切大小傳遞給構造函數。這將允許進行一些優化,比如分配連續的內存塊(這會加快訪問時間)。

+0

好吧說:)但我不確定它會是這場比賽的最佳靈魂,但是現在我生病的時候會生病。謝謝:) – LunixFrog

1

在非常基本的層面上,您可能不一定需要數據結構。例如,如果你確切知道你需要/可能擁有多少武器等,你可以(浪費)分配一個大小爲n的數組,並將數組中的某些點作爲指向武器的指針(如果你目前有武器,否則爲空)。然後,根據武器索引簡單地施放。但這是一種天真的做法。否則,請參閱Mike上面關於原始帖子的評論。

+0

我完全同意你的說法,並感謝你的反饋憤怒:) – LunixFrog

0

你可以真正看到std::map, - 考慮像

std::map<std::string, Item*> 

這將允許你通過名稱來訪問項目,這可能是好的語法糖,並允許您快速檢查是否存在一個項目使用count method