现在我想写一个像中国游戏“三国传说”的游戏。 玩家可以打牌,可以破坏其他牌,对于一个简单的情况,如果你打牌“杀”对敌人,如果敌人不打牌像“小姐”他会失去生命点。 如果我装备了一个名为“强化”的技能,其功能是如果你让敌人失去生命,你有可能让敌人失去一个生命点, 如果我装备了一个名为“龙林岛”的武器,其功能是如果你通过卡片“杀死”使敌人失去生命,你可以选择移除敌人的两张牌而不是让他失去生命。 有上面两种技能和武器,技能不卡和角色绑定,武器与手牌不同,功能不同,大多数武器可以增加攻击距离。
我不确定你是否能理解游戏的玩法,更多细节你可以阅读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
}
}
我的问题
一个角色可以同时装备多种技能和不同的武器,一旦你打牌就可能引发很多事件。 那么如何控制不同技能和武器提供的事件呢?它们可能是独占的,也可能不是,以及如何控制事件的触发顺序? 有没有更好的方法来实现目标?
感谢您的回复。
答案 0 :(得分:0)
我会使用更多的界面隔离。每个可能事件一个接口(而不是ICommonEvents上的方法)。然后在&#34;游戏中使用Publish-Subscribe&#34;用于处理事件的对象。让每个&#34;卡&#34;收到所有事件的通知,但只处理它关心的事件。