Java中的继承【多人对战】

 继承的概念:

1、在原有的类的基础上快速增加新的功能

2、不影响到原来的类,也不改变原来类的代码,方便对于功能的扩展

3、继承是一种创建新类的方式,新建的类可以继承一个或多个类

4、继承描述的是类和类之间的关系

5、新建的类称为子类,之前存在的类称为父类
继承的规则:子类和父类,有同名的方法和属性,但具体内容不同。

如果子类中不用写任何方法,运行时调用的是从父类继承来的方法!

继承的格式:关键字: extends

                      语法格式: class 子类 extends 父类{

                                                子类特有的属性以及方法

                                                }

自动转型:父类  对象变量名 = new  子类();继承后子类可以是父类类型A  子类重写父类中的方法:

重        写:在子类中重新定义父类中的方法,必须和父类中的方法同名同参重写后,调用时,即调用子类中的方法,未重写,则调用父类中的方法。


        在上篇模拟对战游戏中,只设置了两个对象1v1的情况,现在如果模拟多人对战,则需要增加对象的数量,如果利用类与对象的方法增加对象的话,则需要分别构建多个不同的类,但这些类中的方法和属性基本一致,没有必要给每个对象都构建独立的属性和方法。所以,在这篇中引用了继承的方法,创建一个父类,添加所有对象都具有的属性和方法,使每个子类调用父类中的方法和属性,子类中只需要编写各自独有的方法,如一技能的伤害和升级方法、伤害计算方法等。

package PK;

public class Hero {
    // 属性:
    String playerID;
    String name;
    int hp;//生命值
    int ad;//物理伤害
    int ad_1;//一技能物理伤害
    int ap;//魔法伤害
    int ap_1;//一技能魔法伤害
    int lv; //人物等级
    int lv_1;// 1技能等级
    // 1级初始化
    public void init(String playerID, String name){
        this.playerID = playerID;
        this.name = name;
        this.hp = 3000;
        this.ad = 150;
        this.ap = 0;
        this.lv = 1;
        this.lv_1 = 1;
    }    
    
    //1技能初始化
    public void lv_1(String playerID) {
        this.ad_1 = 100;
        this.ap_1 = 50;
    }
    
    // 方法: 升级 
    public void levelUp(){
        this.lv++;
        this.hp += 100;
        this.ad += 50;
        System.out.println (this.playerID + "(" + name + ")升级了,当前等级:" + this.lv);
    }

     //技能升级
    public void levelUp_1(){
        System.out.print(this.playerID + "(" + name + ")一技能升级 等级:"+ this.lv_1);
        System.out.println ("\n");
        if(this.lv_1>=3) {
            System.out.print("等级已满\n"); 
            }
        else {
            this.lv_1++;
            this.ad_1 += 60;
            this.ap_1 += 20;
        }
    }
}

        上述代码所示的是供子类调用方法和属性的父类,其中包括英雄的基础属性、升级方法。

下述子类分别调用父类中的方法和属性:

package PK;

public class LvBu extends Hero{
    public void attack(Hero hero){
    
    // 伤害计算
    int num = (int) (400 + 200 * (this.lv_1 - 1) + 0.5 * this.ad);
    hero.hp -= num;
    System.out.println (this.playerID + "(" + name + ")对" + hero.playerID + "(" + hero.name + ")造成了" + num +"点伤害");
    System.out.println ("----------" + hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
    if(hero.hp <= 0) {
        System.out.print("("+name+")胜利");
    }
    }
}
package PK;

public class ZHANGFEI extends Hero {
    
    // 方法: 攻击后羿的方法 450/550/650/750/850/950(+100%物理加成)点物理伤害
    public void attack(Hero hero){

    int num = (int) (450 + 100 * this.lv + 1 * this.ad + this.ad_1 + this.ap_1);
    hero.hp -= num;
    System.out.println (this.playerID + "(" + name + ")对" + hero.playerID + "(" +hero.name + ")造成了" + num + "点伤害");
    System.out.println ("----------" + hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
    if(hero.hp <= 0) {
        System.out.print("("+name+")胜利");
    }
    }
}
package PK;

public class HOUYI extends Hero {

    // 方法: 攻击方法 造成200/240/280/320/360/400(+50%物理加成)点物理伤害
    public void attack(Hero hero){
    // 伤害计算
    int num = (int) (200 + 40 * this.lv + 0.5 * this.ad + this.ad_1 + this.ap_1);
    hero.hp -= num;
    System.out.println (this.playerID + "("+name+")对" + hero.playerID + "("+hero.name+")造成了" +num + "点伤害");
    System.out.println ("----------"+hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
    if(hero.hp <= 0) {
        System.out.print("("+name+")胜利");
    }
    }
}

