面向对象编程的一次尝试

关于面向对象编程开发,我一直没有系统性的学习,但我现在却渐渐的体会到了代码的设计之美。

每当看到自己之前开发的几个小项目代码,我都会有泉涌的思绪,不能自已。

如今的我正朝着易于维护和扩展的代码设计路线不断前进。

学习别人的优秀设计思想,我将永不止步。

 

今天我在T2噬菌体的博乐园看到了一个简单的设计题目,不禁花时间自己设计了一把。

很明显,这是一个游戏设计的编程方案,怎样设计的有深度,有美感呢,我尝试了一番。

游戏中的元素众多,每个元素就像一个生命体,所以我创建了一个公共的接口  Iobject,

每个元素一定会有一个名字,先不考虑元素识别Id,接口代码如下:

namespace GameTest
{
    /// <summary>
    /// 对象接口
    /// </summary>
    interface IObject
    {
        /// <summary>
        /// 对象名称
        /// </summary>
        string Name{get;set;}
    }
}
View Code

简单分析题目里面涉及到了三个元素实体,分别是角色(人物)、武器、怪兽。

接下来分别定义了三个接口:IRole、IWeapon、IMonster

IRole代码:

namespace GameTest
{
    /// <summary>
    /// 人物接口
    /// </summary>
    interface IRole:IObject
    {
        /// <summary>
        /// 拿的是声明武器
        /// </summary>
        Weapon HaveWeapon{get;set;}      
    }
}
View Code

IWeapon代码:

namespace GameTest
{
    /// <summary>
    /// 武器接口
    /// </summary>
    interface IWeapon:IObject
    {
        /// <summary>
        /// 武器损伤HP的值
        /// </summary>
        int CutHp{get;set;}
    }
}
View Code

IMonster代码:

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);
    }
    
}
View Code

接下来,定义三个元素实体类

Role(继承IRole)  代码:

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

Weapon(继承IWeapon)  代码:

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

Monster(继承IMonster)  代码:

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

    }
}
View Code

定义全部OK了,可以进行测试了

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();
        }
    }
}
View Code

整个项目简单结构:

结果:

不知道为什么,在一次运行中,调试着走的时候还可以出现随机性的爆袭和普袭,但直接运行结果一直是清一色的爆袭或普袭。

 

posted @ 2015-08-06 15:20  凯帝农垦  阅读(239)  评论(0编辑  收藏  举报