我的目标是实施一个(非常简单的)策略游戏。
目前,我将从地图和两个角色(我希望地形以不同方式影响它们)开始尝试寻路
问题是我在面向对象设计方面经验很少或根本没有。我之前使用过C ++类,但它非常简单:例如,使用一组方法实现的类Graph,使用方法AStar。我没有想到“几个球员”的概念。
我想到了以下元素/类:游戏,地图和角色。最终是一个Pathfinder类。
第一个问题:角色的位置是游戏应该知道的?地图?还是每个角色?
(我认为游戏应该)
第二个问题:对于“findPath”方法,它会是一个好的选择吗?
游戏?
寻路算法应该是Map的方法吗?像map.findPath(character,srcpos,dstpos)一样的东西
在Character类中?做character1.findPath(map,srcpos,dstpos)更有意义
如果我添加了一个Pathfinder类,它必须构建自己的地图表示以确定最短路径。在这之前,它会“询问”地图地形如何影响每个玩家。
(我更喜欢后者)
似乎是辅助结构的构造(并要求地图)应用,比方说,A *是我无法避免的。
答案 0 :(得分:2)
使事物面向对象不是一个目标,它是一个有意义的工具。 C ++是一种具有许多功能的语言,您可以轻松地将其自行淹没,因此我的建议是保持简单易用。
这可能意味着有时将数据和逻辑紧密地保持在一起,或者在其他时间将数据和逻辑完全分开。
第一个问题:我最初的反应是角色应该知道它的位置。但是你如何用数据表示它取决于你打算如何使用它,所以游戏,角色以及潜在的地图都需要知道角色的位置。
第二个问题:这取决于Map类是什么。它是一个表示地图本身的对象,其中包含暴露给程序其余部分的必要功能,还是一个可以处理地图的简单数据表示的函数工具箱?
如果Map类表示地图,它应该具有为Pathfinder类公开的必要功能(路径查找算法需要从地图中获得一些额外的数据,可能是临时的,可能是持久的)。 / p>
如果Map类不表示地图,则可以在其中添加路径查找功能。我认为在那种情况下属于那里。如果路径查找代码导致Map类变得太大,那么无论如何都应该将它分成它自己的类。
答案 1 :(得分:1)
第一个问题:角色的位置应该是角色本身的一部分(对我来说有道理)。
第二个问题:在逻辑上查找路径不能成为Map的一部分。那么你将违反 OOP原则之一,即单一责任。
据我说,您应该创建PathFinder类。你可以用这种方式设计它
class PathFinder{
PathFinderAlgorithm algorithm;
//other required values according to your design
Path findPath(){
algorithm.apply();
}
//other required methods according to your design
}
PathFinderAlgorithm
是一个界面。
使用此功能,您还可以更改用于查找路径的算法。就像你将来需要找到最长的路径一样,你所要做的就是创建另一个类,它将找到最长的路径并在PathFinder类中替换它。