1

我目前正在考虑如何为某种游戏板制作二维矢量数组。

棋盘应该是矢量,因为大小可以变化,每个“正方形”都应该包含有关该正方形中有哪些对象的信息。

问题是可能存在重叠的对象,并且对象可能不是相同的类型或类。

这是我目前正在考虑的:(伪代码)

struct Square {
    vector<enum type>;
    vector<pointers to objects>;
};

vector< vector <Square> >;

并且指针将指向不同的向量数组,每个向量数组都包含特定的对象。

我不确定如何制作这样的功能,或者这是否可能,我认真地认为这可能比它需要的更复杂..

有些对象必须是类,但我可以在游戏板类中创建从一个主类继承的所有类型的对象。但最终对象是完全不同的,所以我不确定这是否有很大的不同.

我是否只是盲目并且错过了一种更简单的方法来做我想做的事情:二维数组包含不同类型的元素,这些元素也可以在数组中重叠?

我非常感谢任何帮助、片段或见解。

注意:创建后板子大小不会有机会。对象必须能够在棋盘中移动。

4

1 回答 1

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 ];
   }
};

概括:

  • 为可以放置在游戏板上的各种对象提供一个基类。
  • 这种类型的类必须有一个虚拟析构函数,即使它是微不足道的。这是因为您将通过 GameObject 指针删除事物。
  • 如果需要区分游戏对象,请使用返回“类型”值的虚拟方法。
  • 只要没有必要使用它,就不要使用该类型值,而是使用其他可以做有意义事情的虚拟方法。使用类型值(然后通常转换为子类型)应该被视为最后的手段。例如(自由地创造关于你的游戏的细节):
    • 每个对象都有一个名称,当您将光标放在它上面时会显示该名称。这在 name() 中返回。
    • 游戏中的事件可能会导致“损坏”对象。这仅适用于某些类型的对象,因此损坏()的默认操作是什么都不做。响应损坏的 Foo 对象用实际操作覆盖它。
  • 无论您如何实现该板,将您的确切实现隐藏在一个类中。(不要把我的代码当作你不应该为此使用 vector<> 的指示,这绝对没问题。我个人对 vector< vector<> > 有一点个人偏好,但这也不算太糟糕。)
  • 为游戏对象使用共享指针。
    • Boost 具有出色且广泛使用的实现。
    • 如果您不能使用共享指针,请控制 Square 类之外的游戏对象的生命周期(例如,在 Board 类中所有游戏对象的主列表中),然后在 Square 类中使用原始指针。
    • 如果您确实使用了共享指针,而且这是您第一次使用,请先简要阅读它们。它们不是魔术,您需要注意某些事情,例如循环引用。
  • 根据您的需要,您可能希望在 GameObject 中有一个指向包含指向该 GameObject 的指针的正方形或正方形坐标的“反向链接”。这将允许您轻松地从板上移除对象并移动它们。
于 2013-03-24T09:22:27.313 回答