【问题标题】:designing class hierarchy for typical characters in role playing game为角色扮演游戏中的典型角色设计类层次结构
【发布时间】:2011-01-08 13:07:50
【问题描述】:

我正在尝试设计一个简单的角色扮演游戏,其中包含您的典型角色类型,如战士、巫师、牧师、小偷等。我需要有关设置类层次结构的好方法的建议。

我最初的尝试是创建一个类型为“Character”的类,并从“Character”中创建战士、巫师、牧师的派生类型。

但后来我认为创建一个“Character”类然后使用装饰器模式可能会更好。比如说战士装饰器、巫师装饰器等等。

或者有其他更好的方法吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    这取决于您希望您的 RPG 角色引擎有多灵活。如果您将您的角色类子类化,那么您将您的角色多样化限制在编译时间。但是,如果您使用装饰器或行为模式等设计模式,您还可以通过组合装饰器或行为对象在运行时创建字符类。 (虽然你不会使用“wizard”装饰器,而是使用“magic”装饰器来创建巫师、精灵等。装饰器可以重复使用,这就是它们的强项。)

    这真的取决于你想学什么,基本的类设计(子类的字符)或现代面向对象的设计(字符的组合)。如果您是这方面的绝对初学者,请使用第一种方法来了解原理。如果您已经了解这些原则,您应该在design patterns 上为自己找一本好书,并将它们应用到您的游戏中。

    【讨论】:

      【解决方案2】:

      我会结合使用策略和装饰器模式。您最初的建议类似于策略模式方法。

      尝试区分字符类型和字符特征。角色类型可能是战士、巫师、牧师……并使用策略模式对其进行设计,从而产生一些层次结构树。

      角色特征可以是火元素、水元素、黑色力量等元素……

      例如战士角色可能会选择火元素和水元素作为他的出生地,例如海盗(aarrrr!)或铁匠。如果你按层次设计,那你就完蛋了,因为这会让你的层次树爆炸式增长。

      这样的字符特征应该用装饰器模式来实现,因为它是一个与字符概念正交的概念。因此,您基本上将创建一个战士角色并包裹一个水元素装饰器以获得海盗(aarrrr!)。或者创造一个巫师角色,在他周围包裹一个黑暗魔法装饰器,得到一个黑暗魔法师。或者:制作一个巫师角色,并在他周围包裹一个水元素和一个黑暗魔法装饰器,以获得一个沼泽地巫师。

      一些思考的食物:

      • 如果你决定拥有所有角色 拥有魔法能力,然后设计 魔法作为性格特征。

      • 如有必要:整理 某种装饰者 层次结构。你可能 有一个“元素”(水,火, earth, wind) 装饰器层次结构和 “魔法型”(黑、白)装饰器 层次结构。

      玩得开心!

      【讨论】:

      • 这条评论最能回答我的实际问题。但感谢@Jason D 的好建议
      【解决方案3】:

      我想你可能在这个问题上本末倒置。

      您的首要任务不应该是确定“我如何代表一个角色?”它应该确定“我想代表什么?”也就是说:一个帮助d20角色创建的工具,Shadowrun,Mongoose Traveller,GURPS角色创建,WH:Dark Heresy Character Creation; “我自己的酷 d20 RPG 视频游戏”,出售的角色和冒险/派对管理软件套件,...等。 用实现中性的术语来定义它。

      在您成功确定要制作的内容后,请详细定义您要制作的内容。这样做的一种方法是列出所有主要的名词和动词(Character、Wizard、Fighter、Create、Save、Delete、Copy....等),并开始理解您需要表示的各种概念之间的关系。然后取出每个主要名词并将其分解为其组成部分。 (角色:可以是一个职业可以是一个或多个职业,有一些装备,有力量,有生命值,有魔法值 ,有一些主要和次要属性。)继续这种分解,直到你不能使用实现中性术语(例如整数......等)。

      然后回顾你的定义和分解,确定是否有明显的矛盾陈述,如果有,排除矛盾。如果不是,则按所描述的层次结构组织数据。在我的示例中,将 Character、Class、Equipment 和 Primary Attribute 作为类可能是合适的。

      一定要让所有这些“事实”井井有条,并在书面和图表中明确它们之间的关系。从那里您应该能够开始考虑实现细节,例如向导从字符派生的类层次结构......等等。

      您可能还想看看其他人是如何实现的,请查看this other SO question 以获得指向实现 d20 的视频游戏引擎的链接。 (即博德斯门)

      【讨论】:

      • 谢谢迪亚蒂斯。我现在实际上正在制作自己的纸笔角色扮演游戏,所以我不得不考虑 OP 问题等等。为了帮助解决这个问题,我也在编写软件。 :-) 我对这个特定概念变得复杂的速度感到惊讶。保持简单对我来说是一个持续的挑战。
      【解决方案4】:

      这是一个可以在理论和实践层面上回答的问题。有关理论,请参阅http://en.wikipedia.org/wiki/Liskov_substitution_principle。

      但我认为你对实践感兴趣。在这种情况下,问问自己,“巫师是一个角色吗”,即你能用一个普通角色做你能做的所有事情吗?如果是这样,那么继续并继承。这将允许您使用带有字符类型而不是特定实例的更多抽象代码。当您想以多种方式组合可能的扩展子集时,装饰器会更有用,即如果在您的情况下,角色可能同时是牧师、巫师或牧师和其他东西,等等。

      【讨论】:

        【解决方案5】:

        我会同意您最初的尝试,创建一个 Character 类,然后通过继承扩展功能。尽管所有角色都会执行相同的操作(使用物品、攻击、使用技能),但结果会有所不同(即方法重载)。我认为使用这个模型会更清楚,我不确定装饰器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-17
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2017-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多