        最后在主函数中实现,三个对象的对战情况,先两两对战,胜者和另一个对象对战,直至有一方血量为负,结束战斗。在代码中分别添加吕布与后羿和张飞的对战程序,同样使用随机数。

package PK;
    import java.util. Random; // 导入随机数类
public class GAME {
    public static void main(String[] args){
    // 选择英雄阶段
    // 1.创建后羿对象
    HOUYI hy1 = new HOUYI ();
    hy1.init ("小A", "后羿");
    // 2.创建张飞对象
    ZHANGFEI zf1 = new ZHANGFEI ();
    zf1.init ("小B", "张飞");
    // 随机数
    Random random = new Random ();
    // 游戏对象加载完成 准备开始PK
    while(hy1.hp > 0 && zf1.hp > 0){
    // 先使用随机数随机 4个数 0 1 2 3 4 : 1 后羿升级 3 张升级 0 后羿攻击张飞 2张飞攻击后羿 4后羿一技能升级
    int rn = random.nextInt (6);
    switch(rn) {
        case 0:
            hy1.attack (zf1);
            break;
        case 1:
            hy1.levelUp ();
            break;
        case 2:
            zf1.attack (hy1);
            break;
        case 3:
            zf1.levelUp ();
            break;
        case 4:
            hy1.levelUp_1();
            break;
        case 5:
            zf1.levelUp_1();
            break;
        }
    }
    
    LvBu lb1 = new LvBu ();
    lb1.init("小C", "吕布");
    lb1.hp += 1500;
    if(zf1.hp <= 0){
    System.out.println ("后羿胜利");
    while(hy1.hp > 0 && lb1.hp > 0){
        int rn = random.nextInt (6);
        switch(rn) {
            case 0:
                hy1.attack (lb1);
                break;
            case 1:
                hy1.levelUp ();
                break;
            case 2:
                lb1.attack (hy1);
                break;
            case 3:
                lb1.levelUp ();
                break;
            case 4:
                hy1.levelUp_1();
                break;
            case 5:
                lb1.levelUp_1();
                break;
            }
        }
    }
    else {
        System.out.println ("张飞胜利");
        zf1.hp += 1500;
        while(zf1.hp > 0 && lb1.hp > 0){
            int rn = random.nextInt (6);
            switch(rn) {
                case 0:
                    zf1.attack (lb1);
                    break;
                case 1:
                    zf1.levelUp ();
                    break;
                case 2:
                    lb1.attack (zf1);
                    break;
                case 3:
                    lb1.levelUp ();
                    break;
                case 4:
                    zf1.levelUp_1();
                    break;
                case 5:
                    lb1.levelUp_1();
                    break;
                }
            }
    }
    }
}

运行结果显示为:

小A(后羿)对小B(张飞)造成了315点伤害
----------小B(张飞)剩余血量:2685
小B(张飞)对小A(后羿)造成了700点伤害
----------小A(后羿)剩余血量:2300
小A(后羿)一技能升级 等级:1

小B(张飞)升级了,当前等级:2
小B(张飞)升级了,当前等级:3
小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:1300
小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:300
小A(后羿)对小B(张飞)造成了395点伤害
----------小B(张飞)剩余血量:2490
小A(后羿)升级了,当前等级:2
小A(后羿)一技能升级 等级:2

小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:-600
(张飞)胜利张飞胜利
小B(张飞)一技能升级 等级:1

小B(张飞)升级了,当前等级:4
小B(张飞)升级了,当前等级:5
小B(张飞)升级了,当前等级:6
小C(吕布)对小B(张飞)造成了475点伤害
----------小B(张飞)剩余血量:3815
小B(张飞)一技能升级 等级:2

小B(张飞)升级了,当前等级:7
小B(张飞)对小C(吕布)造成了1760点伤害
----------小C(吕布)剩余血量:2740
小B(张飞)升级了,当前等级:8
小B(张飞)升级了,当前等级:9
小B(张飞)升级了,当前等级:10
小B(张飞)升级了,当前等级:11
小C(吕布)一技能升级 等级:1

小C(吕布)升级了,当前等级:2
小C(吕布)升级了,当前等级:3
小B(张飞)一技能升级 等级:3

等级已满
小B(张飞)升级了,当前等级:12
小B(张飞)对小C(吕布)造成了2510点伤害
----------小C(吕布)剩余血量:430
小C(吕布)一技能升级 等级:2

小B(张飞)对小C(吕布)造成了2510点伤害
----------小C(吕布)剩余血量:-2080
(张飞)胜利

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值