关于abstract中遇到的问题

所做东西的需求:

定义英雄类和Boss类,创建3个英雄对象,分别拿不同的武器,对敌人循环回合制攻击,输出战斗过程。

英雄类:特征:HP、MP、类型(枚举类型:弓箭手、法师、骑士)、武器 行为:攻击、防御

Boss类:特征:HP、攻击力、防御力 行为:攻击

using System;
using System.Collections;
using System.Collections.Generic;

namespace Exam
{
    /// <summary>
    /// 根据武器类型判断是否能进行装备
    /// boss死亡掉落装备
    /// 能够穿戴多件装备
    /// 多人组队一起打Boss
    /// </summary>
    class MainClass
    {
        public static void Start()
        {
            bool flag1, flag2,flag3;
            Weapon we1 = new Wand (40);
            Weapon we2 = new Yataghan (20, 20);
            Weapon we3 = new Bow (40);
            Weapon we4 = new Bow (50);

            Boss boss = new Boss (1000,50,50);

            Hero hero = new Hero (500,60,"战神",20,30,heroType.弓箭手);
            hero.addWeapon (we3);
            hero.addWeapon (we4);

            //Hero hero1=new Hero(500,60,"擎天",20,30,heroType.战士);
            //hero1.addWeapon (we2);

            //如果装备无法匹配
            hero.addWeapon(we2);

            while (true)
            {
                flag1=hero.hitBoss (boss);
                if (!flag1)
                {
                    break;
                }
                //flag3 = hero1.hitBoss (boss);
                //if (!flag3)
                //{
                //    break;
                //}
                flag2=boss.hitHero (hero);
                if (!flag2)
                {
                    break;
                }

            }
            Console.WriteLine ();
            Console.WriteLine (hero);
            Console.WriteLine ("其中的装备属性如下:");
            foreach (var item in hero.list)
            {
                Console.WriteLine (item);
            }


        }

        public static void Main(string[] args)
        {
            Start ();
        }
    }
    enum heroType 
    {
        弓箭手,战士,法师
    }
    /// <summary>
    /// 英雄类
    /// </summary>
    class Hero
    {
        private int hp;//英雄血量
        private int ap;//英雄攻击力
        private string name;//英雄名称
        private int dp;//英雄防御力
        private int speed;//英雄移动速度

        private heroType type;//英雄的类型

        //装备背包
        public List<Weapon> list=new List<Weapon>();

        public int Hp
        {
            get
            {
                return hp;
            }
            set
            {
                hp = value;
            }
        }

        public int Ap
        {
            get
            {
                return ap;
            }
            set
            {
                ap = value;
            }
        }

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public int Dp
        {
            get
            {
                return dp;
            }
            set
            {
                dp = value;
            }
        }

        public int Speed
        {
            get
            {
                return speed;
            }
            set
            {
                speed = value;
            }
        }

        public heroType Type
        {
            get
            {
                return type;
            }
            set
            {
                type = value;
            }
        }
        //当前装备的武器的攻击力总和
        public int sumWeapon=0;

