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



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

目前,我将从地图和两个字符开始(我希望地形对它们的影响不同),以试验寻路

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

我想到了以下元素/类:游戏、地图和角色。最终成为一个开拓者类。

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

(我认为游戏应该)

第二个问题:对于"findPath"方法,哪里是好的选择?

  • 游戏?

  • 路径查找算法应该是Map的一种方法吗?类似map.findPath(字符、srcpos、dstpos)

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

  • 如果我添加了一个Pathfinder类,它将不得不构建自己的地图表示,以便确定最短路径。在这样做之前,它必须"询问"地图地形对每个玩家的影响。

(我更喜欢后者)

似乎建造一个辅助结构(并询问地图)来应用,比方说,A*是我无法避免的事情。

使事物面向对象不是目标,而是在有意义时使用的工具。C++是一种有很多功能的语言,你可以很容易地淹没自己,所以我的建议是保持简单易行。

这可能意味着有时将数据和逻辑紧密地放在一起,有时则完全分离。

第一个问题:我最初的反应是角色应该知道自己的位置。但你如何用数据来表示它取决于你打算如何使用它,所以游戏、角色和地图都需要知道角色在哪里

第二个问题:这取决于Map类是什么。它是一个表示映射本身的对象,具有向程序的其他部分公开的必要功能,还是一个用于映射的简单数据表示的函数工具箱?

如果Map类表示地图,那么它应该具有Pathfinder类在其上工作所需的功能(寻路算法需要从地图中派生一些额外的数据,可能是临时的,也可能是持久的)。

如果Map类不表示映射,你可以在其中放置寻路功能。我认为在这种情况下,它应该属于那里。如果路径查找代码导致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类中替换它。

最新更新