如何在角色扮演游戏中设计类以允许多类化?

mik*_*dev 2 c# design-patterns decorator

我正在编写一个游戏作为练习,我遇到了一个设计问题.我的角色扮演游戏将有典型的类,如战士,向导,Theif,牧师.如何设计课程以便玩家可以多班?例如,一个玩家可能从战斗机开始(并获得相关技能的战士),然后多级到一个巫师(此时他们获得向导法术),后来再多个级别又一个流氓(现在获得所有能力的流氓有).所以这个玩家现在是战斗机向导 - 盗贼.我不知道在C#中表示这个.

起初我尝试使用装饰器模式,但我不能多次多次使用它.关于如何设计这个的任何指针?

我唯一能想到的就是IList<CharacterBaseClass>为每个角色拥有一个属性,并将Fighter,Wizard,Rogue等添加到玩家多类中.所以像这样......

class CharacterBaseClass
{
   public IList<CharacterBaseClass> MultiClasses { get; set; }
   // constructors, etc
}
Run Code Online (Sandbox Code Playgroud)

每次我们将它们添加到IList中

// player starts off as Fighter
Warrior player1 = new Warrior();

// now multi-class to Wizard
player1.MultiClasses.Add(new Wizard()); 

// now multi-class to Theif
player1.MultiClasses.Add(new Theif());    
Run Code Online (Sandbox Code Playgroud)

我敢肯定必须有比这更好的方法吗?

mun*_*ent 7

仅仅因为你的角色巫师和战士,这并不意味着你必须为他们创建子类.相反,问问自己,"在代码级别,角色的课程做什么?" 可能,你根本不想要为字符类设置C#子类.相反,弄清楚类实际做了什么,然后确定在代码中对其进行建模的正确方法.

例如,如果字符类限制了角色可以使用的设备,那么您可以为AllowedEquipment以下内容定义一个类:

public class AllowedEquipment
{
    public static AllowedEquiment Warrior()
    {
        return new AllowedEquipment() {
            Daggers = true;
            Swords = true;
            Shields = true;
            Armor = true
        };
    }

    public static AllowedEquiment Wizard()
    {
        return new AllowedEquipment() {
            Daggers = true;
            Swords = false;
            Shields = false;
            Armor = true
        };
    }

    public bool Daggers { get; set; }
    public bool Swords { get; set; }
    public bool Shields { get; set; }
    public bool Armor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不要觉得你需要使用子类来模拟游戏中的每个"is-a"关系.

另一种选择是使用Type Object模式为您的角色类建模.如果你这样做,那么很容易为每个角色提供一组Type Object实例而不是一个实例,这实际上为你提供了多重继承.