Java:玩家打怪小游戏

news2025/1/19 20:58:38

今天,我们尝试用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;
            }
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露&#xff0c;客户端需要调用的时候&#xff0c;直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

【数据采集工具】Flume从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十三)--权限设置注意事项和属主属组设置sudo操作

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十三&#xff09;–权限设置注意事项和属主属组设置sudo操作 一、linux 权限设置 特殊注意事项 1、使用root用户创建一个文件夹&#xff08;/oo&#xff09;&#xff0c;权限默认&…

前端知识点总和

目录 一、canvas&#xff1a; &#xff08;1&#xff09;创建canvas标签&#xff1a; &#xff08;2&#xff09;使用JS获得这个canvas标签的DOM对象&#xff1a; &#xff08;3&#xff09;决定是画二维还是三维的画&#xff1a; &#xff08;4&#xff09;API&#xff1…

企业防止信息泄露的措施有哪些?10个防止信息泄露小技巧分享给你

在数字化时代&#xff0c;企业面临的安全挑战日益严峻&#xff0c;尤其是信息泄露问题。一旦企业内部或外部的敏感信息遭到泄露&#xff0c;不仅会造成巨大的经济损失&#xff0c;还可能影响企业声誉、客户信任&#xff0c;甚至可能引发法律纠纷。为了有效防止信息泄露&#xf…

使用 SQLmap 自动化检测 SQL 注入

使用 SQLmap 自动化检测 SQL 注入是一种常见的渗透测试技术。SQLmap 是一个强大的开源工具&#xff0c;可以自动检测和利用 SQL 注入漏洞&#xff0c;提取数据库信息&#xff0c;并接管目标数据库服务器。下面是如何使用 SQLmap 进行自动化检测 SQL 注入的基本步骤。 准备环境…

RabbitMQ 入门(七)SpringAMQP五种消息类型

一、Topic Exchange&#xff08;消息模式&#xff09; TopicExchange 与DirectExchange类似&#xff0c;区别在于routingKey可以是多个单词的列表&#xff0c;并且以.分割。 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过…

Spring WebFlux 核心原理(2-1)

1、Spring 响应式编程 1.1、早期响应式解决方案 响应式编程是构建响应式系统的主要候选方案。Spring 4.x 引入了 ListenableFuture 类&#xff0c;它扩展了 Java Future&#xff0c;并且可以基于 HTTP 请求实现异步执行操作。但是只有少数 Spring 4.x 组件支持新的 Java 8 Com…

Nginx(Linux):服务器版本升级和新增模块

目录 1、概述2、使用Nginx服务信号完成Nginx升级2.1 备份当前版本的Nginx2.2 向服务器导入新的Nginx2.3 向服务器导入新的Nginx2.4 停止老版本Nginx 3、使用Nginx安装目录的make命令完成升级3.1 备份当前版本的Nginx3.2 向服务器导入新的Nginx3.3 执行更新命令 1、概述 如果想…

24最新ComfyUI插件与Lora的下载及使用指南!

前言 本节我们介绍ComfyUI插件和Lora的下载及使用方式。 1. 安装 1.1 Checkpoint安装 将从前面介绍的模型下载平台下载后&#xff0c;放在ComfyUI/models/checkpoints文件夹下。 所有的AI设计工具&#xff0c;安装包、模型和插件&#xff0c;都已经整理好了&#xff0c;&am…

【vue自定义指令】骨架屏指令

场景 预加载的过程中&#xff0c;数据还未请求到&#xff0c;dom已经渲染出来了&#xff1f; 展示效果 实现 封装指令&#xff08;代码块1&#xff09; app引入&#xff08;代码块2&#xff09;使用&#xff08;代码块3&#xff09; 代码 封装 ​ import { reactive, wa…

Spark全网最全总结

Spark 产生之前&#xff0c;已经有 MapReduce 这类非常成熟的计算系统存在了&#xff0c;并提供 了高层次的 API(map/reduce)&#xff0c;把计算运行在集群中并提供容错能力&#xff0c;从而实现 分布式计算。 虽然 MapReduce 提供了对数据访问和计算的抽象&#xff0c…

一个月学会Java 第13天 抽象类与接口

Day13 抽象类与接口 通过了前面的学习&#xff0c;我们已经掌握了面向对象的基础 继承 封装 多态 第一章 抽象类 接下来&#xff0c;我们要对面向对象学习高级的部分&#xff0c;我们先要学到的就是抽象类&#xff0c;听名字也能想到&#xff0c;肯定很抽象&#xff0c;那我们先…

电力电子技术(二)

三相可控整流电路&#xff1a;&#xff08;主要包括三相半波和三相桥式&#xff09; &#xff08;一&#xff09;三相半波&#xff1a; &#xff08;1.1电阻性负载&#xff09; 右侧第三个图代表VT1晶闸管的流经电流波形&#xff0c;一个周期仅导通一次&#xff1a;晶闸管导…

Netty讲解与案例

1.Netty简介&#xff1a; 官网&#xff1a;https://netty.io/ Netty 是一个 NIO 客户端服务器框架&#xff0c;可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和精简了 TCP 和 UDP 套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序会存在…

Halcon 使用二维像素分类对图像进行分割

文章目录 算子histo_2dim 计算双通道灰度值图像的直方图class_2dim_sup 使用二维像素分类对图像进行分割 示例 算子 histo_2dim 计算双通道灰度值图像的直方图 histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )Regions (输入对象)&#xff1a;在此区域内计算直方图…

腾讯云视立方开通各项云服务相关

云直播 如何开通云直播服务&#xff1f; 进入 云直播管理控制台&#xff0c;进入腾讯云直播服务开通页&#xff0c;查看相关协议并勾选同意&#xff0c;单击申请开通即可开通云直播服务。 。 如何开启流防盗链 KEY&#xff1f; 推流防盗链 KEY 是为了确保只有您的 App 用户…

dockerfile 用法全解析

FROM 构建基于alpine的镜像&#xff0c;单条执行就是复制了一个apline镜像(除了FROM其他都是非必须的) WORKDIR 是之指定接下来的shell语句是运行在哪个路径下&#xff0c;没有就会创建目录 COPY 将宿主机指定目录的文件拷贝到镜像指定目录 &#xff08;ADD 源地址还可以url…

[LeetCode] 662. 二叉树最大宽度

题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作与满二叉树结…

【C语言刷力扣】2206.将数组划分成相等数对

题目&#xff1a; 解题思路&#xff1a; 题目中要求元素成数对出现&#xff0c;即每个元素出现偶数次。用哈希表存放每个数出现的次数&#xff0c;再循环查看每个数的次数是否位偶数。 typedef struct {int key;int count;UT_hash_handle hh; } hashEntry;bool divideArray(int…