问题背景
我正在制作基本的战舰式衍生游戏,我想继续在C ++中添加功能(无图形)。目前我有一个50 x 75的游戏板,用2D矢量(称为 GameBoard )表示,目前是char类型。我创建了一个游戏板并用'。'设置每个位置。焦炭。当您猜测坐标时,之前猜测的位置标有“ - ”,命中标记为“X”
我参与该计划的地方
我决定修改游戏以启用更多功能。我不是太过分了,但是用伪代码设计草图开始让我更多地思考如何进行升级。
我没有将 GameBoard 作为字符,而是创建一个名为 Block 的类(电路板上的空白区域),它现在将具有ax和y坐标变量,以及一个char变量,可以直观地显示正确的char。 阻止能够保存对象“功能”,该对象分为“功能”的派生类。您可以滚动到最底层,了解有关这些类的更多详细信息。
这是我的类层次结构树的用法:
feature
item vehicle
gold nuke plane
我需要帮助
我基本上有我想要做的大纲/结构设置。现在我只需要一些帮助来启动它以获得连接的一切。我很难确定何时以及如何使用指针。
A。)我应该更改 GameBoard 来保存 Block 类的指针吗?或实际的阻止对象? - 阻止会指向功能或实际的功能对象吗?
B。)如何添加可以为空或给定值的要素变量?我只是将它设置为NULL吗?
C。)我是否需要自定义复制构造函数来交换阻止的功能值?
D。)如果播放器使用阻止,如何从阻止中移除功能对象?
E。)偶尔会在一个阻止上有超过1个功能吗?
F。)如何声明阻止和功能类,以便阻止可以容纳功能并且功能已经从另一个类派生(此帖子中未包含)。
关于我的课程的额外详情
所以GameBoard是存储块的向量。块本质上是板上的各个空间。块包含其位置的坐标,表示它的char以及保存 Feature 对象的可能性,但大多数情况下 Block 不会保留某个功能。 功能源自Block并在游戏中充当奖励奖励。因此功能分支到另外两个派生类,即项目功能或车辆。等等。
当玩家选择坐标时,方法将转到GameBoard上的/ Block中的Block,并首先检查char值是否代表之前未使用过的有效空间。然后它检查此Block for Feature的内容。功能可能为空或包含派生的功能对象。
好的,我的小说结束了。很抱歉写这么多。我认为获得帮助的最佳方式是让帮助者知道发生了什么。请不要回应告诉我“要点到点”。我知道我知道..如果我错过了细节,请告诉我。谢谢!
答案 0 :(得分:1)
我假设你想要保持你的班级结构。在你的抽象点,我建议使用共享和uniqe指针(C ++ 11或Boost)。如果你在指针上非常糟糕,那么学习如何使用uniqe和共享指针,并尝试坚持使用它们。请记住尽可能缩短对象的生命范围。
A。)我应该改变GameBoard来保存Block类的指针吗?还是实际的Block对象? Block会保持指向Feature或实际Feature对象的指针吗?
我希望将这个GameBoard元素保存为不可变的uniqe指针或保留实际的实例。
B。)如何添加可以为空或给定值的Feature变量?我只是将它设置为NULL吗?
您决定将功能保留在Block内 - 好的。如果是这样,请将其作为共享指针。如果没有功能共享指针将为空。
C。)我是否需要自定义复制构造函数来交换Block的功能值?
仅当内部功能中存在动态/异常时。该功能将持有什么?
D。)如果播放器使用它,我如何从Block中删除Feature对象?
如果您使用共享指针,则没有问题。即使在处理上一个功能期间功能发生了变化,当GameBoard不再需要功能时,功能也会正确处理并被销毁。
E。)偶尔会在一个Block上有多于1个功能吗?
你必须问自己这个问题 - 你的游戏是否需要处理这种情况?如果是这样,只需按住功能的共享指针的vector / map / set / array(取决于您的要求)。
F。)如何声明Block和Feature类,以便Block可以保存一个Feature和Feature已经从另一个类派生(本帖子中没有包含)。
我不确定我是否正确理解了这个问题:
class Feature : public GameElement {
/* Feature implementation */
}
class Block {
shared_ptr<Feature> mFeature;
/* Block implementation */
};
它能回答你的问题吗?
答案 1 :(得分:0)
feature
block
是否是一个好主意
feature
的每个实例中使用指向block
的指针,这样如果没有要素,指针就是NULL
。 此指针将指向您案例中基类feature
的指针。我鼓励使用virtual
方法访问各个功能。 feature
用完时,将其删除并将指针设置为NULL。 (块实例中的指针)feature
有block
个,请考虑使用某种数组/指针堆栈。GameBoard
应该包含Block
s的实际实例(不是指针)。我是否需要自定义复制构造函数来交换Block的功能值?
我希望这有助于=)。
答案 2 :(得分:0)
我认为你的GameBoard是GameObject指针的容器是个好主意。您不需要创建一个全新的类并将其称为Block - 所有这些都是隐含的。也不需要跟踪块的坐标,因为它们按顺序排列。 GameObject将是游戏元素层次结构的基类 - 在你的情况下是一个特征,我使用GameObject的原因是因为特征不是很具描述性 - 这个术语过于广泛而且范围很广。
当游戏开始时,您的GameBoard可以由空指针填充,随后由创建并添加到棋盘的实际游戏元素替换。
如果您有动态分配的数据,则只需要实现复制构造函数和赋值运算符。如果没有,编译器将生成一个完美的版本,可以进行原始对象复制。
话虽这么说,你最好不要移动实际的对象实例,并且使用提议的使用指针的方法,你只会移动指针,这更简单,更快。
如果要删除功能,只需删除实际对象并将其在板中的指针设置为null。
如果你实现了父/子关系,你可以在每个块中都有一个GameObjects树,你可以递归遍历那棵树,并按照你的意愿对树元素进行操作。
设计良好的多态层次结构允许您放置几乎任何东西,只要它是从您的基类派生的。