Java:玩家打怪小游戏

今天,我们尝试用Java来做一个“打怪小游戏”,听名字就知道,我们是应该创建几个成员和怪物,还有知道知道成员和怪物的血量,一次攻击的伤害等等。。当然我们的游戏攻击模式是“回合制”(其实是别的方法,我也不会。。。)。

一.成员的创建

首先我将需要创建的类先展示出来:

 

1.Role抽象类(父类)

       首先,我们要创建一个抽象类作为父类,在当中我们放入名字,血量,和攻击方法,返回方法,至于为什么是抽象类,是因为我们想要将法师的伤害设置为等级的5倍,所以我们要将攻击方法设置为抽象方法。(抽象类和抽象方法需要用 abstract关键字修饰)

代码实现:

public abstract class Role {//创建一个角色类作为父类
    private String name;
    private int hp;
    public abstract int attack();
    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setHp(int hp){
        this.hp=hp;
    }

    public int getHp(){
        return hp;
    }

    public String toString(){
        return "name="+name+","+"hp="+hp;
    }
}

 2.Magicer子类

继承Role父类,在其中创建一个等级变量,并在其中重写攻击方法和返回方法,对于重写的返回方法我们要返回法师的名字和等级,所以我们可以根据super关键字,调用super.toString()方法,得到父类中的返回方法,并加上等级形成新的返回。

代码实现:

public class Magicer extends Role {
    private int level;
    public void setLevel(int level){
        this.level = level;
    }

    public int getLevel(){
        return level;
    }

    //创建一个法师伤害方法,伤害为等级的5倍
    public int attack() {
        return level*5;
    }
    public String toString(){
        return "Magicer={"+super.toString()+"Level="+level+"}";
    }
}

3.Soldier子类

 继承Role父类,在其中创建一个伤害变量,并在其中重写攻击方法和返回方法,对于重写的返回方法我们要返回战士的名字和伤害,所以我们可以根据super关键字,调用super.toString()方法,得到父类中的返回方法,并加上伤害形成新的返回

public class Soldier extends Role {
    private int hurt;
    public void setHurt(int hurt){
        this.hurt = hurt;
    }

    public int getHurt(){
        return hurt;
    }
    //创建一个战士伤害方法
    public int attack(){
        return hurt;
    }

    public String toString(){
        return "Soldier={"+super.toString()+"hurt="+hurt+"}";
    }
}

4.Boss子类

同样继承Role父类,在其中创建一个伤害变量,并在其中重写攻击方法和返回方法,对于重写的返回方法我们要返回BOSS的名字和伤害,所以我们可以根据super关键字,调用super.toString()方法,得到父类中的返回方法,并加上伤害形成新的返回

public class Boss extends Role{
    private int hurt;
    public void setHurt(int hurt){
        this.hurt=hurt;
    }

    public int getHurt(){
        return hurt;
    }
    public int attack(){
        return hurt;
    }

    public String toString() {
        return "Boss={" + super.toString() + "hurt=" + hurt + "}";
    }
}

5.Team类

设计一个addMember方法,最大添加6个成员(算怪物)

设计一个members方法,用于统计成员

 设计一个attackSum方法,用来统计一次攻击所有人造成的伤害

 设计一个attackNum方法,返回boss造成的伤害

设计一个injured方法,返回boss受到伤害的的剩余血量 

设计一个injures1方法,返回magicer受到伤害后的血量。

设计一个injures2方法,返回soldier受到伤害后的血量。 

 

6.Player类

实例化:

数据的传入:

 

调用添加方法:

打印成员和一次造成的伤害 :

创建一个循环,形成回合制攻击模式: 

队伍造成伤害-》boss剩余血量打印-》boss造成伤害-》成员剩余血量打印

我们知道当一个角色阵亡时,我们的总的伤害会减少,所以我们可以当成员阵亡时,就让这时boss的血量加上这个成语造成的伤害,这样就相当于我们只造成了没死成员的伤害,但是由于我们时先成员进行攻击在boss进行攻击,所以当我们成员血量第一次为0时,之前会造成伤害,所以在第一次成员血量为0时,我们不能将boss的血量改变,只有在第二次血量为0时,才会开始改变血量,所以我们可以设计一个血量为0的标志,当这个标志大于等于2时 ,才会开始改变血量,

 

 最后进行各个成员的血量判断:

  • 当法师和战士都阵亡,并且boss血量不为0时击杀失败
  • 当boss血量小于等于并且有一个成员存活时时,结束循环并显示boss血量为0
  • 全员为0时,同归于尽

 让我们来看一下运行的结果吧

