我正在用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
如果你发现任何坏习惯,我真的很感激让我知道。
答案 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快速检查项目是否存在。