在C#中
初始版本
namespace _013_桥接模式
{/// <summary>/// 玩家抽象类/// </summary>public abstract class AbstractPlayer{protected IWeapon _weapon;//武器引用public void SetWeapon(IWeapon weapon){_weapon = weapon;}//抽象方法使用武器public abstract void UseWeaponAttack();}
}
namespace _013_桥接模式
{//抽象武器public abstract class IWeapon{public string Name { set; get; } //武器名称public float attackValue { set; get; } //攻击力public abstract void Attack();//攻击//加入怪物的引用public Monster monster { set; get; }/*public Monster Monsters { set;get;}=null;//设置攻击目标
public void SetAttackTarget(Monster monster)
{Monsters=monster;
}*/protected IWeapon(string name, float attackValue){Name = name;this.attackValue = attackValue;}}
}
namespace _013_桥接模式
{/// <summary>/// 玩家接口/// </summary>public interface IPlayer{void UseWeaponAttack();}
}
namespace _013_桥接模式
{public class Mage: AbstractPlayer{ public override void UseWeaponAttack(){Console.WriteLine($"法师使用{_weapon.Name}武器进行攻击!");if (_weapon != null){_weapon.Attack();}}}
}
namespace _013_桥接模式
{public class Warrior:AbstractPlayer{//使用武器public override void UseWeaponAttack(){//面向抽象编程,或者面向接口编程if (_weapon != null){Console.WriteLine($"战士使用{_weapon.Name}武器进行攻击!");_weapon.Attack();}}}
}
namespace _013_桥接模式
{public class Sword:IWeapon{public Sword(string name, float attackValue) : base(name, attackValue){}public override void Attack(){//武器特效逻辑Console.WriteLine($"{Name}大剑攻击!,发出咣当咣当的声音");//调用敌人的减血方法if(monster!=null){//击中敌人后的逻辑Console.WriteLine($"敌人掉了{attackValue}滴血!");monster.TakeDamage(attackValue);}}}
}
namespace _013_桥接模式
{public class Bow:IWeapon{public Bow(string name, float attackValue) : base(name, attackValue){}public override void Attack(){//武器特效逻辑Console.WriteLine($"{Name}搭弓射箭!,发出嗖嗖的声音");//击中敌人后的逻辑Console.WriteLine($"射中敌人,对方很高兴的掉了{attackValue}滴血!");//调用敌人的减血方法 if(monster!=null){//击中敌人后的逻辑Console.WriteLine($"敌人掉了{attackValue}滴血!");monster.TakeDamage(attackValue);}}}
}
namespace _013_桥接模式
{/// <summary>/// 怪物类/// </summary>public class Monster{public string Name { get; set; }public float Hp { get; set; }public Monster(string name, float hp){Name = name;Hp = hp;}public void TakeDamage(float damage){if(damage<Hp){Hp-=damage;}else{Hp = 0;}}}
}
namespace _013_桥接模式
{internal class Program{static void Main(string[] args){Warrior warrior = new Warrior();IWeapon sword = new Sword("风霜小剑",30f);IWeapon bow =new Bow("射日长弓",15f);Monster monster = new Monster("石头鬼",100f);warrior.SetWeapon(sword);sword.monster = monster;
// sword.SetAttackTarget(monster);//设置攻击目标warrior.UseWeaponAttack();}}
}
最终版本
实现玩家之间,玩家和怪物之间相互攻击
新增角色类
namespace _013_桥接模式
{/// <summary>/// 角色基类/// </summary>public abstract class ICharacter{public string Name { get; set; }public float CurrentHP { get; set; }//当前血量public float MaxHP { get; set; } //最大血量//攻击方法public abstract void Attack(ICharacter character);//掉血方法public void TankDamage(float damage){if(CurrentHP > damage)CurrentHP -= damage;elseCurrentHP = 0;}}
}
namespace _013_桥接模式
{/// <summary>/// 玩家抽象类/// </summary>public abstract class AbstractPlayer:ICharacter{public AbstractPlayer(string name,float maxHP){Name = name;MaxHP = maxHP;CurrentHP = MaxHP;}}
}
namespace _013_桥接模式
{public class Warrior : AbstractPlayer{private IWeapon _weapon;//武器引用public Warrior(string name, float maxHP) : base(name, maxHP){}public void SetWeapon(IWeapon weapon){_weapon = weapon;}public override void Attack(ICharacter character){//面向抽象编程,或者面向接口编程if (_weapon != null){Console.WriteLine($"{Name}使用{_weapon.Name}武器进行攻击!");_weapon.Attack();character.TankDamage(_weapon.attackValue);Console.WriteLine($"{character.Name}掉了{_weapon.attackValue}滴血");}}}}
namespace _013_桥接模式
{/// <summary>/// 怪物类/// </summary>public abstract class Monster : ICharacter{public float AILevel { get; set; }public Monster(string name, float maxHP, float aILevel=1){Name = name;MaxHP = maxHP;CurrentHP = maxHP;AILevel = aILevel;}}
}
namespace _013_桥接模式
{/// <summary>/// 石头怪/// </summary>public class StoneMonster : Monster{public StoneMonster(string name, float maxHP, float aILevel = 1) : base(name, maxHP, aILevel){}public override void Attack(ICharacter character){Console.WriteLine($"{Name}对{character.Name}发起攻击");Console.WriteLine($"{character.Name}掉了10f血");character.TankDamage(10);}}
}
namespace _013_桥接模式
{//抽象武器public abstract class IWeapon{public string Name { set; get; } //武器名称public float attackValue { set; get; } //攻击力public abstract void Attack();//攻击protected IWeapon(string name, float attackValue){Name = name;this.attackValue = attackValue;}}
}
namespace _013_桥接模式
{public class Bow:IWeapon{private Monster monster;public Bow(string name, float attackValue) : base(name, attackValue){}public override void Attack(){//武器特效逻辑Console.WriteLine($"{Name}搭弓射箭!,发出嗖嗖的声音");//击中敌人后的逻辑Console.WriteLine($"射中敌人,对方很高兴的掉了{attackValue}滴血!");Console.WriteLine($"敌人掉了{attackValue}滴血!");}}
}
namespace _013_桥接模式
{public class Sword:IWeapon{public Sword(string name, float attackValue) : base(name, attackValue){}private Monster monster;public override void Attack(){//武器特效逻辑Console.WriteLine($"{Name}大剑攻击!,发出咣当咣当的声音");//调用敌人的减血方法if(monster!=null){//击中敌人后的逻辑Console.WriteLine($"敌人掉了{attackValue}滴血!");Console.WriteLine($"掉了{attackValue}滴血");}}}
}
namespace _013_桥接模式
{internal class Program{static void Main(string[] args){Warrior warrior = new Warrior("战士",100f);IWeapon sword = new Sword("风霜小剑",30f);IWeapon bow =new Bow("射日长弓",15f);Monster monster = new StoneMonster("石头鬼",100f,1); warrior.SetWeapon(sword);warrior.Attack(monster);monster.Attack(warrior);}}
}