我目前正在思考如何为某种游戏板制作2D矢量数组。
棋盘应该是向量,因为大小可以变化,每个“正方形”应该包含有关该方块中的对象的信息。
问题是可能存在重叠的对象,并且对象可能不是同一类型或类。
这就是我目前正在考虑的事项:(伪代码)
struct Square {
vector<enum type>;
vector<pointers to objects>;
};
vector< vector <Square> >;
指针指向不同的矢量数组,每个数组都保存特定的对象。
我不确定如何制作这样的功能,或者如果这是可能的,我认真考虑这可能会更复杂,然后需要...
有些对象必须是类,但是我可以在游戏板类中创建从一个主类继承的所有类型的对象。但最后对象是完全不同的所以我不确定这是否有多少差异。
我是否只是盲目而且错过了一种更简单的方法来做我正在尝试做的事情:2D数组包含不同类型的元素,这些元素也可以在数组中重叠?
我非常感谢任何帮助,片段或洞察力。
注意: 创建后,棋盘大小不会有机会。 物体必须能够在棋盘中移动。
答案 0 :(得分:1)
这是我的建议。
#include <boost/shared_ptr.hpp>
class GameObject {
public:
virtual ~GameObject() {}
enum Type {
FOO,
BAR
};
virtual Type type() const = 0;
virtual std::string name() const = 0;
virtual void damaged() {}
};
class FooObject : public GameObject {
public:
Type type() const { return FOO; }
std::string name() const { return "Foo object"; }
void damaged() {
std::cout << "Foo was damaged!" << std::endl;
}
};
class BarObject : public GameObject {
public:
Type type() const { return BAR; }
std::string name() const { return "Bar object"; }
// Bar object doesn't respond to damage: no need to override damaged()
};
class Square {
std::vector<boost::shared_ptr<GameObject> > objects;
};
class Board {
// Details of the implementation here not important, but there
// should be a class to hide them.
Square* squares;
int width, height;
Board(int width, int height) :
squares ( new Square[ width * height ] ),
width ( width ),
height ( height )
{
}
~Board() {
delete [] squares;
}
Square& square(int x, int y) {
if( x < 0 || x >= width || y < 0 || y >= height ) {
throw std::logic_error( "accessed square out of bounds" );
}
return squares[ x + width * y ];
}
};
要点: