C# 如何设计一款具有多种技能的可伸缩纸牌游戏

C# 如何设计一款具有多种技能的可伸缩纸牌游戏,c#,unity3d,C#,Unity3d,现在我想写一个像《三国演义》这样的中国游戏。 玩家可以玩可以伤害其他人的牌,一个简单的例子是,如果你对敌人玩一张“杀死”的牌,如果敌人不玩像“错过”这样的牌,他将失去生命点。 如果我装备了一个名为“强化”的技能,其功能是如果你让敌人失去生命,你就有可能让敌人多失去一点生命, 如果我装备了名为“龙林道”的武器,其功能是如果你用“杀”牌让敌人丧命,你可以选择移除敌人的两张牌,而不是让他丧命。 有很多技能和武器像上面两种,技能不是卡和绑定用的角色,武器是相同的,手牌有不同的功能,大多数武器都可以增加攻

现在我想写一个像《三国演义》这样的中国游戏。 玩家可以玩可以伤害其他人的牌,一个简单的例子是,如果你对敌人玩一张“杀死”的牌,如果敌人不玩像“错过”这样的牌,他将失去生命点。 如果我装备了一个名为“强化”的技能,其功能是如果你让敌人失去生命,你就有可能让敌人多失去一点生命, 如果我装备了名为“龙林道”的武器,其功能是如果你用“杀”牌让敌人丧命,你可以选择移除敌人的两张牌,而不是让他丧命。 有很多技能和武器像上面两种,技能不是卡和绑定用的角色,武器是相同的,手牌有不同的功能,大多数武器都可以增加攻击距离

我不确定你是否能理解游戏的玩法,更多细节你可以阅读维基

我的问题是如何以可扩展的方式设计技能、武器和卡?

我的目标是使技能可以像武器一样被任何角色装备,随着时间的推移,我可以轻松地创造出许多新技能和武器

例如,我想制作一个新技能,其功能是,如果你通过“杀死”牌使敌人失去一点生命,你可以增加一点生命。 我想做一个新的技能,它的功能是,如果我玩一张“错过”牌,我可以得到一张新牌,等等

我对设计有一个简单的想法。 接口:

public interface ICommonProperties
{
    string Name { get; set; }
    int AttackDistance { get; set; }
}
public interface ICommonEvents
{
    /// <summary>
    /// Before player plays card "Kill"
    /// </summary>
    void OnBeforeKill();

    /// <summary>
    /// After player plays card "Kill"
    /// </summary>
    void OnAfterKill();

    /// <summary>
    /// Before player plays card "Miss"
    /// </summary>
    void OnBeforeMiss();

    /// <summary>
    /// After player plays card "Miss"
    /// </summary>
    void OnAfterMiss();

    /// <summary>
    /// Trigger if lose life or increase life
    /// </summary>
    void OnLifeChange();

    /// <summary>
    /// Tigger if role is dying
    /// </summary>
    void OnDying();
}

public interface IRole : ICommonProperties, ICommonEvents
{
    int CurrentLife { get; set; }
    int MaxLife { get; set; }
    List<Card> CardsInHand { get; set; }
    List<IWeapon> BaseWeapons { get; set; }
    List<ISkill> BaseSkills { get; set; }
}

public interface IWeapon : ICommonProperties, ICommonEvents
{
    int AttackDistance { get; set; }
}