最后让我奉上完整的代码吧:

完整代码:

.Role抽象类:

public abstract class Role {//创建一个角色类作为父类
    private String name;
    private int hp;
    public abstract int attack();
    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setHp(int hp){
        this.hp=hp;
    }

    public int getHp(){
        return hp;
    }

    public String toString(){
        return "name="+name+","+"hp="+hp;
    }
}

Magicer子类 :

public class Magicer extends Role {
    private int level;
    public void setLevel(int level){
        this.level = level;
    }

    public int getLevel(){
        return level;
    }

    //创建一个法师伤害方法,伤害为等级的5倍
    public int attack() {
        return level*5;
    }
    public String toString(){
        return "Magicer={"+super.toString()+"Level="+level+"}";
    }
}

Soldier子类 :

public class Soldier extends Role {
    private int hurt;
    public void setHurt(int hurt){
        this.hurt = hurt;
    }

    public int getHurt(){
        return hurt;
    }
    //创建一个战士伤害方法
    public int attack(){
        return hurt;
    }

    public String toString(){
        return "Soldier={"+super.toString()+"hurt="+hurt+"}";
    }
}

Boss子类 :

public class Boss extends Role{
    private int hurt;
    public void setHurt(int hurt){
        this.hurt=hurt;
    }

    public int getHurt(){
        return hurt;
    }
    public int attack(){
        return hurt;
    }

    public String toString() {
        return "Boss={" + super.toString() + "hurt=" + hurt + "}";
    }
}

Team类 :

public class Team {
    private Role[] roles = new Role[6];//创建一个能容纳6个成员的数组
    private int i=0;//定义一个计数标志
    //创建一个添加成员的方法
    public void addMember(Role role){
        //做一个判断防止它超过6个成员
        if(i <= 6){
            roles[i]=role;
            i++;
        }else{
            System.out.println("只能添加6个成员");
        }
    }

    public void members(){
        int i=0;
        Role[] roles1 = new Role[6];//建立一个数组roles1用来存储数据
        for(Role role : this.roles){//利用for each循环,得到在这个类中输入的成员,并赋给role
            if(role instanceof Magicer){//利用intstanceof关键字判断role得到的数据,是否属于Magicer类型
                Magicer magicer = (Magicer)role;//如果属于Magicer类型,利用向下转型,将role赋给magicer变量,根据magicer变量就可以进行打印
                roles1[i]=magicer;//将magicer赋给数组roles1
                i++;//去到数组下一位
            }else if(role instanceof Soldier){//利用intstanceof关键字判断role得到的数据,是否属于Soldier类型
                Soldier soldier = (Soldier)role;//如果属于Soldier类型,利用向下转型,将role赋给soldier变量,根据soldier变量就可以进行打印
                roles1[i]=soldier;//将soldier赋给数组roles1
                i++;//去到数组下一位
            }else{
               break;
            }
        }
        for(Role role1 : roles1){//利用for each循环,得到在这个类中roles1数组刚得到的值,并赋给role
            if (role1!=null) {//如果不等于空就进行打印
                System.out.println(role1);//会将刚才得到的变量,代入其中,并打印变量的值
            }else {
                break;
            }
        }
    }

    public int attackSum(){
        int sum=0;//创建一个变量用来存储一次的总伤害
        for(Role role : this.roles){//以来for each循环得到输入的成员
            if(role instanceof Magicer){//利用intstanceof关键字判断role得到的数据,是否属于Magicer类型
                Magicer magicer = (Magicer) role;//利用向下转型,将role赋给magicer变量,根据magicer变量就可以进行调用
                sum+=magicer.attack();//将magicer造成的伤害加到sum中
            }else if(role instanceof Soldier){//利用intstanceof关键字判断role得到的数据,是否属于Soldier类型
                Soldier soldier = (Soldier) role;//利用向下转型,将role赋给soldier变量,根据soldier变量就可以进行调用
                sum+=soldier.attack();//将soldier造成的伤害加到sum中
            }else{
                break;
            }
        }
        return sum;//返回一次攻击的总伤害
    }

