C# 编写游戏:类中的动态攻击逻辑

C# 编写游戏:类中的动态攻击逻辑,c#,design-patterns,decorator,C#,Design Patterns,Decorator,我正在用C#编写一个RPG,我已经很好地初始化了角色类,但是我正在与攻击类斗争 每一次攻击都有其独特的伤害计算公式,基于多个属性和最终的装饰 有没有一种方法可以动态创建/附加这些伤害公式和装饰器,或者我应该为扩展通用攻击类的每次攻击创建一个唯一的类 下面是一些我想要的伪代码: public class Attack { public string Name {get; set;} List<Decorators> DamageCalc; public Att

我正在用C#编写一个RPG,我已经很好地初始化了角色类,但是我正在与攻击类斗争

每一次攻击都有其独特的伤害计算公式,基于多个属性和最终的装饰

有没有一种方法可以动态创建/附加这些伤害公式和装饰器,或者我应该为扩展通用攻击类的每次攻击创建一个唯一的类

下面是一些我想要的伪代码:

public class Attack
{
    public string Name {get; set;}
    List<Decorators> DamageCalc;

    public Attack(string[] data, List<Decorators> decorators)
    {
        Name = data[DataList.Name]; //I'm using constants to keep my indexes readable
        DamageCalc = data[DataList.Damage]; //i.e. strength * 10 + agility
        Decorators = decorators
        ApplyDecorators(Decorators)
    }

    public double DamageCalculation(Character attacker)
    {            
        return DamageCalc; //attacker.Strength * 10 + attacker.Agility
    }

    ...

}
公共类攻击
{
公共字符串名称{get;set;}
列表损坏计算;
公开攻击(字符串[]数据、列表装饰符)
{
Name=data[DataList.Name];//我正在使用常量来保持索引的可读性
DamageCalc=data[DataList.Damage];//即力量*10+敏捷
装饰者
应用程序装饰器(装饰器)
}
公共双重伤害计算(角色攻击者)
{            
return DamageCalc;//attacker.Strength*10+attacker.Agility
}
...
}
我特别感兴趣的是灵活添加新功能和行为

非常感谢您的投入

编辑1 在我使用JSON的地方,是否有任何简单的方法将JSON字段与我的
字符
类的stat变量关联起来,或者我是否需要编写自定义代码来对其进行互操作

一下子,我想不出一个整洁的方法来使用JSON字段,或者任何可以从我的
字符
类动态收集信息的字段

编辑2 理想情况下,这将允许我通过从JSON文件、字符串、XML文件或数据库表获取数据,将所有攻击动态创建为单个攻击类的实例

我更改了
DamageCalculation
方法上的代码示例

关闭
我认为所选答案确实为我的特定问题提供了解决方案。似乎我真的需要编写代码来解析公式并生成我所设想的动态工具。因此,我将看看是否可以从设计的角度解决这个特殊问题。

您需要编写一个基类,其中包含计算的签名,并在派生类上根据它们的特性实现它们

它是一个实体,您可以在“”标题下找到有关它的详细信息


您需要编写一个包含计算签名的基类,并在派生类上根据其特性实现它们

它是一个实体,您可以在“”标题下找到有关它的详细信息


在构造函数上使用字符串数组传入设置是可以的。这样,您可以轻松地从外部数据源驱动设置。考虑使用一种更结构化的格式,比如JSON。罗伯特,谢谢。JSON是我正在研究的东西(我对C还是很陌生)。有没有简单的方法将JSON字段与我的字符类的stat变量关联起来,或者我需要编写自定义代码来对其进行互操作?在构造函数上使用字符串数组传递设置是可以的。这样,您可以轻松地从外部数据源驱动设置。考虑使用一种更结构化的格式,比如JSON。罗伯特,谢谢。JSON是我正在研究的东西(我对C还是很陌生)。有没有简单的方法将JSON字段与我的角色类的stat变量关联起来,或者我需要编写自定义代码来进行互操作?这看起来非常有用,谢谢@RobertMoskal建议我可以使用数据生成算法。如果我可以这样做,它将允许我从一个表中动态创建攻击类的实例,而不是硬编码每次攻击(如策略模式)。我的推论正确吗?还是我误解了战略模式?这似乎非常有用,谢谢@RobertMoskal建议我可以使用数据生成算法。如果我可以这样做,它将允许我从一个表中动态创建攻击类的实例,而不是硬编码每次攻击(如策略模式)。我的推论是正确的还是我误解了战略模式?