首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过RPG库存,如何在保持模块化的同时,按字符类类型显示项目?

通过RPG库存,如何在保持模块化的同时,按字符类类型显示项目?
EN

Stack Overflow用户
提问于 2015-09-12 01:37:07
回答 2查看 777关注 0票数 1

所以我在做一个游戏,玩家会有不同的“职业类”单位,比如骑士,佩姬,炼金术士等等……我目前正在建立一个库存系统,在代码模块化和维护良好代码方面遇到了一个小问题。到目前为止,我的代码的布局如下:

我有一个装备类,每个武器的一个实例,每个装备都有一个类型;让我们说“短剑”和“大剑”是装备的类型。此外,等级骑士的角色可以装备大剑和短剑,而佩格型的角色只能装备短剑。

作业使用每个字符拥有的作业类组织(使用存储在字符类中的列表)。库存类应该访问角色并获得作业,然后请求作业可以装备的所有项目。

我目前的原型使用了一个名为EquipType的设备类中的字符串字段,它将存储这些“短字/大剑”字符串。作业类将有一个列表字段,该字段将被发送到库存类,并使用字符串匹配获取项目。

但是,在维护代码方面,这是很烦人的,因为我正在重新键入用于设备类和作业类的字符串,这并不是很优雅。我正在考虑使用枚举,因为这将允许我按枚举类型获得项,但这会损害代码的模块化,并使(可能?)不应该耦合--无论如何,全球枚举都是不好的做法。此外,枚举将相当大(15-20个元素)。

这样的库存系统是否有更干净、更优雅的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-12 21:23:09

由于您正在使用C#,您可能希望采用一种更面向对象的设计方法。不要使用字符串或枚举值,而是创建表示设备项和字符的类型。每种类型(实例)的对象都是跟踪它们是什么的事物本身,而不是字符串或枚举(尽管它们可能有一个字符串属性,例如"Name“)。然后,每个类型都有允许对象交互的方法。例如,您可能有:

代码语言:javascript
运行
复制
public class Equipment { }
public class Sword : Equipment { }
public class GreatSword : Sword { }

public class Character
{
    public virtual Boolean Wield(Equipment e)
    {
        // do wield logic...
        return true;
    }
}

public class Paige : Character
{
    public override Boolean Wield(Equipment e)
    {
        if (e is GreatSword)
        {
            return false;
        }

        return base.Wield(e);
    }
}

这允许您在每个字符类中添加新类型和自定义行为。接下来您将面临的问题是,您使用的逻辑不仅取决于设备类型,还取决于设备类型和字符类型。这是一个众所周知的问题,被归类为"双重调度“。在C#中解决这一问题的一种方法是称为访客模式的设计模式。

在此之后,有几个关于实现玩家状态和世界状态的详细记录的问题。这个StackOverflow问题涉及创建一个考虑到这些设计模式的RPG。,值得你读一读。

票数 0
EN

Stack Overflow用户

发布于 2015-09-14 01:03:02

我不是C#人,但就OO概念而言,你应该有两个抽象的类1.设备2.字符

每个设备类型都应该是继承父类设备的类,每个字符类型都应该继承父类字符。

由于业务逻辑不太清楚,所以我可以考虑两个选项:选项1:字符可以有一个类型设备列表&每次实例化字符时,您还可以决定允许哪些设备用于该字符并将其添加到列表中。

Option2:可以创建关联类来存储字符和设备之间的关系。

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

https://stackoverflow.com/questions/32534284

复制
相关文章

相似问题

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