设计角色扮演游戏中典型角色的类层次结构

我正在尝试设计一个简单的角色扮演游戏,它具有典型的角色类型,如战斗机,巫师,牧师,小偷等。我需要建议一个很好的方法来设置类层次结构。

我最初的尝试是创建一个类型为“Character”的类,并使“Character”中的战斗机,向导,牧师,派生类型。

但后来我认为创建一个“Character”类然后使用装饰器模式可能会更好。 所以说战斗机装饰,精灵装饰等。

或者有更好的方式吗?

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

尝试区分字符类型和字符特征。 字符类型将类似于战斗机,向导,牧师……以及使用策略模式设计它,这会产生一些层次结构树。

性格特征将是火元素,水元素,黑力,……等元素。

例如,一个战士角色可能会选择火与水元素作为他的本土起源,如海盗(aarrrr!)或铁匠。 如果你按层次结构设计它,那么你就注定要失败,因为这会让你的层次结构树大小爆炸。

这种角色特征应该用装饰器模式来实现,因为它是角色概念的正交概念。 所以你基本上会创建一个战斗机角色并包裹一个水元素装饰器来获得一个海盗(aarrrr!)。 或者创造一个巫师角色并在他周围包裹一个黑暗魔法装饰者以获得一个黑暗法师。 或者:装箱一个巫师角色,并在他周围包裹一个水元素和一个黑暗魔法装饰者,以获得一个沼泽地巫师。

一些思想的食物:

  • 如果你决定让所有角色拥有魔法能力,那么将魔法设计为角色特征。

  • 必要时:以某种层次结构组织装饰器。 你可能有一个“元素”(水,火,土,风)装饰层次结构和“魔术类型”(黑色,白色)装饰层次结构。

玩得开心!

我想你可能会把这辆车放在马前。

您的第一笔业务不应该是“我如何代表一个角色?” 应该确定“我想代表什么?” 也就是说:一个帮助d20角色创作的工具,Shadowrun,Mongoose Traveler,GURPS角色创作,WH:黑暗异端角色创作; “我自己酷的基于d20的RPGvideo游戏”,一个角色和冒险/派对管理套件的软件待售,等等。 在实现中性术语中定义它。

在您成功确定要制作的内容后,请创建您想要制作的详细定义。 这样做的一种方法是列出所有主要名词和动词(角色,向导,战斗机,创建,保存,删除,复制……等),并开始理解您需要表达的各种概念之间的关系。 然后取出每个主要名词并将其分解为其组成部分。 (字符: 可以是一个类可以是一个或多个类,有一些设备, 有一个强度有点数,有魔点 ,有一些主要和次要属性。)继续这个分解,直到你无法使用实现中性术语(例如整数……等)。

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

一定要保持所有这些“事实”的组织,并在书面和图表中明确他们的关系。 从那里你应该能够开始考虑实现细节,例如类向量,其中向导派生自角色……等。

您可能还希望了解其他人如何实现其他SO问题以查找实现d20的video游戏引擎的链接。 (即Baldurs Gate)

我将继续您的初始尝试,创建一个Character类,然后通过inheritance扩展function。 虽然所有角色都会执行相同的操作(使用项目,攻击,使用技能),但结果会有所不同(方法重载,即)。 我认为使用这个模型更清楚,我不确定装饰器。

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

但我认为你对练习很感兴趣。 在这种情况下,问问自己,“是一个向导是一个角色”,也就是说,你可以用一个具有通用角色的向导做你能做的所有事情吗? 如果是这样,那么继续并inheritance。 这将允许您使用具有Character类型的更抽象代码而不是特定实例。 当您想要以各种方式组合可能的扩展的子集时,装饰器会更有用,例如,在您的情况下,角色可以同时是牧师,巫师或神职人员等等。

这取决于你想要你的RPG角色引擎的灵活性。 如果您inheritance了您的角色类,那么您将角色多样化限制为编译时间。 但是,如果您使用设计模式(如装饰器或行为模式),则还可以通过组合装饰器或行为对象在运行时创建字符类。 (虽然你不会使用“巫师”装饰器而是使用“神奇”装饰器来创建巫师,精灵等等。装饰器可以重复使用,这就是他们的力量。)

这实际上取决于你想要学习什么,基础类设计(子类字符)或现代面向对象设计(字符组合)。 如果你是一个绝对的初学者,那就用第一种方法来了解原理。 如果您已经了解这些原则,那么您应该获得一本关于设计模式的好书,并将它们应用到您的游戏中。