zoukankan      html  css  js  c++  java
  • “奥特曼“与”小怪兽”的继承者们之战

    练习
    回合制对战游戏:奥特曼A和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
    如果奥特曼A胜利,则奥特曼A和奥特曼B进行Pk,直到一方的血量为0时结束战斗,输出谁胜利了!
    如果小怪兽A胜利,则小怪兽A和小怪兽B进行Pk,直到一方的血量为0时结束战斗,输出谁胜利了!

      首先要弄清楚奥特曼A与奥特曼B是父类与子类的关系,所以子类是可以继承到父类所有的(任何访问修饰符的属性和方法)属性的和方法的,从而可以提高代码的重用性以及程序的扩展性。

    下面来看一下代码的实现:

    //设置一个“Ao(奥特曼B)”类

    package D52

    public class Aoa {

     private String name;

    private int attack;

    private int blood;

    public void setName(String a) {

    name = a;

    }

    public String getName() {

    return name;

    }

    public void setAttack(int b) {

    attack = b;

    }

    public int getAttack() {

    return attack;

    }

    public void setBlood(int c) {

    blood = c;

    }

    public int getBlood() {

    return blood;

    }

    public void attack(Mastera x) {

    x.setBlood(x.getBlood() - attack);

    System.out.println(name + "正在攻击" + x.getName() + "," + "小怪兽掉血"

    +attack + "剩余血量" + x.getBlood());//小怪兽掉的血是奥塔曼的攻击力

    if (x.getBlood() <= 0) {

    System.out.println(name + "胜利啦!");

    }

    }

    public void attack(Aob b) {

    b.setBlood(b.getBlood() - attack);

    System.out.println(name + "正在攻击" + b.getName() + "," + "奥特曼B掉血"

    + attack + "剩余血量" + b.getBlood());

    if (b.getBlood() <= 0) {

    System.out.println(name + "胜利啦!");

    }

    }

    }

    //设置一个“Mastera(小怪兽A)”类

    package D521;

    public class Mastera {
    private String name;
    private int attack;
    private int blood;

    public void setName(String x) {
    name = x;
    }

    public String getName() {
    return name;
    }

    public void setAttack(int xb) {
    attack = xb;

    }

    public int getAttack() {
    return attack;
    }

    public void setBlood(int xc) {
    blood = xc;
    }

    public int getBlood() {
    return blood;
    }

    public void attack(Aoa a) {
    a.setBlood(a.getBlood() - attack);
    System.out.println(name + "正在攻击" + a.getName() + "," + "奥特曼掉血"
    + attack+ "剩余血量" + a.getBlood());
    if (a.getBlood() <= 0) {
    System.out.println(name + "胜利啦!");
    }
    }

    public void attack(Masterb bx) {
    bx.setBlood(bx.getBlood() - attack);
    System.out.println(name + "正在攻击" + bx.getName() + "," + "小怪兽B掉血"
    + attack+ "剩余血量" + bx.getBlood());
    if (bx.getBlood() <= 0) {
    System.out.println(name + "胜利啦!");

    }

    }
    }

    //设置一个“Aob(奥特曼B)类”(用继承性)

    package D521;
    //奥特曼B子类继承了奥特曼A父类的所有属性和行为
    public class Aob extends Aoa {
    public void attack(Aoa a) {
    a.setBlood(a.getBlood() - getAttack());
    System.out.println(getName() + "正在攻击" + a.getName()+ "," + "奥特曼B掉血"
    + getAttack()+ "剩余血量" + a.getBlood());//尤其要注意的是,我的attack的访问修饰符是private,所以不能直接使用,要用“getAttack”去调用它
    if (a.getBlood() <= 0) {
    System.out.println(getName() + "胜利啦!");
    }
    }
    }

    //设置一个“Masterb(小怪兽B)”类

    package D521;
    public class Masterb extends Mastera {
    public void attack( Mastera x){
    x.setBlood(x.getBlood()-getAttack());
    System.out.println(x.getName()+"正在攻击"+getName()+","+"奥特曼B掉血"+getAttack()+"剩余血量"+x.getBlood());
    if(x.getBlood()<=0){
    System.out.println(getName()+"胜利啦!");
    }
    }
    }

    //最后再设置一个主函数,即”Manger“

    package D521;
    public class Manger {
    public static void main(String args[]) {
    Aoa a = new Aoa();
    a.setName("奥特曼A");
    a.setBlood(100);
    a.setAttack(30);
    Mastera x = new Mastera();
    x.setName("小怪兽A");
    x.setBlood(100);
    x.setAttack(20);
    Aob b = new Aob();
    b.setName("奥特曼B");
    b.setBlood(100);
    b.setAttack(20);
    Masterb bx = new Masterb();
    bx.setName("小怪兽B");
    bx.setBlood(100);
    bx.setAttack(30);
    while (a.getBlood() > 0 && x.getBlood() > 0) {
    a.attack(x);
    if (x.getBlood() <= 0) {
    break;
    }
    x.attack(a);
    if (a.getBlood() <= 0) {
    break;
    }

    }
    if (a.getBlood() > 0) {
    while (a.getBlood() > 0 && b.getBlood() > 0) {
    a.attack(b);
    b.attack(a);
    }
    }
    if (x.getBlood() > 0) {
    while (a.getBlood() > 0 && x.getBlood() > 0) {

    x.attack(bx);
    bx.attack(x);
    }
    }

    }
    }

    但是上述的代码还是太繁琐了,我用到了类的继承性,但是使用得并不灵活,我们还可以用到自动转型,更加方便。

    思路是:奥特曼A  PK 小怪兽A

                            PK  奥特曼B

        小怪兽A  PK   奥特曼A

                            PK   小怪兽B

    如果按照上面的写法,则需要写成:

    PK{
    PK(Aoa a){ a.attack(); }
    PK(Aob b){ b.attack(); }
    PK(Monstera ax){ ax.attack(); }
    PK(Monsterb bx){ bx.attack(); }

    }

    现在只需要:

    PK(Role role){role.PK()}//这就是自动转型的思维

    所以我们可以把奥特曼A、B,小怪兽A、B都当做一个个的角色,这个小程序就是角色与角色之间的PK

      //定义一个Role类

    public class Role {
    public String name;
    public int blood;
    public int attack;

    public void PK(Role role) {
    role.blood -= attack;
    System.out.println(name + "正在攻打" + role.name + "," + role.name
    + "剩余血量是:" + role.blood);
    }

    }

    接下来就是Ao类和Monster类继承role类的所有属性和功能:

    //Ao类继承role类的所有属性和功能

    package s522;

    public class Ao extends Role{

    }

    //Monster类继承role类的所有属性和功能

    package s522;

    public class Monster extends Role{

    }

    最后建立一个主函数,即Manger类

    package s522;

    public class Manger {
    public static void main(String[] args) {
    Ao a1 = new Ao();//可以替换为Role a1 =new Ao();
    a1.name = "奥特曼A";
    a1.blood = 100;
    a1.attack = 5;
    Ao a2 = new Ao();
    a2.name = "奥特曼B";
    a2.blood = 100;
    a2.attack = 5;
    Monster m1 = new Monster();
    m1.name = "小怪兽A";
    m1.blood = 100;
    m1.attack = 3;
    Monster m2 = new Monster();
    m2.name = "小怪兽B";
    m2.blood = 100;
    m2.attack = 3;
    while (a1.blood > 0 && m1.blood > 0) {
    a1.PK(m1);
    if (m1.blood <= 0) {
    System.out.println(a1.name + "胜利!");
    break;
    }
    m1.PK(a1);
    if (a1.blood <= 0) {
    System.out.println(m1.name + "胜利!");
    break;
    }
    }

    if (a1.blood > 0) {
    while (a1.blood > 0 && a2.blood > 0) {
    a1.PK(a2);
    if (a2.blood <= 0) {
    System.out.println(a1.name + "胜利!");
    break;
    }
    a2.PK(a1);
    if (a1.blood <= 0) {
    System.out.println(a2.name + "胜利!");
    break;
    }
    }
    }

    else {
    while (m2.blood > 0 && m1.blood > 0) {
    m2.PK(m1);
    if (m1.blood <= 0) {
    System.out.println(m2.name + "胜利!");
    break;
    }
    m1.PK(m2);
    if (m2.blood <= 0) {
    System.out.println(m1.name + "胜利!");
    break;
    }
    }
    }

    }
    }

    运行的结果:

    今日小感悟:

    1用“Alt+/?”快捷键可以得到输入的提示

    2右击鼠标,source中的format可以自动调整格式

    3自动转型的思维:

    自动转型的格式:
    父类名 对象名 = new 子类名();
    例如:Role a1 = new Ao();相当于Ao a1 = new Ao;
    使用自动转型后的缺点是:
    无法调用父类中没有定义过的属性和方法;如果调用就会编译报错。
    这是因为Java的编译机制所引起的问题,Java在编译时只会考虑对象名的类型(在编译过程中,会根据对象名的类型,去查找这些调用的属性和方法是否存在,如果存在则编译通过,如果不存在则编译报错)

    4 private访问修饰符修饰的方法不能重写;final修饰的方法不能重写。

    5怎样调用重写后的方法呢?
    new关键字后的类名是谁的,那么就优先调用睡的方法。
    如果类名是子类的,那么会优先调用子类的方法,如果子类没有这个方法,才会调用父类的方法.

    6什么情况要使用方法重写:父类中存在某一个方法,但是子类也有这个方法,但是方法的具体实现不同的时候。
    例如:父类有一个看书学习的方法,子类也有一个看书学习的方法,但是两者不完全一致。
    例如:父母有一个做饭的方法,子女也有一个做饭的方法,但是两者做饭的方式是不完全一致。

    如果存在上述的情况,需要使用方法重写来实现,实现方法重写的条件:
    a.必须要存在继承关系。
    b.子类在重写父类方法时,子类方法的访问修饰符要比父类方法的访问修饰符范围大或者一致。
    c.子类在重写父类方法时,子类方法的返回值类型,方法名,参数都要和父类方法的完全一致。
    d.子类在重写父类方法时,子类方法中的代码必须要和父类方法的代码不同。

     7为什么需要使用继承?

    a.提高代码的重用性;
    b.提高程序的扩展性;

     8Java继承的语法格式

    Java继承的关键字:extends
    格式:
    public class 类名(子类、派生类、超类) extends 类名(父类、基类) {

    }

    生活中什么样的关系需要使用继承来实现呢?
    包含关系:学生包含大学生、初中生、...
    父母子女的关系

    9

    访问修饰符       同类中   同包中   不同包中   不同包但是有继承关系的子类中
    private      可以    不可以     不可以     不可以
    默认的       可以    可以      不可以      不可以
    protected    可以    可以      不可以       可以
    public        可以    可以    可以         可以

     

  • 相关阅读:
    手动访问和传参
    子路由
    matlab 不同尺度的矩阵存储
    贝叶斯决策
    vim的使用
    linux另一种安装方式
    Linux中profile、bashrc、bash_profile之间的区别和联系
    emacs编辑器的使用
    关于鼠标不敏感导致自以为ubuntu很怪的问题
    各种可以远程
  • 原文地址:https://www.cnblogs.com/java-7/p/5515568.html
Copyright © 2011-2022 走看看