2011-10-11 66 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