• C#笔记(十)——类的应用——打僵尸作业


    课后题:
    第一题 定义一个打印机类(printer)。需求:
    1. 采用单例模式
    2. 定义成员变量:打印机IP地址(静态变量),打印数量,纸张类型(数值为枚举类型)
    3. 定义方法:根据打印机IP地址连接打印机;打印功能;打印失败提醒功能

    第二题 模拟打僵尸。需求:
      定义僵尸类:
    公共成员变量:类型、总血量、每次失血量
    方法:初始化方法(设置僵尸种类,总血量)、被打击失血(抽象方法)、死亡(抽象方法)

     定义普通僵尸类继承于僵尸类

    定义有防具(路障)僵尸类继承于僵尸类:
    特有成员变量:防具类型
    特有方法:防具被打烂

    定义铁桶僵尸类继承于有防具僵尸:
    特有成员变量:弱点
    特有方法:防具被磁铁吸走

    1、创建普通僵尸对象,设置总血量50,每次失血量为 3
    2、创建路障僵尸对象,设置总血量80,有路障时,每次失血量为 2
    3、创建铁桶僵尸对象,设置总血量120,有铁桶时,每次失血量为 1
    4、选作:
    在Main方法里面里用循环语句模拟攻击:
    三个僵尸对象同时被攻击:
    (1)、普通僵尸被打击时:每次失血3.
    (2)、路障僵尸被打击时:有路障时,每次失血2,血量剩余一半时,防具被打拦,之后每次失血3.
    (3)、铁桶僵尸被打击时:有铁桶时,每次失血1,血量剩余1/3时,铁桶被打拦,之后每次失血3.
    循环攻击过程中:每个僵尸被攻击时,输出本次丢失血量,剩余血量。失去道具时,输出丢失的道具。僵尸死亡时,输出已死亡。
    最后一个僵尸死亡时,攻击停止,循环结束。输出总攻击次数。
    /*------------------------------------------------------*/
    打僵尸
    using System;
     
    namespace Zombie
    {
     
        //创建僵尸的基类,把共有的字段和方法写在基类里面
        //子类就可以直接调用或者重写方法
        class Zombie
        {
            //血量
            public int HP { get; set; }
            //失血量
            public int LP { get; set; }
            //虚方法,由子类重写,如果子类不重写,则调用父类
            //里面的方法,如普通僵尸就是调用的父类里面的方法
            public virtual void BeAttacked()
            {
                //打印血量的值
                Console.WriteLine("僵尸的血量hp:" + HP);
                //血量减去失血量
                HP -= LP;
     
                //如果血量小于或者等于0
                if (HP <= 0)
                {
                    HP = 0;
                    //调用死亡的方法
                    Die();
                }
            }
            //虚方法,当僵尸的血量小于或者等于0时调用该方法
            public virtual void Die()
            {
                Console.WriteLine("僵尸死亡" );
            }
        }
        //普通僵尸继承僵尸的基类,所有的方法都是调用的基类的
        class Normal : Zombie
        {
            //给普通僵尸字段初始化
            public Normal(int hp, int lp)
                : base()
            {
                this.HP = hp;
                this.LP = lp;
            }
        }
        //定义路障僵尸类继承于僵尸类
        class RoadBlock : Zombie
        {
            public RoadBlock()
            {
     
            }
            //初始化赋值,用带参数的构造方法
            public RoadBlock(int hp, int lp, bool haveRoad)
                : base()
            {
                this.HP = hp;
                this.LP = lp;
                this.haveRoadBlock = haveRoad;
            }
            //该字段是受保护的,只能在子类和父类内部使用
            //字段的含义是是否有路障,初始值为true
            protected bool haveRoadBlock;
            //重写被攻击的方法
            public override void BeAttacked()
            {
                Console.WriteLine("路障僵尸血量:" + this.HP);
                //血量减去失血量
                this.HP -= this .LP;
     
                //当血量小于或者等于总血量的一半时
                if (this .HP <= 40)
                {
                    //路障丢失,调用路障丢失的方法
                    DefenceLost();
                }
                //如果没有路障,则把失血量改为3
                if (haveRoadBlock == false )
                {
                    this.LP = 3;
                }
                //如果血量小于0,调用死亡的方法
                if (this .HP <= 0)
                {
                    this.HP = 0;
                    Die();
     
                }
            }
            //虚方法,子类进行重写,丢失路障的方法
            public virtual void DefenceLost()
            {
                haveRoadBlock = false;
                Console.WriteLine("丢失路障" );
            }
            //重写了父类里面的虚方法
            public override void Die()
            {
                Console.WriteLine("路障僵尸死亡" );
            }
        }
        //铁桶僵尸继承路障僵尸
        class Bucket : RoadBlock
        {
            //初始化
            public Bucket(int hp, int lp, bool haveBucket)
                : base()
            {
                this.HP = hp;
                this.LP = lp;
                this.haveRoadBlock = haveBucket;
            }
            //重写了受到攻击的方法
            public override void BeAttacked()
            {
                Console.WriteLine("铁桶僵尸的血量:" + this.HP);
                this.HP -= this .LP;
     
                if (this .HP <= 40)
                {
                    DefenceLost();
                }
                if (haveRoadBlock == false )
                {
                    this.LP = 3;
                }
                if (this .HP <= 0)
                {
                    this.HP = 0;
                    Die();
                }
            }
     
            public override void Die()
            {
                Console.WriteLine("铁桶僵尸死亡" );
            }
     
        }
     
        class MainClass
        {
            public static void Main( string[] args)
            {
                Normal normal = new Normal(50, 3);
                RoadBlock road = new RoadBlock(80, 2, true);
                Bucket bucket = new Bucket(120, 1, true);
                int num = 1;
                do
                {
                    Console.WriteLine("第{0}回合" , num);
                    num++;
                    normal.BeAttacked();
                    road.BeAttacked();
                    bucket.BeAttacked();
                    //如果三种僵尸的血量都小于0,跳出循环
                    if (normal.HP <= 0 && road.HP <= 0 && bucket.HP <= 0)
                    {
                        break;
                    }
                } while (true );
                Console.ReadKey();
            }
        }
    }
  • 相关阅读:
    理解BSTR数据类型 神奇的BSTR
    char *
    _variant_t和_bstr_t
    数据库中创建表(包括创建主键,外键,非空列,唯一)
    使用ADO实现BLOB数据的存取 -- ADO开发实践之二
    sql server 2005 修改动态端口,连接字符串为:需要改成:IP地址+逗号+端口号才行
    Bilateral Filtering(双边滤波) for SSAO
    关于在Arduino中调用DS1302模块
    关于电机驱动扩展板 L293D 马达板Arduino
    Arduino教程资料汇总(8月22日悄悄跟新了一下)
  • 原文地址:https://www.cnblogs.com/ningyongbin/p/5922228.html
Copyright © 2020-2023  润新知