【发布时间】:2011-01-08 13:07:50
【问题描述】:
我正在尝试设计一个简单的角色扮演游戏,其中包含您的典型角色类型,如战士、巫师、牧师、小偷等。我需要有关设置类层次结构的好方法的建议。
我最初的尝试是创建一个类型为“Character”的类,并从“Character”中创建战士、巫师、牧师的派生类型。
但后来我认为创建一个“Character”类然后使用装饰器模式可能会更好。比如说战士装饰器、巫师装饰器等等。
或者有其他更好的方法吗?
【问题讨论】:
标签: c#
我正在尝试设计一个简单的角色扮演游戏,其中包含您的典型角色类型,如战士、巫师、牧师、小偷等。我需要有关设置类层次结构的好方法的建议。
我最初的尝试是创建一个类型为“Character”的类,并从“Character”中创建战士、巫师、牧师的派生类型。
但后来我认为创建一个“Character”类然后使用装饰器模式可能会更好。比如说战士装饰器、巫师装饰器等等。
或者有其他更好的方法吗?
【问题讨论】:
标签: c#
这取决于您希望您的 RPG 角色引擎有多灵活。如果您将您的角色类子类化,那么您将您的角色多样化限制在编译时间。但是,如果您使用装饰器或行为模式等设计模式,您还可以通过组合装饰器或行为对象在运行时创建字符类。 (虽然你不会使用“wizard”装饰器,而是使用“magic”装饰器来创建巫师、精灵等。装饰器可以重复使用,这就是它们的强项。)
这真的取决于你想学什么,基本的类设计(子类的字符)或现代面向对象的设计(字符的组合)。如果您是这方面的绝对初学者,请使用第一种方法来了解原理。如果您已经了解这些原则,您应该在design patterns 上为自己找一本好书,并将它们应用到您的游戏中。
【讨论】:
我会结合使用策略和装饰器模式。您最初的建议类似于策略模式方法。
尝试区分字符类型和字符特征。角色类型可能是战士、巫师、牧师……并使用策略模式对其进行设计,从而产生一些层次结构树。
角色特征可以是火元素、水元素、黑色力量等元素……
例如战士角色可能会选择火元素和水元素作为他的出生地,例如海盗(aarrrr!)或铁匠。如果你按层次设计,那你就完蛋了,因为这会让你的层次树爆炸式增长。
这样的字符特征应该用装饰器模式来实现,因为它是一个与字符概念正交的概念。因此,您基本上将创建一个战士角色并包裹一个水元素装饰器以获得海盗(aarrrr!)。或者创造一个巫师角色,在他周围包裹一个黑暗魔法装饰器,得到一个黑暗魔法师。或者:制作一个巫师角色,并在他周围包裹一个水元素和一个黑暗魔法装饰器,以获得一个沼泽地巫师。
一些思考的食物:
如果你决定拥有所有角色 拥有魔法能力,然后设计 魔法作为性格特征。
如有必要:整理 某种装饰者 层次结构。你可能 有一个“元素”(水,火, earth, wind) 装饰器层次结构和 “魔法型”(黑、白)装饰器 层次结构。
玩得开心!
【讨论】:
我想你可能在这个问题上本末倒置。
您的首要任务不应该是确定“我如何代表一个角色?”它应该确定“我想代表什么?”也就是说:一个帮助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 的视频游戏引擎的链接。 (即博德斯门)
【讨论】:
这是一个可以在理论和实践层面上回答的问题。有关理论,请参阅http://en.wikipedia.org/wiki/Liskov_substitution_principle。
但我认为你对实践感兴趣。在这种情况下,问问自己,“巫师是一个角色吗”,即你能用一个普通角色做你能做的所有事情吗?如果是这样,那么继续并继承。这将允许您使用带有字符类型而不是特定实例的更多抽象代码。当您想以多种方式组合可能的扩展子集时,装饰器会更有用,即如果在您的情况下,角色可能同时是牧师、巫师或牧师和其他东西,等等。
【讨论】:
我会同意您最初的尝试,创建一个 Character 类,然后通过继承扩展功能。尽管所有角色都会执行相同的操作(使用物品、攻击、使用技能),但结果会有所不同(即方法重载)。我认为使用这个模型会更清楚,我不确定装饰器。
【讨论】: