2011-12-30 207 views
5

我正在设计一款游戏,但我无法完全理解继承结构。我通常比较擅长,但这只是有太多的重叠,我不能全部决定。游戏的继承/界面设计

我正在寻找模型帆船 - 想想帆的年龄。因此大概所有的东西都会扩展一个Vessel类。

有几种类型的船只风格:划船(厨房,独木舟),方形钻机,前后钻机,具有不同的行为。其中每一个都进一步细分为其他几种类型。我无法决定这是否应该是Vessel的一系列界面或扩展。还要注意,可能会有一些交叉(一艘船可能是划船和方形装备),这使我想到接口?

船舶也有不同的行为:商船,战争的人,私人,海盗。我真的不能确定这应该是一个接口还是另一个类的扩展。然而,在这种情况下没有交叉类型。

最后有个别船只可以有几种行为。商人可能在车队(自卫)或独立(逃跑)。战争的人几乎总是会攻击,除非严重失控......但可以在舰队,中队或独立工作。私人和海盗只会在弱者身上发作 - 通常是独立的,但偶尔会成对出现。我假设这也应该是一个接口?

我的大问题是每种风格的船只(护卫舰,战列舰等)都可以完成这些角色中的任何一个,所以我不能构建一个简单的坚实的继承结构。护卫舰不能扩大人为战争,因为有些人是私人。 Sloop不能扩大正方形操纵,因为有些是前后操纵的。 etcetc。

任何想法,将不胜感激,我有点松散的结局。 谢谢

+1

我头脑中浮现的两个想法是“基于组件的设计”和“策略模式”。就个别船舶的不同行为而言,这绝对是对我的战略模式 - 每艘船都在使用各种不同的策略之一。参见维基百科:http://en.wikipedia.org/wiki/Strategy_pattern – 2011-12-30 20:20:23

+0

一艘船在运行时可能从商船驶向**,所以接口不适用于这种动态行为。 – 2011-12-30 20:25:06

+0

@amadeus:没有明白你的观点。如果你是“编程接口”,你可以做到这一点。 – Bhushan 2011-12-30 20:26:39

回答

2

确定,这里有一些想法:

  • 船只具有推进的一个或多个装置(桨,帆,等),这可以通过组合物的模型(例如,具有的推进方法的列表)。
  • 船舶使用的各种策略之一(使用策略模式 - 见http://en.wikipedia.org/wiki/Strategy_pattern - 此)
  • 策略依赖于其他附近船舶的存在将需要查询的其他船舶的一些方法 - 所以你需要某种数据结构来让你找到哪些对象靠近哪些其他对象(查看用于宽相冲突检测的那种数据结构)

作为战略模式,您可以切换到使用基于组件的设计。在这种设置中,船只将由一个或多个推进部件,策略部件等组成。然后,您可以将各个部件组合起来,如果您认为适合制造不同的船舶。

作为额外的好处,如果您希望您的游戏是数据驱动的,基于组件的设计将非常有用,因为您可以为每种不同类型的组件编写保存程序/加载程序,而不是针对每种可能的类型船只。

你可能想在这里看到,如果你感兴趣,这种做法:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

5

使“行为”部分成为接口。这将帮助您将不同的行为分配给不同的船舶,而不会出现问题。 Strategy Pattern在这里很有帮助。简而言之,它指出可变属性和不变属性应该分开。

对于不同的运动方式,组合听起来像是此刻最合适的答案。

关于“但可以在舰队,中队或独立工作。私人和海盗只会在弱者身上发起攻击 - 通常是独立的,但偶尔会成对出现。部分,我想这与继承树无关。您可以根据需要制作“组”课程。

这可以帮助你:

enter image description here

“有那么几种类型的容器风格:......”被指定不同的可能行为。所以“可移动”界面及其子类就是这样。在“Vessel”类中,您可以有一个“Movable”类型的成员。由于“Movable”是一个接口,所以实现它的任何类都可以赋予这个成员。所以Vessel的任何子类都可以有任何可能的行为,我们也可以在运行时改变它。你也可以使它成为一个ArrayList。 (不知道你是否真的想要这样做)。但是如果你需要同一艘船的多种不同的行为,你可以做到。

当你说“船舶也有不同的行为:......”感觉像分开的类延伸船只将满足这一要求。然而,“这种情况下不存在交叉类型”,但是。让生活更轻松。

对于巢最后有个别船只可以有几种行为......你应该为不同的可能行为增加一个成员。它主要是一个ArrayList,因为一艘船会有多种攻击模式。

回到最后一段,如果你可以提供一些更多的细节,我可以给出一些更多的想法。

+0

该图是我最初想到的一种想法 - 但是我意识到我仍然需要另一层。例如,我如何创建三艘船。一个摆放方形的商人的slo,,另一个前后装备,还有一个前后纵横的海盗slo??我需要更多的类来获得所有可能的组合。我最终将使用FAPirateSloop extends Pirate implements ForeAndAft,SQPirateSloop扩展Pirate implements SquareRigged etcetc。 – 2011-12-30 21:07:18

1

您应该分开类型并使用strategy模式。
不变属性应该被绑定到继承树上(例如护卫舰不会变成独木舟,这些是精确的,非行为类型,从船上继承),并且所有可能改变的东西都应该被存储为行为类型的引用intrachangable。 (Man-o-war是一种行为类型)
AI应该与状态分开处理,但这也必须位于架构中的不同模块中。

1

而是想着它严格继承的,我想你需要考虑的对象Composition以及如何这可以让事情变得更简单。

例如:一艘船有一个行为。 (组成...船舶委托给行为,以确定如何X形势反应)

海盗行为(继承自一个行为接口)...

+2

从技术上讲,海盗是一个生气的家伙,戴着眼罩说“Arrr!”很多,并让人们走上木板。类似海盗的行为是一种行为:)请注意,这不是一个完全荒谬的观点,因为人们看到一个名为“Pirate”的类不会指望它是一种行为。 – 2011-12-30 20:37:57

