游戏的继承/界面设计

Jon*_*ory 5 java architecture oop design-patterns

我正在设计一款游戏,但我不能完全理解继承结构.我通常相当擅长它,但这个只是有太多的重叠,我无法决定这一切.

我正在寻求模拟帆船 - 想想帆船时代.因此,据推测,一切都延伸到船只类.

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

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

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

我的大问题是,每种风格的船(护卫舰,战舰等)几乎都可以完成任何这些角色,所以我无法构建一个简单的实体继承结构.护卫舰不能延长战争,因为有些人是私人战士.Sloop不能伸展方形装备,因为有些装备是前后装配​​的.etcetc.

任何想法都会受到赞赏,我有点松散的结局.谢谢

Bhu*_*han 5

将"行为"部分作为接口.这将帮助您毫无问题地为不同的船舶分配不同的行为.策略模式在这里很有帮助.简而言之,它指出应该改变可变属性和常量属性.

对于不同的动作方式,合成听起来像是目前最合适的答案.

关于"但可能在舰队,中队或独立工作.私人和海盗只会在较弱的情况下进攻 - 通常是独立但偶尔成对出现." 部分,我想这与继承树无关.您可以根据需要制作课程"小组".

这可能对您有所帮助:

在此输入图像描述

"然后有几种类型的船只风格:......"指定了不同的可能行为.所以"Movable"接口及其子类就是为了这个.在"Vessel"类中,您可以拥有"Movable"类型的成员.由于"Movable"是一个接口,任何实现它的类都可以赋予该成员.所以Vessel的任何子类都可以有任何可能的行为,我们也可以在运行时更改它们.您也可以将其设为ArrayList.(不确定你是否真的想要这样做).但是如果你需要为同一艘船提供多种不同的行为,你就可以做到.

当你说"船也有不同的行为:......"时,感觉就像扩展船只的单独类会满足这个要求.然而,句子"在这种情况下没有类型的交叉".让生活更轻松.

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

在最后一段中,如果你能提供更多细节,我可以提供更多的想法.


Stu*_*etz 2

好的,这里有一些想法:

  • 船舶有一种或多种推进方式(桨、帆等),您可以通过组合对其进行建模(例如,有一系列推进方式)。
  • 容器使用多种策略之一(使用策略模式 - 请参阅http://en.wikipedia.org/wiki/Strategy_pattern - 为此)
  • 依赖于附近其他船只的存在的策略将需要某种方式来查询这些其他船只 - 因此您将需要某种数据结构来允许您找到哪些对象靠近哪些其他对象(查看用于宽相碰撞检测的数据结构)

作为策略模式的替代方案,您可以改用基于组件的设计。在此设置中,一艘船舶将由一个或多个推进组件、一个策略组件等组成。然后,您可以根据需要组合各个组件来制造不同的船舶。

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

如果您对这种方法感兴趣,您可能想在这里查看:

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