designing class hierarchy for typical characters in role playing game
我正在尝试设计一个简单的角色扮演游戏,它有你典型的角色类型,如战士,巫师,牧师,小偷等。我需要一个好的方法来设置阶级等级的建议。
我最初的尝试是创建一个"角色"类型的类,并使战士、巫师、牧师从"角色"派生出类型。
但后来我觉得最好创建一个"character"类,然后使用decorator模式。比如说斗士装饰师,巫师装饰师等等。
或者有其他更好的方法吗?
我想你可能把马车放在这匹马前面了。
你的首要任务不应该是确定"我如何代表一个角色?"它应该决定"我要代表什么?"也就是说:一个帮助d20字符创建、shadowrun、mongoose traveller、gurps字符创建、wh:dark异端字符创建的工具;"我自己的基于d20的酷酷RPG视频游戏"、一个角色和冒险/派对销售软件管理套件……等等。用中性实现术语定义这一点。
成功确定要制作的内容后,请创建一个详细的定义,说明要制作的内容。一种方法是列出所有主要的名词和动词(字符、向导、战士、创建、保存、删除、复制……等等),并开始理解需要表示的各种概念之间的关系。然后把每个主要名词分解成它的组成部分。(character:can be a classcan be one or more classes,has some equipment,has a strength,has hit points,has magic points,has some primary and secondary attributes。)继续此分解,直到无法使用实现中性术语(例如integer…etc)。
然后回顾你的定义和分解,确定是否有明显的矛盾陈述,如果有,就消除矛盾。如果没有,则按所描述的层次结构组织数据。在我的示例中,将字符、类、设备和主要属性作为类是合适的。
无论是书面的还是图表的,都要确保这些"事实"有条理,并使它们的关系清晰。从那里,您应该能够开始考虑实现细节,例如向导从字符等派生的类层次结构。
您可能还想看看其他人是如何实现这些功能的,请看另一个问题,以获取实现D20的视频游戏引擎的链接。(即鲍德斯门)
我将使用策略和装饰模式的组合。您的初始建议类似于策略模式方法。
试着区分字符类型和字符特征。角色类型将类似于战士、巫师、牧师等,并以策略模式进行设计,从而形成某种层次树。
性格特征是火元素、水元素、黑力量等元素。
例如,一个战士角色可以在火元素和水元素之间进行选择,以成为他的土著,就像海盗(aarrr!)或者铁匠。如果按层次结构设计,那么就注定要失败,因为这样会使层次结构树的大小爆炸。
这样的字符特性应该用修饰器模式来实现,因为它是字符概念的正交概念。所以你基本上会创造出一个战士角色,并在周围包上一个水元素装饰器来获得一个海盗(aarrr!)或者创造一个巫师角色,在他周围包上一个黑暗魔法装饰师,以获得一个黑暗法师。或者:用板条箱装一个巫师角色,在他周围包一个水元素和一个黑暗的魔法装饰师,以得到一个沼泽地巫师。
一些思考的食物:
如果你决定拥有所有的品质有魔法能力,然后设计魔法作为性格特征。
必要时:组织在某种程度上的装饰层次结构。你可能有一个"元素"(水,火,地球、风)装饰层和"魔法型"(黑白)装饰师等级制度。
玩得高兴!
这取决于您希望RPG字符引擎具有多大的灵活性。如果您将字符类划分为子类,那么您将字符多样化限制在编译时。但是,如果您使用像decorator或behavior模式这样的设计模式,那么您也可以在运行时通过组合decorator或behavior对象来创建字符类。(虽然你不会使用"巫师"装饰师,而是使用"巫师"装饰师来创建巫师、精灵等。装饰师是为了重复使用,这就是他们的优势。)
它实际上取决于你想学习什么,基础类设计(子类字符)或现代面向对象设计(组合字符)。如果你是一个绝对的初学者,那么就用第一种方法来了解这些原则。如果你已经知道这些原则,你应该为自己准备一本关于设计模式的好书,并将它们应用到你的游戏中。
这是一个可以从理论和实践层面回答的问题。有关理论,请参阅http://en.wikipedia.org/wiki/liskov_substitution_principle。
但我认为你对实践感兴趣。在这种情况下,问问你自己,"一个巫师是一个角色吗",也就是说,你能用一个普通的角色做你能做的所有事情吗?如果是这样,那就继续继承吧。这将允许您对字符类型使用更抽象的代码,而不是特定的实例。当你想以各种方式组合可能的扩展的子集时,装饰器更有用,例如,如果在你的情况下,一个角色可以同时是牧师、巫师或牧师以及其他什么东西,等等。
我将按照您最初的尝试,创建一个字符类,然后通过继承扩展功能。尽管所有字符都将执行相同的操作(使用项目、攻击、使用技能),但结果会有所不同(方法重载,即)。我想用这个模型会更清楚些,我对装饰师不太确定。