关于c#:浏览RPG库存,如何在保持模块化的同时按字符类类型显示项目?


Going through RPG inventory, how to display items by character class type while maintaining modularity?

所以我正在做一个游戏,玩家将有不同的"工作等级"的单位,比如骑士,佩奇,炼金术士等。我目前正在开发一个清单系统,在代码模块化和维护好代码方面遇到了一个小问题。以下是迄今为止我的代码布局:

我有一个装备类,每个武器都有一个实例,每个装备都有一个类型,比如说"短剑"和"长剑"都是装备类型。此外,一个等级骑士的角色可以装备长剑和短剑,而一个类型佩奇的角色只能装备短剑。

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

我目前的原型使用了一个名为equiptype的装备类中的字符串字段,它将存储这些"短剑/长剑"字符串。然后,作业类将有一个列表字段,该字段将发送到库存类,并使用字符串匹配获取项目。

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

有没有更清洁和更优雅的方法来这样一个库存系统?


我不是一个C人,但在OO概念方面,你应该有两个抽象类1。设备2。性格

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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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,值得您阅读。