我正在使用OpenGL(加上GLUT和GLUI)实现一个简单的棋盘游戏(突破)。
我正在考虑实现一个Board
类,它将vector<vector<Cell> >
作为其属性之一。 Cell
代表游戏板中的空间。它可以包含GameObject
。 GameObject
将是一个纯粹的抽象类。例如,它要求其衍生类实现render()
。可能的派生类将是:
Blank
,代表一个空白区域Pawn
,代表一个棋子(突破中唯一可能的部分)首先渲染棋盘,然后迭代每个Cell
,获取其内容并为每个棋子调用render()
来渲染棋盘。
我能想到实现这一目标的唯一可能方法是让GameObject
Cell
指针board[y][x].getContents()->render()
,其中getContents()
返回GameObject*
)
这是最好的方法吗?这是指针的适当用法吗?
答案 0 :(得分:3)
让我将评论推广到答案中。这并不意味着它在任何意义上都是完整的,只是这允许我拼出一些代码示例。我原来的评论:
没关系,虽然您可能会使用
std::unique_ptr<GameObject>
或std::shared_ptr<GameObject>
做得更好,这样您就不会因手动生命周期管理问题而迷失方向。最后,一个平坦的1-D阵列如何大步进入?
以下是我如何解决这个问题:
#include <vector>
#include <memory>
struct GameObject { virtual void render() const = 0; virtual ~GameObject() { } };
class Cell
{
std::unique_ptr<GameObject> m_go;
public:
void render() const { m_go->render(); }
Cell() : m_go(new BlankCell) { }
// more functions to reassign the cell value etc.
};
class Board
{
std::vector<Cell> m_board;
std::size_t m_length;
public:
Board(std::size_t length) : m_board(length * length), m_length(length) { }
Cell & cell(std::size_t i, std::size_t j) { return m_board(j + i * m_length); }
Cell const & cell(std::size_t i, std::size_t j) const { return const_cast<Board*>(this)->cell(i, j); }
// more...
}
答案 1 :(得分:2)
是
另外,也许你应该为你的细胞使用另一个容器(某种矩阵左右)