public interface ISkill : ICommonProperties, ICommonEvents
{

}
public class BaseRole : IRole
    {
        public BaseRole()
        {
            this.CurrentLife = 3;
            this.MaxLife = 3;
            this.Name = "BaseRole";

        }

        #region Fileds
        public int CurrentLife
        {
            get;
            set;
        }

        public int MaxLife
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public List<Card> CardsInHand
        {
            get;
            set;
        }

        public List<IWeapon> BaseWeapons
        {
            get;
            set;
        }

        public List<ISkill> BaseSkills
        {
            get;
            set;
        }
        public int AttackDistance
        {
            get;
            set;
        }
        #endregion

        public virtual void OnBeforeKill()
        {

        }

        public virtual void OnAfterKill()
        {

        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {
            //If role is dying, he can ask medicine called "Yao" to gain one more life point.
        }



    }

    public class BaseWeapon : IWeapon
    {
        public BaseWeapon()
        {
            this.AttackDistance = 1;
            this.Name = "BaseWeapon";

        }
        public int AttackDistance
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public virtual void OnBeforeKill()
        {
        }

        public virtual void OnAfterKill()
        {
        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {
        }
    }

    public class BaseSkill : ISkill
    {
        public BaseSkill()
        {
            this.Name = "BaseSkill";
        }
        public string Name
        {
            get;
            set;
        }

        public int AttackDistance
        {
            get;
            set;
        }

        public virtual void OnBeforeKill()
        {
        }

        public virtual void OnAfterKill()
        {
        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {


        }
    }

    public class Card
    {
        public string Name { get; set; }
        public string Type { get; set; }

        /// <summary>
        /// Whether it can be used to attack others, such as "Kill" card CanAttack=true, card "Miss" CanAttack=false
        /// </summary>
        public bool CanAttack { get; set; }

    }
公共接口属性
{
字符串名称{get;set;}
int攻击距离{get;set;}
}
公共接口事件
{
/// 
///在玩家玩扑克牌“杀死”之前
/// 
void OnBeforeKill();
/// 
///玩家玩“杀死”牌后
/// 
void OnAfterKill();
/// 
///在玩家玩“小姐”牌之前
/// 
void OnBeforeMiss();
/// 
///在玩家玩“小姐”牌之后
/// 
无效,无效();
/// 
///如果失去生命或增加生命则触发
/// 
void onlyfechange();
/// 
///如果角色正在消亡,跳跳虎
/// 
空位();
}
公共接口IRole:ICommonProperties、ICommonEvents
{
int CurrentLife{get;set;}
int MaxLife{get;set;}
列表CardsInHand{get;set;}
列出基本武器{get;set;}
列出基本技能{get;set;}
}
公共接口IWeapon:ICommonProperties、ICommonEvents
{
int攻击距离{get;set;}
}
公共接口ISkill:ICommonProperties、ICommonEvents
{
}
实现接口:

public interface ICommonProperties
{
    string Name { get; set; }
    int AttackDistance { get; set; }
}
public interface ICommonEvents
{
    /// <summary>
    /// Before player plays card "Kill"
    /// </summary>
    void OnBeforeKill();

    /// <summary>
    /// After player plays card "Kill"
    /// </summary>
    void OnAfterKill();

    /// <summary>
    /// Before player plays card "Miss"
    /// </summary>
    void OnBeforeMiss();

    /// <summary>
    /// After player plays card "Miss"
    /// </summary>
    void OnAfterMiss();

    /// <summary>
    /// Trigger if lose life or increase life
    /// </summary>
    void OnLifeChange();

    /// <summary>
    /// Tigger if role is dying
    /// </summary>
    void OnDying();
}

public interface IRole : ICommonProperties, ICommonEvents
{
    int CurrentLife { get; set; }
    int MaxLife { get; set; }
    List<Card> CardsInHand { get; set; }
    List<IWeapon> BaseWeapons { get; set; }
    List<ISkill> BaseSkills { get; set; }
}

public interface IWeapon : ICommonProperties, ICommonEvents
{
    int AttackDistance { get; set; }
}

public interface ISkill : ICommonProperties, ICommonEvents
{

}
public class BaseRole : IRole
    {
        public BaseRole()
        {
            this.CurrentLife = 3;
            this.MaxLife = 3;
            this.Name = "BaseRole";

        }

        #region Fileds
        public int CurrentLife
        {
            get;
            set;
        }

        public int MaxLife
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public List<Card> CardsInHand
        {
            get;
            set;
        }

        public List<IWeapon> BaseWeapons
        {
            get;
            set;
        }

        public List<ISkill> BaseSkills
        {
            get;
            set;
        }
        public int AttackDistance
        {
            get;
            set;
        }
        #endregion

        public virtual void OnBeforeKill()
        {

        }

        public virtual void OnAfterKill()
        {

        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {
            //If role is dying, he can ask medicine called "Yao" to gain one more life point.
        }



    }

    public class BaseWeapon : IWeapon
    {
        public BaseWeapon()
        {
            this.AttackDistance = 1;
            this.Name = "BaseWeapon";

        }
        public int AttackDistance
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public virtual void OnBeforeKill()
        {
        }

        public virtual void OnAfterKill()
        {
        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {
        }
    }

    public class BaseSkill : ISkill
    {
        public BaseSkill()
        {
            this.Name = "BaseSkill";
        }
        public string Name
        {
            get;
            set;
        }

        public int AttackDistance
        {
            get;
            set;
        }

        public virtual void OnBeforeKill()
        {
        }

        public virtual void OnAfterKill()
        {
        }

        public virtual void OnBeforeMiss()
        {
        }

        public virtual void OnAfterMiss()
        {
        }

        public virtual void OnLifeChange()
        {
        }

        public virtual void OnDying()
        {


        }
    }

    public class Card
    {
        public string Name { get; set; }
        public string Type { get; set; }

        /// <summary>
        /// Whether it can be used to attack others, such as "Kill" card CanAttack=true, card "Miss" CanAttack=false
        /// </summary>
        public bool CanAttack { get; set; }

    }
公共类基类角色:IRole
{
公共基本角色()
{
这是1.CurrentLife=3;
这是MaxLife=3;
this.Name=“BaseRole”;
}
#区域文件
公共生活
{
得到;
设置
}
公共int MaxLife
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
公开名单
{
得到;
设置
}
公开清单基本武器
{
得到;
设置
}
基本技能公开列表
{
得到;
设置
}
公共攻击距离
{
得到;
设置
}
#端区
公共虚拟void OnBeforeKill()
{
}
Afterkill()上的公共虚拟无效
{
}
公共虚拟void OnBeforeMiss()
{
}
AfterMiss()上的公共虚拟无效
{
}
公共虚拟void OnLifeChange()
{
}
公共虚拟空间()
{
//若角色即将死亡,他可以要求名为“姚”的医生再获得一个生命点。
}
}
公共类基本武器:IWeapon
{
公共基础武器()
{
此参数为.AttackDistance=1;
this.Name=“basenearm”;
}
公共攻击距离
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
公共虚拟void OnBeforeKill()
{
}
Afterkill()上的公共虚拟无效
{
}
公共虚拟void OnBeforeMiss()
{
}
AfterMiss()上的公共虚拟无效
{
}
公共虚拟void OnLifeChange()
{
}
公共虚拟空间()
{
}
}
公共类基本技能:ISkill
{
公共基本技能()
{
this.Name=“BaseSkill”;
}
公共字符串名
{
得到;
设置
}
公共攻击距离
{
得到;
设置
}
公共虚拟void OnBeforeKill()
{
}
Afterkill()上的公共虚拟无效
{
}
公共虚拟void OnBeforeMiss()
{
}
AfterMiss()上的公共虚拟无效
{
}
公共虚拟void OnLifeChange()
{
}
公共虚拟空间()
{
}
}
公务舱卡
{
公共字符串名称{get;set;}
公共字符串类型{get;set;}
/// 
///是否可以用来攻击其他人,如“杀死”牌CanAttack=true,牌“未命中”CanAttack=false
/// 
公共布尔攻击{get;set;}
}
真正的角色、武器和技能:

   public class XiangyuRole : BaseRole
        {
            public XiangyuRole()
            {
                this.Name = "Xiangyu";
                this.MaxLife = 4;
                this.CurrentLife = 4;
                // The role equip skill QinglingSkill by default.
                this.BaseSkills = new List<ISkill>();
                this.BaseSkills.Add(new QinglingSkill());

                this.BaseWeapons = new List<IWeapon>();
                this.BaseWeapons.Add(new RemoveCardsWeapon());
            }
        }

        public class RemoveCardsWeapon : BaseWeapon
        {
            public RemoveCardsWeapon()
            {
                this.Name = "RemoveCardsAfterWeapon";
                this.AttackDistance = 1;
            }

            public override void OnAfterKill()
            {
                //If you make the enemy lose life, you can remove two cards of the enemy instead of losing life.
            }
        }

        public class QinglingSkill : BaseSkill
        {
            public QinglingSkill()
            {
                this.Name = "GetACardAfterMiss";
            }

            public override void OnAfterMiss()
            {
                //if you play a "Miss" card, get a new card
            }
        }
公共类香玉角色:BaseRole
{
公众角色()
{
这个。Name=“项羽”;
这是MaxLife=4;
这是当前寿命=4;
//德法尔的角色装备技能清灵技能