如何设计具有大量技能的可扩展纸牌游戏

时间:2016-10-20 07:47:26

标签: c# unity3d

现在我想写一个像中国游戏“三国传说”的游戏。 玩家可以打牌,可以破坏其他牌,对于一个简单的情况,如果你打牌“杀”对敌人,如果敌人不打牌像“小姐”他会失去生命点。 如果我装备了一个名为“强化”的技能,其功能是如果你让敌人失去生命,你有可能让敌人失去一个生命点, 如果我装备了一个名为“龙林岛”的武器,其功能是如果你通过卡片“杀死”使敌人失去生命,你可以选择移除敌人的两张牌而不是让他失去生命。 有上面两种技能和武器,技能不卡和角色绑定,武器与手牌不同,功能不同,大多数武器可以增加攻击距离。

我不确定你是否能理解游戏的玩法,更多细节你可以阅读wiki https://en.wikipedia.org/wiki/Legends_of_the_Three_Kingdoms

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

我的目标是让技能可以装备任何角色,如武器,我可以随着时间的推移轻松创造许多新技能和武器。

例如,我想制作一项新技能,其功能是如果你通过卡片“杀死”使敌人失去一个生命点,你可以增加一个生命点。 我想制作一项新技能,其功能是,如果我玩“小姐”卡,我可以获得一张新卡等等。

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

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; }

    }

真正的角色,武器和技能:

   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
            }
        }

我的问题

一个角色可以同时装备多种技能和不同的武器,一旦你打牌就可能引发很多事件。 那么如何控制不同技能和武器提供的事件呢?它们可能是独占的,也可能不是,以及如何控制事件的触发顺序? 有没有更好的方法来实现目标?

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

我会使用更多的界面隔离。每个可能事件一个接口(而不是ICommonEvents上的方法)。然后在&#34;游戏中使用Publish-Subscribe&#34;用于处理事件的对象。让每个&#34;卡&#34;收到所有事件的通知,但只处理它关心的事件。