        //构造方法
        public Hero(int hp,int ap,string name,int dp,int speed,heroType type)
        {
            this.hp = hp;
            this.ap = ap;
            this.name = name;
            this.dp = dp;
            this.speed = speed;
            this.type = type;


        }
        //加装备
        public void addWeapon(Weapon weapon)
        {
            if (this.type==heroType.弓箭手)
            {

                if (weapon.Type=="弓箭")
                {
                    this.ap += weapon.addap;
                    list.Add (weapon);
                    Console.WriteLine ("装配弓箭成功!!!,英雄添加攻击力:{0}",weapon.addap);
                    Console.WriteLine ("-------------------------------------------");
                }

                else {
                    Console.WriteLine ("无法成功装配,因为武器类型不符!!!");
                    Console.WriteLine ("-------------------------------------------");
                }
            }
            else if (this.type==heroType.战士)
            {
                if (weapon.type=="长剑")
                {
                    this.ap += weapon.addap;
                    this.dp += weapon.addport;
                    list.Add (weapon);
                    Console.WriteLine ("装配长剑成功!!!,英雄添加攻击力:{0},防御力:{1}",weapon.addap,weapon.addport);
                    Console.WriteLine ("-------------------------------------------");
                }
                else {
                    Console.WriteLine ("无法成功装配,因为武器类型不符!!!");
                    Console.WriteLine ("-------------------------------------------");
                }
            }
            else if (this.type==heroType.法师)
            {
                if (weapon.type=="法杖")
                {
                    this.ap += weapon.addap;
                    list.Add (weapon);
                    Console.WriteLine ("装配法杖成功!!!,英雄添加攻击力:{0}",weapon.addap);
                    Console.WriteLine ("-------------------------------------------");
                }
                else
                {
                    Console.WriteLine ("无法成功装配,因为武器类型不符!!!");
                    Console.WriteLine ("-------------------------------------------");
                }
            }

        }

        //攻击Boss
        public bool hitBoss(Boss boss)
        {
            Random random = new Random ();
            if (boss.Hp<=0)
            {
                Console.WriteLine ("Boss死亡!!!!!");
                Console.WriteLine ("----------------------------------------------");
                Console.WriteLine ("掉落装备如下:");
                boss.DropEquip ();
                Console.Write ("您是否要拾取全部装备(Y:拾取,N:不拾取):");
                char ch =Convert.ToChar(Console.Read ());
                switch (ch)
                {
                    case 'Y':
                    case 'y':
                        for (int i = 0; i < boss.list.Count; i++)
                        {
                            list.Add (boss.list [i]);
                        }
                        Console.WriteLine ("拾取成功!!!!!");
                        break;
                    case 'N':
                    case 'n':
                        Console.WriteLine ("拾取失败!!!!!");
                        break;
                    default:
                        Console.WriteLine ("没有此选择,默认拾取了!!!!!");
                        for (int i = 0; i < boss.list.Count; i++)
                        {
                            list.Add (boss.list [i]);
                        }
                        Console.WriteLine ("拾取成功!!!!!");
                        break;
                }
                return false;

            }
            else if(boss.Hp>0&&hp>0)
            {
                
                for (int i = 0; i < list.Count; i++)
                {
                    sumWeapon += list [i].addap;
                }
                int defend = random.Next (0, boss.Dp);

                boss.Hp -= (this.ap +sumWeapon - defend);

                Console.WriteLine ("Boss受到了{2}  {0}点攻击,剩余血量:{1}",(ap + sumWeapon - defend),boss.Hp,name);

                return true;
            }
            return true;
        }
        public override string ToString()
        {
            return string.Format("{2}英雄身上有{0}件装备,其剩余血量为{1},攻击力为:{3},防御力为:{4},速度为:{5},职业为:{6}",list.Count, Hp, Name,Ap, Dp, Speed, Type);
        }
    }

    /// <summary>
    /// Boss类
    /// </summary>
    class Boss
    {
        private int hp;
        private int ap;
        private int dp;

        public List<Weapon> list=new List<Weapon>();
        public int Hp
        {
            get
            {
                return hp;
            }
            set
            {
                hp = value;
            }
        }

        public int Ap
        {
            get
            {
                return ap;
            }
            set
            {
                ap = value;
            }
        }

        public int Dp
        {
            get
            {
                return dp;
            }
            set
            {
                dp = value;
            }
        }


        public void DropEquip()
        {
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine ("第{0}件装备属性如下:攻击力提升:{1},防御力提升:{2}",(i+1),list[i].addap,list[i].addport);
            }
        }

        public Boss(int hp,int ap,int dp)
        {
            this.ap = ap;
            this.hp = hp;
            this.dp = dp;

            Weapon we1 = new Wand (100);
            Weapon we2 = new Yataghan (60, 40);
            Weapon we3 = new Bow (80);
            list.Add (we1);
            list.Add (we2);
            list.Add (we3);
        }