    public int attackNum(){//创建一个boss攻击力的方法,返回boss造成的伤害
        int num=0;
        for(Role role : this.roles){
            if(role instanceof Boss) {
                Boss boss = (Boss) role;
                num += boss.attack();
            }
        }
            return num;
    }

    //创建一个boss所受伤害的方法
    public int injured(){//创建一个boss受伤方法返回boss受伤后的血量
        int blood=0;  //创建一个变量用来存储剩余血量
        for(Role role : this.roles){//以来for each循环得到输入的成员
            if(role instanceof Boss){//找到Boss类型的数据
                Boss boss = (Boss) role;//得到boss变量
                blood=boss.getHp()-attackSum();//利用boss变量得到boss的血量再去减去一次所收到的伤害,得到剩余的血量
                if(blood<=0){//当boss的血量为0时返回剩余血量为0
                    return 0;
                }
            }
        }
        return blood;//返回剩余的血量
    }

    public int injures1(){//创建一个magicer受伤方法,通过总生命减受到的伤害,从而返回magicer受伤后的血量
        int blood1=0;
        for(Role role :this.roles){
            if(role instanceof Magicer){
                Magicer magicer = (Magicer) role;
               blood1 = magicer.getHp()-attackNum();
               if(blood1<=0){//当magicer的血量为0时返回剩余血量为0
                   return 0;
               }
            }
        }
        return blood1;
    }

    public int injures2(){//创建一个soldier受伤方法,通过总生命减受到的伤害,从而返回soldier受伤后的血量
        int blood2=0;
        for(Role role :this.roles){
            if(role instanceof Soldier) {
                Soldier soldier = (Soldier) role;
                blood2 = soldier.getHp() - attackNum();
                if(blood2<=0){//当soldier1的血量为0时返回剩余血量为0
                    return 0;
                }
            }
        }
        return blood2;
    }


}

Player类 :

import java.util.Scanner;

public class Player {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int x=0;//magicer血量小于等于0的标志
        int y=0;//soldier血量小于等于0的标志

        Magicer  magicer = new  Magicer();//实例化一个法师类
        Soldier  soldier = new  Soldier();//实例化一个战士类
        Boss boss = new Boss();//实例化一个boss类
        Team team = new Team();//实例化一个队伍类

        magicer.setName("甘道夫");
        magicer.setHp(600);
        System.out.print("请输入甘道夫等级:");
        int a = scan.nextInt();
        magicer.setLevel(a);

        soldier.setName("战士");
        soldier.setHp(600);
        System.out.print("请输入战士一次的伤害:");
        int b = scan.nextInt();
        soldier.setHurt(b);

        boss.setName("魔王");
        System.out.println("魔王的血量为:1200");
        boss.setHp(1200);
        System.out.print("请输入魔王一次的伤害为:");
        int c = scan.nextInt();
        boss.setHurt(c);

        team.addMember(magicer);
        team.addMember(soldier);
        team.addMember(boss);

        System.out.println("该小队成员为:");
        team.members();
        System.out.print("该小队伤害为:");
        System.out.println(team.attackSum());