+0

@StuartGolodetz - 这可能可能是我使用“盗版”作为类的地方,而不是混淆? – 2011-12-30 20:41:27

+1

关于谨慎命名的好处...我承认我只是从原来的问题中抽出来,没有太多考虑,谁不喜欢海盗? (呃......除了忍者之外):D – Charlie 2011-12-30 20:42:40

2

我想提供一个根据Bhusan的答案第二段提出了一些建议,我在这里引用这些答案全部:

“关于”但可以在车队,中队或独立工作。私人和海盗只会在弱一点的情况下进行攻击 - 通常是独立的,但偶尔成对。“部分,我想这与继承树无关。“

这使我相信,你另外可能要考虑的某些组合模式,至少是那些由船只组成的组合模式所有这些都共享相同的行为,请参见http://en.wikipedia.org/wiki/Composite_pattern,其中写明“合成模式描述了一组对象将以与对象的单个实例相同的方式进行处理”。

例如,您说“商人可能在一个车队(自卫)“,但大概他们也可以单独保卫自己?这当然比做的更容易,我的建议是不要过度思考,并从一个非常小的开始潜艇et作为原型,你想做什么

+0

复合材料将适用于总是粘在一起的团队,但是当船舶可以脱离主团队时需要小心处理 - 例如如果他们航行太远,他们可能需要考虑离开复合材料。 – 2011-12-30 20:33:01

+0

我不相信复合模式在静态或动态组中占据了一席之地。 – alphazero 2011-12-30 20:38:35

1

你不应该扩展Vessel类。相反,Vessel对象应该包含描述它的其他对象。 (这就是所谓的依赖注入,令人讨厌的是迂腐 - 忘记我说的那个)。你有一个推进类,带有方帆,前后和桨的实例。您可能需要每个大小船体的特殊情况。你有一个行为类来处理他们的态度。有时一个简单的整数和一个类一样工作。相比之下,你的军备类可能只是一些枪支。 (或者两个数字,一个用于磅数。)如果你期望冲击,或者有一艘装载火箭的船只,或者需要区分长枪和卡龙,那么你可能需要回到使用这门课。

如果你愿意,这可以让你随时切换特性 - 虽然你可能不需要。尽管如此,您仍然可以从航行到使用扫掠,或者切换大胆的船上行为与商人的保存货物行为,以实现船长失去他们的神经。无论如何,如果你需要的话,它就在那里。

+0

一个很好的简洁答复,谢谢 - 我几乎从其他答案的组合中收集了相同的想法,但是你说得很好。 – 2012-01-11 20:40:29