列出c ++游戏的结构

时间:2011-10-11 21:19:26

标签: 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

如果你发现任何坏习惯,我真的很感激让我知道。

4 个答案:

答案 0 :(得分:1)

在最基本的层面上,您可能不一定需要数据结构。例如,如果你确切地知道你需要/可能有多少武器等,你可以(浪费地)分配一个大小为n的数组,并在数组中有一些点作为武器的指针(如果你现在有这个武器,否则为NULL)。然后,根据武器指数简单地施放。但这是一种天真的做法。否则,请参阅Mike在原帖上的评论。

答案 1 :(得分:1)

我会使用标准实现(std::list<Item*>),因为它易于使用(“开箱即用”),并且在标准容器之外,它似乎是最合适的:

  • 你可能需要支持快速添加/删除武器(所以没有std::vector或C阵列)
  • 您可能不需要支持快速搜索特定项目的列表(所以没有std::map

BTW你需要在Item类中有一个虚拟析构函数(这是c ++基类的一般规则)。

哦,另一个小问题 - 我认为Weapon类不需要damage成员变量 - 该类不使用它并且它具有private访问权限,所以派生类也不能使用它。

您可能必须在实施中使用dynamic_cast - 像您这样的虚拟环境可能需要“安全”地将指针从Item*转换为Weapon*

答案 2 :(得分:0)

如果列表的大小不同,我会使用std :: vector或std :: set。有了这两个,你就可以使用所有不错的stl函数了。如果使用set,则可以更快地对“武器对象”进行排序。如果您想知道添加粒子对象的顺序,矢量会更有用。

如果他们将拥有固定数量的武器,你仍然可以使用向量或集合,只需确保将你要使用的确切大小传递给构造函数。这将允许一些优化,例如分配连续的内存块(这会加快访问时间)。

答案 3 :(得分:0)

您可能实际看std::map, - 考虑类似

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

这将允许您按名称访问项目,这可能是很好的语法糖,并允许您使用count method快速检查项目是否存在。