今天下午无聊在玩一款ipad游戏,大掌门。玩法是:你有5个格子,每个格子有一个英雄。组成英雄组和别人pk。其中英雄人物比较有意思,比如我有个英雄叫周芷若,比如他装备倚天剑的时候战斗力增加15%,和灭绝师太一起战斗时候,血量增加15%。这就相当于一个特定的buffer机制,这种业务如何设计比较好呢?已英雄作为一个被装饰者?拿武器,人物装饰?还是单独设计物品系统?倚天剑的话,里面判断如果使用者是XXX就do something?
以你举得例子定义一个简单结构给你看
//人物属性枚举 enum Attribute { ATK, HP, MP, DEF } //队伍 class Team { List<Role> roles=new List<Role>(); } //角色父类 class Role { public int ID;//人物ID public int ATK { get; set; }//攻击力 public int HP { get; set; }//血量 public int MP { get; set; }//魔法值 public int DEF { get; set; }//防御 public List<EquipMent> EquipMents=new List<EquipMent>();//装备 } //装备父类 class EquipMent { public int ID { get; set; }//装备ID public string Name { get; set; }//装备名字 public Effect Effect { get; set; }//装备效果 } //效果父类 class Effect { public Attribute Attribute { get; set; }//对应属性 public int Percent{ get; set; }//提升百分比 public int Num{ get; set; }//提升数值 }
首先是有一个队伍对象,里面存放了最多5个的Role,即5个角色。每个角色有4个属性,和枚举Attribute对应。然后有一个装备列表。每个装备有3个属性,ID、名字和效果。比方说倚天剑,它的ID是1(这个真做游戏的时候就有用了),名字倚天剑,效果是攻击力提高15%,那就是Attribute=Attribute.ATK,Percent=15,Num=0。给角色周芷若装备之后,当你要读取周芷若的属性时,你得先遍历她的装备列表,把每样属性加上去。
至于组队的加成,那得在Team对象的方法里进行计算,由于每个角色都有一个ID,你可以先设置一个规则,当队伍里ID为1的对象和ID为2的对象同时存在时,ID为1的对象血量增加15%。
//角色父类 class Role { public int ID;//人物ID public int HP { get; set; }//血量 public int MP { get; set; }//魔法值 public int DEF { get; set; }//防御 public List<EquipMent> EquipMents=new List<EquipMent>();//装备 private int atk;//攻击力 public int ATK { get { int atk2 = atk; //遍历装备列表 foreach (EquipMent equipMent in EquipMents) { //属性为攻击 if (equipMent.Effect.Attribute == Attribute.ATK) { //获取加成后结果 atk2 = (int)(atk2 * equipMent.Effect.Percent * 0.01 + equipMent.Effect.Num); } } return atk2; } set { atk = value; } } }
详细的获取攻击力方法