我应该如何在面向对象的范例中建模寻路

时间:2012-11-28 17:07:31

标签: oop path-finding

我的目标是实施一个(非常简单的)策略游戏。

目前,我将从地图和两个角色(我希望地形以不同方式影响它们)开始尝试寻路

问题是我在面向对象设计方面经验很少或根本没有。我之前使用过C ++类,但它非常简单:例如,使用一组方法实现的类Graph,使用方法AStar。我没有想到“几个球员”的概念。

我想到了以下元素/类:游戏,地图和角色。最终是一个Pathfinder类。

第一个问题:角色的位置是游戏应该知道的?地图?还是每个角色?

(我认为游戏应该)

第二个问题:对于“findPath”方法,它会是一个好的选择吗?

  • 游戏?

  • 寻路算法应该是Map的方法吗?像map.findPath(character,srcpos,dstpos)一样的东西

  • 在Character类中?做character1.findPath(map,srcpos,dstpos)更有意义

  • 如果我添加了一个Pathfinder类,它必须构建自己的地图表示以确定最短路径。在这之前,它会“询问”地图地形如何影响每个玩家。

(我更喜欢后者)

似乎是辅助结构的构造(并要求地图)应用,比方说,A *是我无法避免的。

2 个答案:

答案 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类中替换它。