首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java面向对象设计

Java面向对象设计
EN

Stack Overflow用户
提问于 2015-10-20 12:35:10
回答 5查看 669关注 0票数 2

我想到了我的第一个java项目(面向对象的)的想法。这个项目是一个非常基本的角色扮演游戏(没有GUI,它是非常基本的),所以我有一些面向对象的问题。

玩家可以选择一个角色类(你知道,拳击手,巫师等等)。将来他可能会选择几个角色,这样他就可以开个派对了)。在角色创建之后,他可以对抗其他敌人(由程序控制)。

  • 每个角色都有一些信息,比如:角色等级(如战斗机)、等级、装甲等级、能力(力量、灵巧、智慧等)。
  • 每堂课都有一份清单。
  • 每个字符都有一些方法,例如:
  • 攻击(使用武器,如果他是法术施法者,那么施法法术也可以使用攻击)。
  • 防御(如防御性法术或使用技能,如防御性技能)。注:更换护甲等级。
  • 一些角色类(比如巫师)可以施展法术。大多数法术都是进攻性的或防御性的,所以他们可以使用攻击或防御的方法。比方说,castFireball可以调用攻击(20)。有些法术可以做其他的事情,比如castHeal,它可以治愈角色并改变当前的生命点。
  • 购买(未来可选)。当然,所有字符的实现是相同的。
  • 从库存中添加/删除。

建议实现:我考虑创建一个抽象类(包括等级、装甲类、能力(比如力量、灵巧、智慧等))。还有一些像进攻和防守之类的方法。其他特定类将扩展字符,如下所示:

代码语言:javascript
复制
                           Character (abstract)
                                 Character Class (like fighter)
                                 Level
                                 Hit Points
                                 Current Hit Points
                                 Armor Class
                                    .
                                    .
                                    .
                                 Inventory (List)

                                 Strength
                                 Dexterity
                                 Wisdom


  Fighter       Wizard         Rouge        Cleric   (All extends Character)

问题:

  1. 在这种情况下,使用抽象类被认为是一个很好的设计?您会建议使用接口并更改设计吗?
  2. 我应该为力量、智慧等能力再上一堂课吗?还是说这是性格的一部分?
  3. 我应该再做一次盘点课吗?我觉得可能会更好,对吧?
  4. 使用枚举存储所有武器、盔甲和盾牌的数据(可能是将来的其他东西)是一个很好的解决方案?
  5. 咒语-我不知道什么是实现它们的好方法。我可以创建一个法术类,对每个咒语都使用静态方法(比如castFireball、castHeal方法)。施放法术当然只适用于施法者角色(每个角色都有一个已知的法术列表,所以他只能施展他知道的法术)。这是实现这一目标的好方法吗?我也可以使用txt文件并从文件中获取相关数据,但我不喜欢这个想法。

请记住,它应该是基本的,但它应该为未来的变化和补充计划。看起来应该是:

你想怎么攻击?

  1. 匕首(主要武器)
  2. 宝剑
  3. 施法

3.

你想用哪个咒语?

  1. 火球
  2. 疗愈
  3. 冰风暴

1

你用火球击中敌人,造成20点伤害。

很模糊,但你明白.

非常感谢!!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-10-20 12:59:06

我建议不要让Character成为(例如) Fighter的抽象基类。作为一名战士只是性格的一种属性。我只是告诉你,他可以挥舞剑,戴上车牌--比如邮件。在一些游戏中,假设一个Warrior角色永远是一个战士。然后,当需求发生变化,以便字符可以将类更改为,比方说,Mage时,就会出现一个完整的数据迁移问题,而不仅仅是属性的更改。K

尽量保持你的继承树浅薄。可以时使用聚合和组合,而不是继承。

票数 1
EN

Stack Overflow用户

发布于 2015-10-20 12:44:15

通常,类B应该是A的子类,只有在它们之间存在一个is --一个关系--也就是说,如果说B的任何实例也是A的一个实例是有意义的话。通过应用这一点,您可以看到字符类是Character子类的唯一可行选择:WarriorCharacter,但Weapon不是Character。相反,在其他类和Character之间有一个Character --一种关系:Character有一个Weapon。在这种情况下,您应该使用组合:Character类可以有一个类型为Weapon的字段(或者更有可能是List<Weapon>类型的字段,这样您就可以拥有多个武器)。

但是,即使您可以创建一个类层次结构,也不确定是否应该这样做。如果字符类之间的差异完全可以实现为统计数据的差异(这可能只是类中的字段)或一些简单的能力差异,那么您可能只需要Character类。另一方面,如果行为差异很大,并且最终会有一堆if语句来为不同情况下的不同字符类选择适当的行为,那么引入子类可能是明智的。但是,正如@plalx和@B.Dalton所指出的,通常可以使用组合,将行为差异提取到抽象的CharacterAbilities类及其子类中。

票数 1
EN

Stack Overflow用户

发布于 2015-10-20 12:50:27

  1. 这里使用的抽象类工作得很好,因为所有其他字符类都将从该类中扩展,而且类本身从未被实例化。
  2. 这是一个优先考虑的问题,如果您的能力比整数更复杂,您可以考虑让它们成为一个类,但是如果您所做的只是添加临时的缓冲区/减值,那么我建议每个技能都有两个整数:一个用于当前的能力值,另一个用于您的基值,而不包含缓冲区/debuffs。
  3. 把库存作为一个类是个好主意。有些人可能会被诱惑去创建一系列的库存物品,并根据游戏的需要对其进行操作。我认为创建一个单独的类可以很好地封装所有东西,即使您只是在操作一个数组。
  4. 枚举在创建武器方面很有用,但我也建议为此创建一个单独的类。如果对所有项都使用枚举,那么最终可能不得不使用大量的数学,特别是除法和模块化来获得项类型。创建项目类并将其扩展到不同的项类型,允许使用父类类型将所有项包含在公共数组中,同时为它们提供不同的统计/能力/使用。
  5. 法术可以遵循类似我上面描述的物品的方式(事实上,如果你想把它们保存在你的清单中的话,一个咒语可能是一个物品)。请确保有一些枚举来描述该咒语及其功能,然后有一个方法来解释这些在施放时的情况。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33236836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档