        //攻击英雄
        public bool hitHero(Hero hero)
        {
            if (hero.Hp<=0)
            {
                Console.WriteLine ("英雄死亡!!!!!");
                Console.WriteLine ("-------------------------------------------------");
                return false;

            }
            else if(hero.Hp>0&&hp>0)
            {
                hero.Hp -= (this.Ap - hero.Dp);
                Console.WriteLine ("{2}英雄受到了{0}点攻击,剩余血量为{1}",(this.Ap - hero.Dp),hero.Hp,hero.Name);
                return true;
            }
            return true;
        }

    }

    /// <summary>
    /// 装备类
    /// </summary>
    public  class Equipment
    {
        private string name;
    }
    /// <summary>
    /// 武器类
    /// </summary>
    public abstract class Weapon:Equipment
    {
        //等级
        private int grade;
        //攻击力
        private int ap;

        public string type;

        public string Type
        {
            get
            {
                return type;
            }
        }

        //增加攻击力
        public int addap;
        //增加防御力
        public int addport;
        //攻击
        public abstract void Attack();

    }
    /// <summary>
    /// 法杖类
    /// </summary>
    class Wand:Weapon
    {
        public Wand(int addap)
        {
            this.addap = addap;
            this.type = Type;
            type="法杖";
        }

        public override void Attack()
        {
            Console.WriteLine ("进行了魔法攻击!!!!!");
        }
        public override string ToString()
        {
            return string.Format("武器为:法杖,增加的攻击力为:{0},增加的防御力为:{1}",addap,addport);
        }
    }
    /// <summary>
    /// 弓箭类
    /// </summary>
    class Bow:Weapon
    {

        public Bow(int addap)
        {
            this.addap = addap;
            type="弓箭";
        }

        public override void Attack()
        {
            Console.WriteLine ("进行了物理攻击!!!!!");
        }
        public override string ToString()
        {
            return string.Format("武器为:弓箭,增加的攻击力为:{0},增加的防御力为:{1}",addap,addport);
        }
    }
    /// <summary>
    /// 长剑类
    /// </summary>
    class Yataghan:Weapon
    {
       

        public Yataghan(int addap,int power)
        {
            this.addap = addap;
            this.addport = power;
            type="长剑";
        }
            
        public override void Attack()
        {
            Console.WriteLine ("进行了物理攻击!!!!!");
        }
        public override string ToString()
        {
            return string.Format("武器为:长剑,增加的攻击力为:{0},增加的防御力为:{1}",addap,addport);
        }
    }
    /// <summary>
    /// 防具类
    /// </summary>
    class Power:Equipment
    {
        //防御力
        private int dp;
        //耐久度
        private int durability;

        //破损
        public void Damaged()
        {
            
        }
    }
}

  在此应用设计的过程中遇到的问题为:当将一个类定义为抽象类的时候,抽象类中拥有的字段,在子类中千万不要进行定义,如果进行定义 那么子类所进行赋值的字段值将会覆盖父类其对应字段的值,这样会出现让你意想不到的错误,

  当使用抽象类地时候  我们应该牢牢记住几点:

  1.抽象类必须用abstract来修饰,抽象方法必须用abstract来修饰,抽象方法不能有方法体;

    2.抽象类不能被实例化,无法用new来创建该类的实例;

    3.包含抽象对象的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用new操作符创建该类的实例。这种类是用来定义新子类的基类的。 

    4.含有抽象方法的类:直接在类中顶一个抽象的方法,或者继承了父类的抽象类,为完全实现,父类里面的方法,或者实现了一个接口,为全部实现里面的方法。

 5.不能使用new操作符来从抽象类创建一个实例,但是抽象类可以作为一种数据类型。

posted @ 2018-03-06 22:24  Hard_Song  阅读(318)  评论(0编辑  收藏  举报