【问题标题】:How should I model pathfinding in the object oriented paradigm我应该如何在面向对象范式中建模寻路
【发布时间】:2012-11-28 17:07:30
【问题描述】:

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

目前,我将从地图和两个角色(我希望地形对他们产生不同的影响)开始尝试寻路

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

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

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

(我认为游戏应该)

第二个问题:哪里是“findPath”方法的好选择?

  • 游戏?

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

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

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

(我更喜欢后者)

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

【问题讨论】:

    标签: oop path-finding


    【解决方案1】:

    使事物面向对象不是目标,它是在有意义时使用的工具。 C++ 是一门具有很多功能的语言,您可以轻松地淹没自己,所以我的建议是让事情变得简单易行。

    这可能意味着有时将数据和逻辑紧密结合在一起,或者有时将其完全分开。

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

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

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

    如果 Map 类不代表地图,您可以将寻路功能放入其中。我认为在那种情况下它应该属于那里。如果寻路代码导致 Map 类变得太大,无论如何都应该将其分离到自己的类中。

    【讨论】:

      【解决方案2】:

      第一个问题:角色的位置对我来说应该是角色本身的一部分(这样才有意义)。

      第二个问题:逻辑上查找路径不能是 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 类中替换它。

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        相关资源
        最近更新 更多