首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这种面向对象的RPG类结构足够好吗?

这种面向对象的RPG类结构足够好吗?
EN

Software Engineering用户
提问于 2019-04-04 09:41:43
回答 2查看 375关注 0票数 0

所以我已经建立了一个电报机器人,你可以玩一个rpg。这是班级结构。

生物

MobType <--生物

暴民<-- MobType <--生物

Mob1 <--群<-- MobType <--生物

Mob2 <--群<-- MobType <--生物

其中:

生物包含与用户类共享的功能。

MobType包含数据库表中的数据,对于相同类型的每一个暴徒(名称、stats )都是相等的。

Mob包含来自数据库表的数据,这些数据因暴徒而异(当前hp,级别ecc)。

Mob1,Mob2 ecc是我为自定义每个暴徒而创建的类,比如如果某个暴徒对火免疫,当它受到火伤害时,我可以告诉这个类忽略它重写一个函数。

我只解释了暴徒架构,但其他如技能,项目ecc是平等的。

所以我的问题是:这个架构够好吗?这是最好的吗?如果不是为什么?(当然不是)

编辑:如果需要的话,我甚至可以在GitHub上共享存储库。这是违反规则吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2019-04-04 09:46:08

不是的。像这样的继承树往往会倒下。尤其是在游戏里。

您更有可能使用更多的技术对象,例如:

代码语言:javascript
运行
复制
AnimatedCharacter <-- 2dSprite

--编辑09:55 UTC,滚动新闻更新开始

因此,您要做的是将您的业务规则编成代码,或者在游戏的情况下,将您的“游戏逻辑”转换为继承树。来扩展你的例子。

代码语言:javascript
运行
复制
Dragon : Mob
{
    override public void takeDamage(Damage damage)
    {
        if(damage.Type == Fire) { .. do nothing..}
    }  
}

问题是

它一直在扩张。所以说我发明了一个新的黑帮,萨拉曼德

代码语言:javascript
运行
复制
FireResistantMob : Mob
Dragon : FireResistantMob 
Salamander : FireResistantMob

但这是不灵活的。假设我有一种新生物不受火和冰的伤害

代码语言:javascript
运行
复制
RockGolem : FireResistantMob  : IceResistantMob //does not compile!!!

小的变化会产生很大的意想不到的影响。比如说我改变了火的伤害,这样它就可以燃烧库存物品。但现在我所有的耐火生物的库存并没有像预期的那样燃烧。

考虑到Mob是"Mobile“的缩写,我们需要共享和传播的功能不是与游戏规则、伤害、怪物类型等相关的功能,而是关于从一个位置移动到另一个位置的功能。如何在屏幕上显示东西,我们可以点击哪些东西等等。

一个带有变量的Mobile类可以解释所有可能的怪物类型。例:

代码语言:javascript
运行
复制
public class Mobile : LevelContent
{
    Dictionary<DamageType, double> damageResistances;
}
票数 3
EN

Software Engineering用户

发布于 2019-04-04 10:01:07

喜欢组合而不是继承(请参阅堆栈溢出问题。)。创建无穷无尽的继承子类仅仅是为了向对象添加特性就会产生一个庞大的、混乱的类树。它不能很好地处理具有多个特征的对象(您必须创建更多的类),而且更难有可修改的特征。

通常最好是有一组简单的类,每个类都有一个列表/集合/其他容器,您可以在其中添加或删除额外的特征。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/389765

复制
相关文章

相似问题

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