        while(boss.getHp()>0){//创建一个while循环,条件为boss血量大于0
            System.out.println("队伍造成伤害:");
            System.out.print("Boss剩余血量:");
            System.out.println(team.injured());//显示boss剩余血量
            boss.setHp(team.injured());//将剩余血量,传给boss

            System.out.println("魔王造成伤害:");
            System.out.print("magicer成员血量:");
            System.out.println(team.injures1());//通过调用team.injures1()显示血量
            magicer.setHp(team.injures1());//将血量传给magicer.setHp()重新输入magicer成员的血量

            System.out.print("soldier成语血量:");
            System.out.println(team.injures2());//通过调用team.injures2()显示血量
            soldier.setHp(team.injures2());//将血量传给soldier.setHp()重新输入soldier成员的血量
            System.out.println("---------------");

            if(soldier.getHp()>0 &&magicer.getHp()<=0){//当一个阵亡一个没有阵亡时
                x++;//血量归零时,标志加1,之前会造成伤害
                if(x>=2){//当血量第二次归零时,不会造成伤害
                    boss.setHp(boss.getHp()+ magicer.attack());//所以我们要将boss血量加回来
                }
            }

            if(magicer.getHp()>0 &&soldier.getHp()<=0){
                y++;血量归零时,标志加1,之前会造成伤害
                if(y>=2){当血量第二次归零时,不会造成伤害
                    boss.setHp(boss.getHp()+ soldier.attack());//所以我们要将boss血量加回来
                }
            }


            if(magicer.getHp()<=0 && soldier.getHp()<=0 && boss.getHp()>0){//当法师和战士都阵亡,并且boss血量不为0时击杀失败
                System.out.println("所有成员剩余血量:0,全部阵亡!击杀失败");
                System.out.println("Boss剩余血量:");
                System.out.println(boss.getHp());//显示boss剩余血量
                break;
            }else if((magicer.getHp()>0 || soldier.getHp()>0) && boss.getHp()<=0){//当boss血量小于等于并且有一个成员存活时时,结束循环并显示boss血量为0
                System.out.println("Boss剩余血量:0,击杀成功");
                break;
            }else if(magicer.getHp()==0 && soldier.getHp()==0 && boss.getHp()==0){//全员为0时,同归于尽
                System.out.println("同归于尽");
                break;
            }
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云开发 | 微信小程序云开发无法获取数据库数据

1.我在我的云数据库中创建了一个数据表&#xff08;即collection数据集&#xff09;userList,并且存入了两条用户信息数据 2. 想要通过按钮触发事件拿取数据库中数据并且打印在控制台时&#xff0c;获取数据失败&#xff0c;控制台无输出 3. 初始化 | 在开始使用数据库 API 进…

androidStudio编译导致的同名.so文件冲突问题解决

files found with path lib/arm64-v8a/libserial_port.so from inputs: ...\build\intermediates\library_jni\debug\jni\arm64-v8a\libserial_port.so C:\Users\...\.gradle\caches\transforms-3\...\jni\arm64-v8a\XXX.so 解决方式如下&#xff1a; 1.将gradle缓存文件删…

Linux系统——lvm逻辑卷

Linux系统——lvm逻辑卷 一、lvm逻辑卷1、lvm操作流程2、操作指令 二、逻辑卷操作1、创建逻辑卷1.1 /dev/cloud/openstack 5G xfs /cloud/openstack1.2 /dev/cloud/docker 10G ext4 /cloud/docker 2、逻辑卷扩容2.1 扩容流程2.2 需求一&#xff1a;扩容ext4文件系统的逻辑卷2.3…

新手给视频加字幕的方法有哪些?4种加字幕方法推荐!

在视频制作中&#xff0c;字幕不仅是传递信息的重要手段&#xff0c;还能增强视频的观感和专业性。对于新手来说&#xff0c;如何给视频添加字幕可能是一个挑战。本文将介绍字幕的类型、推荐添加字幕的工具&#xff0c;以及详细添加字幕方法&#xff0c;帮助新手轻松掌握视频字…

宠物咖啡馆业务自动化:SpringBoot框架的实现方法

3系统分析 3.1可行性分析 通过对本基于Spring Boot的宠物咖啡馆平台的设计与实现实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于Spring Boot的宠物咖啡馆…

微前端 Spa qiankun

简介 首先什么是微前端&#xff1f; 他是一个软件架构模式。借鉴了后端的为服务架构思想&#xff0c;是将复杂单一的前端进行拆分成多个可以独立开发、部署、维护的小型应用。不同的应用关注不同的业务。最终将其集成到一个主框架里面。简单来说就是先分后合。 传统前端开发的…

【Unity - 屏幕截图】技术要点

在Unity中想要实现全屏截图或者截取某个对象区域的图片都是可以通过下面的函数进行截取 Texture2D/// <summary>/// <para>Reads the pixels from the current render target (the screen, or a RenderTexture), and writes them to the texture.</para>/…

【氮化镓】低温对p-GaN HEMT迁移率、阈值电压和亚阈值摆幅的影响

本期分享一篇低温对p-GaN HEMT 迁移率、阈值电压和亚阈值摆幅影响进行表征和建模的研究论文。文章作者Shivendra Kumar Singh、Thien Sao Ngo、Tian-Li Wu(通讯作者)和Yogesh Singh Chauhan,分别来资源中国台湾阳明交通大学国际半导体技术学院、印度理工学院坎普尔分校电气工…

(二)Python输入输出函数

一、输入函数 input函数&#xff1a;用户输入的数据&#xff0c;以字符串形式返回&#xff1b;若需数值类型&#xff0c;则进行类型转换。 xinput("请入你喜欢的蔬菜&#xff1a;") print(x) 二、输出函数 print函数 输出单一数值 x666 print(x) 输出混合类型…

专利开放许可与知识产权保护的关系是什么?

专利开放许可在一定程度上是对知识产权保护制度的补充和拓展。知识产权保护的核心目标是鼓励创新&#xff0c;通过赋予专利所有者一定期限内的独占权&#xff0c;使其能够从创新成果中获得经济回报&#xff0c;从而激励更多的创新投入。 专利开放许可则为专利的应用和传播提供了…

如何制作一个宠物店小程序

产品介绍&#xff1a; 出门在外随时都可以看到不少的居民养的有宠物&#xff0c;大多数都是以阿猫阿狗为主&#xff0c;可以所得宠物市场比较大&#xff0c;宠物数量已经统计到的就有上亿只。这么多的宠物肯定需要宠物粮食&#xff0c;宠物服务市场就出来了。 家里有宠…

Git的基本使用入门

参考&#xff1a;Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区&#xff0c;也叫 Working Directory暂存区&#xff0c;也叫 stage&#xff0c;index版本库&#xff0c;也叫本地仓库&#xff0c;commit History 将代码推…

从混乱到可控:非结构化数据在远程监造中的作用

一、背景远程数字监造&#xff0c;工业制造的新趋势 在光伏组件的生产过程中&#xff0c;其质量和安全性&#xff0c;对产品的整体效益来说至关重要。为保证最终效益&#xff0c;必须要有对生产过程的监造和生产完成的验收。 然而&#xff0c;传统的线下监造模式效率较低&…

facebook受众选择设置策略的最佳方式

在进行Facebookguanggao投放时&#xff0c;受众的选择是一个至关重要的步骤。正确的受众选择不仅能够帮助我们更好地定位目标用户&#xff0c;还能显著提高guanggao的转化率和投资回报率&#xff08;ROI&#xff09;。然而&#xff0c;受众选择的数量和范围同样是需要认真考虑的…

Mybatis全局配置介绍

【mybatis全局配置介绍】 mybatis-config.xml&#xff0c;是MyBatis的全局配置文件&#xff0c;包含全局配置信息&#xff0c;如数据库连接参数、插件等。整个框架中只需要一个即可。 1、mybatis全局配置文件是mybatis框架的核心配置&#xff0c;整个框架只需一个&#xff1b…

物联网IoT平台 | 物联网IoT平台的定义

物联网IoT平台&#xff1a;定义、发展与应用在当今信息化时代&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;已经成为推动社会进步和产业升级的重要力量。物联网IoT平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐步改变…

【多线程】线程池(上)

文章目录 线程池基本概念线程池的优点线程池的特点 创建线程池自定义线程池线程池的工作原理线程池源码分析内置线程池newFixedThreadPoolSingleThreadExecutornewCachedThreadPoolScheduledThreadPool 线程池的核心线程是否会被回收?拒绝策略ThreadPoolExecutor.AbortPolicyT…

撸猫变梳毛?怎么解决猫咪掉毛问题?好用的宠物空气净化器推荐

秋风一吹&#xff0c;新一轮的猫咪换毛季又到了&#xff0c;这也意味着我失去了撸猫自由。我每天的治愈方式就是下班撸猫&#xff0c;抚摸着柔软的毛发&#xff0c;好像一天的烦恼都消除了。可是一到换毛季&#xff0c;猫还没撸两下&#xff0c;先从猫咪身上带下一手毛&#xf…

ASP.NET Core8.0学习笔记(二十一)——EFCore关系配置API

一、关系配置API概述 当我们需要指定一个字段作为外键&#xff0c;而这个外键又不符合以上四种约定时&#xff0c;就需要在IEntityTypeConfiguration实现类&#xff08;对应的配置类&#xff09;中使用Fluent API直接配置外键。理论上可以通过API直接指定一个属性&#xff0c;…

关于Qt音乐播放器进度条拖拽无用的问题解决方案

在使用Qt编写音乐播放器的时候&#xff0c;进度条关联播放音乐基本是必须的。那么在设计的过程中你可能会碰到一个奇怪的问题就是拖拽进度条的时候&#xff0c;可能会报错如下&#xff1a; 然后音乐就卡着不动了。。。 connect(ui->volume_toolButton,&VolumeToolBtn::…