gpt4 book ai didi

c++ - 二维 vector ,重叠和数组中不同类型的对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:25 26 4
gpt4 key购买 nike

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

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

问题是对象可能重叠,对象可能不是同一类型或类。

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

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

vector< vector <Square> >;

指针将指向不同的 vector 数组,每个 vector 数组包含特定的对象。

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

有些对象必须是类,但我可以使游戏板类中的所有对象类型都继承自一个主类。但最终对象完全不同,所以我不确定这是否有意义的差异。

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

我非常感谢任何帮助、摘要或见解。

注意事项:创建后板的大小不会改变。物体必须能够在棋盘上四处移动。

最佳答案

这是我的建议。

#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 指针删除内容。
  • 如果需要区分游戏对象,请使用返回“type”值的虚方法。
  • 只要没有需要使用它,就不要使用该类型值,而是使用其他做有意义事情的虚拟方法。使用类型值(然后通常转换为子类型)应该被视为最后的手段。例如(自由发明关于你的游戏的细节):
    • 每个对象都有一个名称,当您将光标放在它上面时会显示该名称。这在 name() 中返回。
    • 游戏中的事件可能会“损坏”一个对象。这仅适用于某些类型的对象,因此 damaged() 的默认操作是什么都不做。对损坏做出响应的 Foo 对象用实际操作覆盖它。
  • 无论您如何实现该板,请将您的确切实现隐藏在一个类中。 (不要把我的代码当作你不应该为此使用 vector<> 的指示,这绝对没问题。我个人稍微偏向于 vector< vector<>> 这里,但这也不是太糟糕。)
  • 为游戏对象使用共享指针。
    • Boost 具有出色且广泛使用的实现。
    • 如果您不能使用共享指针,请在 Square 类之外控制游戏对象的生命周期(例如,在 Board 类中所有游戏对象的主列表中),然后在 Square 类中使用原始指针。
    • 如果您确实使用了共享指针,而且这是您第一次使用,请先简要阅读一下。它们不是魔术,您需要注意某些事情,例如循环引用。
  • 根据您的需要,您可能希望在 GameObject 中有一个到正方形或正方形坐标的“反向链接”,其中包含指向该 GameObject 的指针。这将使您能够轻松地从板上移除对象并四处移动它们。

关于c++ - 二维 vector ,重叠和数组中不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com