面向对象编程的一次尝试
关于面向对象编程开发,我一直没有系统性的学习,但我现在却渐渐的体会到了代码的设计之美。
每当看到自己之前开发的几个小项目代码,我都会有泉涌的思绪,不能自已。
如今的我正朝着易于维护和扩展的代码设计路线不断前进。
学习别人的优秀设计思想,我将永不止步。
今天我在T2噬菌体的博乐园看到了一个简单的设计题目,不禁花时间自己设计了一把。
很明显,这是一个游戏设计的编程方案,怎样设计的有深度,有美感呢,我尝试了一番。
游戏中的元素众多,每个元素就像一个生命体,所以我创建了一个公共的接口 Iobject,
每个元素一定会有一个名字,先不考虑元素识别Id,接口代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { /// <summary> /// 对象接口 /// </summary> interface IObject { /// <summary> /// 对象名称 /// </summary> string Name{get;set;} } }
简单分析题目里面涉及到了三个元素实体,分别是角色(人物)、武器、怪兽。
接下来分别定义了三个接口:IRole、IWeapon、IMonster
IRole代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { /// <summary> /// 人物接口 /// </summary> interface IRole:IObject { /// <summary> /// 拿的是声明武器 /// </summary> Weapon HaveWeapon{get;set;} } }
IWeapon代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { /// <summary> /// 武器接口 /// </summary> interface IWeapon:IObject { /// <summary> /// 武器损伤HP的值 /// </summary> int CutHp{get;set;} } }
IMonster代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { /// <summary> /// 怪兽接口 /// </summary> interface IMonster:IObject { /// <summary> /// 怪兽的HP值 /// </summary> int HaveHp { get; set;} /// <summary> /// 怪兽遭到袭击方法 /// </summary> /// <param name="role"></param> /// <returns></returns> string GetAttack(Role role); } }
接下来,定义三个元素实体类
Role(继承IRole) 代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { public class Role:IRole { private string _name; private Weapon _haveWeapon; /// <summary> /// 构造 /// </summary> /// <param name="name"></param> /// <param name="haveweapon"></param> public Role(string name,Weapon haveweapon) { this._name = name; this._haveWeapon = haveweapon; } /// <summary> /// 拿的武器 /// </summary> public Weapon HaveWeapon { get { return _haveWeapon; } set { _haveWeapon = value; Console.WriteLine("{0}成功换取了{1}武器",_name,_haveWeapon.Name); } } /// <summary> /// 人物的名称 /// </summary> public string Name { get { return _name; } set { _name = value; } } } }
Weapon(继承IWeapon) 代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { public class Weapon:IWeapon { private int _cuthp; private string _name; /// <summary> /// 构造 /// </summary> /// <param name="weaponname"></param> /// <param name="cuthp"></param> public Weapon(string weaponname,int cuthp) { this._cuthp = cuthp; this._name = weaponname; } /// <summary> /// 武器损血量 /// </summary> public int CutHp { get { return _cuthp; } set { _cuthp=value; } } /// <summary> /// 武器名称 /// </summary> public string Name { get { return _name; } set { _name = value; } } } }
Monster(继承IMonster) 代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { /// <summary> /// 怪兽 /// </summary> public class Monster : IMonster { private int _havehp; private string _name; private bool _state; /// <summary> /// 是否爆袭 /// </summary> /// <returns></returns> public bool IsBoom() { Random random = new Random(); int ss=random.Next(4); return ss>=2?true:false; } /// <summary> /// 构造 /// </summary> /// <param name="name"></param> /// <param name="havehp"></param> public Monster(string name, int havehp) { if (havehp > 0) { this._name = name; this._havehp = havehp; this._state = true; Console.WriteLine("怪兽{0}诞生,PH:{1}", _name,_havehp); } else { return; } } /// <summary> /// 怪兽的HP值 /// </summary> int IMonster.HaveHp { get { return _havehp; } set { _havehp = value; } } /// <summary> /// 怪兽的名字 /// </summary> string IObject.Name { get { return _name; } set { _name = value; } } /// <summary> /// 怪兽的状态 /// </summary> public bool State { get { return _state; } set { _state = value; } } /// <summary> /// 怪兽遭到袭击 /// </summary> /// <param name="role"></param> /// <returns></returns> public string GetAttack(Role role) { if (this._state) { if (IsBoom()) { this._havehp -= role.HaveWeapon.CutHp * 2; if (this._havehp > 0) { return String.Format("怪兽{0}被{1}用{2}爆袭了一次,还有PH:{3}", _name, role.Name, role.HaveWeapon.Name, _havehp); } else { this._state = false; return String.Format("怪兽{0}已死", _name); } } else { this._havehp -= role.HaveWeapon.CutHp; if (this._havehp > 0) { return String.Format("怪兽{0}被{1}用{2}普袭了一次,还有PH:{3}", _name, role.Name, role.HaveWeapon.Name, _havehp); } else { this._state = false; return String.Format("怪兽{0}已死", _name); } } } else { return string.Empty; } } } }
定义全部OK了,可以进行测试了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
namespace GameTest { class Program { static void Main() { Monster monster = new Monster("大鬼王", 150); Role role1 = new Role("小绅士", new Weapon("木剑", 5)); Role role2 = new Role("小哈哈", new Weapon("钢剑", 10)); Console.WriteLine(monster.GetAttack(role1)); Console.WriteLine(monster.GetAttack(role2)); Console.WriteLine(monster.GetAttack(role2)); role1.HaveWeapon = new Weapon("神盾", 12); Console.WriteLine(monster.GetAttack(role1)); Console.WriteLine(monster.GetAttack(role2)); Console.WriteLine(monster.GetAttack(role1)); Console.WriteLine(monster.GetAttack(role2)); Console.ReadKey(); } } }
整个项目简单结构:
结果:
不知道为什么,在一次运行中,调试着走的时候还可以出现随机性的爆袭和普袭,但直接运行结果一直是清一色的爆袭或普袭。