Java中的继承【多人对战】-程序员宅基地

技术标签: Java  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
(张飞)胜利

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65240122/article/details/130869808

智能推荐

【Daily Games——工具篇】:LuaStudio的简易上手教程-程序员宅基地

文章浏览阅读2.4k次。实习第二天Lua直接上手体验,各种嵌套的内容像html实际代码体验类似c上手luastudio,增加断点调试,修改逻辑发现bug最近登录角色level显示错误创建自定义位置解决项目,导入项目文件夹。添加现有项Unity此时没有运行代码,调试窗口附加到进程,启动调试右侧会显示调用方法。 实习第三天涉及问题 :UI错位问题 其中宝箱尺..._luastudio

oracle启动/关闭/查看监听+启动/关闭/查看数据库实例命令_oracle启动监听-程序员宅基地

文章浏览阅读9.9k次,点赞5次,收藏29次。(1)以sys用户登录oracle—— sqlplus / as sysdba。(2)查看监听—— lsnrctl status。(1)启动监听—— lsnrctl start。(3)关闭监听—— lsnrctl stop。(3)关闭数据库实例—— shutdown。(2)开启数据库实例—— startup。(4)退出sql命令行界面—— quit。启动oracle第一步启动监听,第二步启动数据库实例。_oracle启动监听

JavaWeb网上书城项目_javaweb网上书店-程序员宅基地

文章浏览阅读2w次,点赞131次,收藏671次。一、需求分析用JSP/Servlet技术开发一个网上书店,主要完成以下功能:用户:注册与登录,用户信息的修改图书:图书显示,图书的购买,购物车的管理。图书的添加,删除,查询二、系统设计1)创建相关的数据库表;2)使用MVC架构或者JSP+JavaBean,至少一个功能模块使用MVC;3)在JSP中综合使用EL 表达式,JSTL标记库,JavaBean ;4)使用过滤器完成请求参数编码的设置或登录权限的控制;5)正确完成Servlet和过滤器的配置6)使用数据库连接池进_javaweb网上书店

UI——day20.lpad和watch设计规范以及适配_ipad设计ui文字行距-程序员宅基地

文章浏览阅读678次。ipad的尺寸规范现如今存在的ipad机型有哪些?那主流的设计尺寸有哪些呢?3.字体规范Apple Watch尺寸规范首屏图标80px (38mm)88px (42mm)长看图标80px (38mm)88px (42mm)短看图标172px (38mm)196px (42mm)文字规范标题36px正文标题32px正文30px备注、脚注、辅助文字24px、26pxwatch设计主题思想轻量:Apple Wa.._ipad设计ui文字行距

BellmanFord算法 讲解 AcWing 853. 有边数限制的最短路 带注释_蓬蒿人 acwing-程序员宅基地

文章浏览阅读111次。题目链接算法:BellmanFord算法 O(n∗m)O(n*m)O(n∗m)存在负权边时使用 特别适合本题这种问不超过k条边的最短路径的情景讲一下算法流程首先将图以结构体数组形式存储 BellmanFord算法特别自由 怎么存都可以struct Edge{ int a,b,c;//ab为起点 终点 c为权重}edge[10010];然后调用bellmanford函数,在函数中 先将存储最短路径的dist数组初始化为正无穷(0x3f3f3f3f)接下来开始一个二重循环 外面的大循_蓬蒿人 acwing

PMM监控MySQL-程序员宅基地

文章浏览阅读109次。一、PMM-SERVER1. 安装dockeryum install -y docker-io2. 拉取pmm-server镜像docker pull percona/pmm-server:latest3. 创建持久化容器docker create \ -v /opt/prometheus/data \ -v /opt/consul-data \ -v /var/l..._pmm 1.12 监控主备的mysql

随便推点

(1)从键盘循环录入录入一个字符串,输入“end“表示结束 (2)将字符串中大写字母变成小写字母,小写字母变成大写字母,其它字符用“*“代替,并统计字母的个数 举例: 键盘录入:Hello_换行不表示结束符,做字符统计,但用一个特殊的字符串“#end”来表示结束符,该结束-程序员宅基地

文章浏览阅读633次。(1)从键盘循环录入录入一个字符串,输入"end"表示结束(2)将字符串中大写字母变成小写字母,小写字母变成大写字母,其它字符用"*"代替,并统计字母的个数举例:键盘录入:Hello12345World输出结果:hELLO*****wORLD总共10个字母package test7_2;import java.util.Scanner;public class Demo02 { public static void main(String[] args) { while(true_换行不表示结束符,做字符统计,但用一个特殊的字符串“#end”来表示结束符,该结束

CSS中1px分割线处理_分割线1px-程序员宅基地

文章浏览阅读4.7k次。 1. 1px 边框变粗问题截图如下(iPhone 6截图):如果我们把上图与我们手机系统上的 1px 边框进行对比,如下图:我们会发现,上面两个上下线条,下线条的粗细才是正确的,上线条就显得有点粗了。但是上线条我们是用纯正的 1px border生成的,而下线条我们实际是采用transform压缩了1px高度的一半模拟实现的,也就相当于 0.5px 的高度了。为什么会这样..._分割线1px

git灰度发布版本_一键实现自动化部署(灰度发布)实践-程序员宅基地

文章浏览阅读143次。在过去几年的DevOps的浪潮中,自动化、持续集成这两个概念早已深入人心(互联网技术人)。比尔盖茨先生曾经都说过:“任何技术在一个业务中使用的第一条规则就是,将自动化应用到一个高效的操作上将会放大高效。第二条就是自动化应用到一个低效操作上,则放大了低效率。”自动化部署也逐渐成为各中小型企业追求的方向,那么,今天民工哥就自动化部署的概述、自动化部署的工具、自动化部署的流程、自动化部署实践等4个方面,..._git 自动发布工具

通用RPC方案-程序员宅基地

文章浏览阅读37次。其中ServerChannelInitializer的initChannel为触发read事件时,在SerializeAdapterDecoder的decode方法的最后一个中加入ServerChannelHandler 继承 ChannelInboundHandlerAdapter继续处理read事件时,在ServerChannelHandler 的channelRead方法中使用线程池来处理读到的数据(可能是耗时操作)从而来保证不会由于处理请求导致work线程全部耗尽,而出现等待的情况。

OpenCasCade 从零开始到生成MFC单文档测试程序_wnt_wdriver.hxx-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏17次。1.下载1.1. 安装程序 OpenCASCADExxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/loadocc/1.2.文档OCCTDocumentationxxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/_wnt_wdriver.hxx

java - 设计模式学习总结_java设计模式结课报告总结-程序员宅基地

文章浏览阅读870次。熟练掌握各种设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性更高,同时也能保证代码的可靠性,提高开发效率。这段时间又系统看了设计模式的相关内容,整理学习总结如下,文中内容如有表达有误的地方,还请指出,共同交流学习。一、概述二、7个设计原则三、创建型模式(5种)四、结构型模式(7种)五、行为型模式(11种)六、总结一、概述面向对象编程有七大原则,即经常提到_java设计模式结课报告总结