Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 我应该如何在面向对象的范例中建模寻路_Oop_Path Finding - Fatal编程技术网

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

Oop 我应该如何在面向对象的范例中建模寻路,oop,path-finding,Oop,Path Finding,我的目标是实现一个(非常简单的)策略游戏 目前,我将从地图和两个角色(我希望地形对它们的影响有所不同)开始试验寻路 问题是我在面向对象设计方面几乎没有经验。我以前使用C++类,但它非常简单:例如,使用一组数组实现的类图,用方法AStar。我没有想到“几个玩家”的概念 我想到了以下元素/类别:游戏、地图和角色。最后是一个探路者类 第一个问题:角色的位置是游戏应该知道的?地图?还是每个角色 (我认为游戏应该) 第二个问题:对于“findPath”方法,哪里是一个好的选择 比赛 寻路算法应该是映射的

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

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

问题是我在面向对象设计方面几乎没有经验。我以前使用C++类,但它非常简单:例如,使用一组数组实现的类图,用方法AStar。我没有想到“几个玩家”的概念

我想到了以下元素/类别:游戏、地图和角色。最后是一个探路者类

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

(我认为游戏应该)

第二个问题:对于“findPath”方法,哪里是一个好的选择

  • 比赛

  • 寻路算法应该是映射的一种方法吗?类似于map.findPath(character、srcpos、dstpos)

  • 在角色课上?执行character1.findPath(map、srcpos、dstpos)更有意义

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

(我喜欢后者)


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

使事物面向对象不是目标,而是在有意义时使用的工具。C++是一种语言,它有很多功能,你可以很容易地淹没自己,所以我的建议是让事情简单易懂。 这可能意味着有时将数据和逻辑紧密地放在一起,有时则将其完全分离

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

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

如果Map类表示地图,则它应该具有必要的功能,供Pathfinder类使用(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类中替换它