3

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

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

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

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

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

(我认为游戏应该)

第二个问题:“findPath”方法在哪里是一个不错的选择?

  • 游戏?

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

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

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

(我更喜欢后者)

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

4

2 回答 2

2

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

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

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

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

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

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

于 2012-11-28T18:04:41.587 回答
1

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

第二个问题:逻辑上寻找路径不能成为 Map 的一部分。那么您将违反OOP 原则之一,即Single Responsibility

根据我的说法,您应该创建 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-11-29T09:33:47.857 回答