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循环,得到在这个类中输入的成员,并赋给roleif(role instanceof Magicer){//利用intstanceof关键字判断role得到的数据,是否属于Magicer类型Magicer magicer = (Magicer)role;//如果属于Magicer类型,利用向下转型,将role赋给magicer变量,根据magicer变量就可以进行打印roles1[i]=magicer;//将magicer赋给数组roles1i++;//去到数组下一位}else if(role instanceof Soldier){//利用intstanceof关键字判断role得到的数据,是否属于Soldier类型Soldier soldier = (Soldier)role;//如果属于Soldier类型,利用向下转型,将role赋给soldier变量,根据soldier变量就可以进行打印roles1[i]=soldier;//将soldier赋给数组roles1i++;//去到数组下一位}else{break;}}for(Role role1 : roles1){//利用for each循环,得到在这个类中roles1数组刚得到的值,并赋给roleif (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时返回剩余血量为0return 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时返回剩余血量为0return 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时返回剩余血量为0return 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血量大于0System.out.println("队伍造成伤害:");System.out.print("Boss剩余血量:");System.out.println(team.injured());//显示boss剩余血量boss.setHp(team.injured());//将剩余血量,传给bossSystem.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血量为0System.out.println("Boss剩余血量:0,击杀成功");break;}else if(magicer.getHp()==0 && soldier.getHp()==0 && boss.getHp()==0){//全员为0时,同归于尽System.out.println("同归于尽");break;}}}
}

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

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

相关文章

Element-ui官方示例(Popover 弹出框)

Element-ui官方示例&#xff08;Popover 弹出框&#xff09;&#xff0c;好用的弹出框。 使用 vue-cli3 我们为新版的 vue-cli 准备了相应的​Element 插件​&#xff0c;你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模版&#…

SQLAlchemy入门:详细介绍SQLAlchemy的安装、配置及基本使用方法

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。本文将详细介绍SQLAlchemy的安装、配置及基本使用方法&#xff0c;并通过代码示例和案例分析&#xff0c;帮助新…

数据使用方法:

MySQL的存储引擎&#xff1a; 存储引擎的类型 MyISAM、InnoDB 、Memory、CSV等9种。 设置表的存储引擎&#xff1a; 数据表的存储位置 将查询结果插入新表 更新数据&#xff1a; 数据更新 更新数据记录 UPDATE 表名SET 字段1值1,字段2值2,...,字段n值 n [WHERE 条件]; 示例&a…

论文笔记:Pre-training to Match for Unified Low-shot Relation Extraction

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://aclanthology.org/2022.acl-long.397.pdf 论文代码&#xff1a;https://github.com/fc-liu/MCMN &#xff08;笔记不易&#xff0c;请勿恶意转载抄袭&#xff01;&#xff01;&#xff01;&#xff09; 目录 A…

pnpm报错 cannot find package xxx,有的电脑正常运行,只有这个的电脑报错

pnpm build报错 cannot find package xxx&#xff0c;有的电脑正常运行&#xff0c;只有这一个报错 在网上查找各种资料发现是项目在电脑里的目录层级比较深导致的。 问题&#xff1a;在 Windows 系统上&#xff0c;文件路径过长&#xff08;超过 260 个字符&#xff09;可能…

VMware设置虚拟机与物理机在同一网段

1、设置虚拟网络编辑器 打开VMware编辑中的“虚拟网络编辑器...”菜单 将桥接模式选择为物理机的网卡。 2、设置虚拟机的网络适配器 打开“虚拟机|设置...”菜单&#xff0c;按下图设置。 3、查看Ubuntu的IP地址 输入命令&#xff1a; ip addr show 可查看ip地址是否与物…

2020前端面试 - JavaScript2.0篇

前言&#xff1a; 个人觉得面试其实是一个自我学习的过程&#xff0c;如果说短时间内找不到工作&#xff0c;那一定是你面的还不够多&#xff0c;不要气馁&#xff0c;不要放弃&#xff0c;在心底告诉自己&#xff0c;下一次面试&#xff0c;再下一次面试&#xff0c;一定能够拿…

基于Matlab使用蚁群算法寻找最优路径

基于Matlab使用蚁群算法寻找最优路径 与Dijkstra算法使用相同的地图。 每只蚂蚁都从起点出发&#xff0c;直到抵达终点。这与Example5_1.m 中解决旅行商问题不一样&#xff0c;旅行商问题中每一代的蚂蚁都是随机从一个节点出发。 文件说明 Example5_1.m 简单对参考资料2中的…

路由器原理和静态路由配置

一、路由器的工作原理 根据路由表转发数据 接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口 二、路由表的形成 它是路由器中维护的路由条目的集合&#xff0c;路由器根据路由表做路径选择&#xff0c;里面记录了网段ip地址和对应下一跳接口的接口号。…

uniapp学习(004-2 组件 Part.2生命周期)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第31p-第p35的内容 文章目录 组件生命周期我们主要使用的三种生命周期setup(创建组件时执行)不可以操作dom节点…

最新CSS入门总结

CSS&#xff08;层叠样式表&#xff09;是一种用于网页样式设计的语言&#xff0c;它通过为 HTML 标签添加样式来控制网页的外观和布局。CSS 可以设置元素的颜色、字体、间距、对齐方式等&#xff0c;还可以用于创建响应式设计&#xff0c;以适应不同设备的屏幕尺寸。CSS 是前端…

再给我两分钟,我能教会你使用 nvm 一键搞定node 和 npm

1. nvm简介 NVM&#xff08;Node Version Manager&#xff09;是Node.js的版本管理工具&#xff0c;它允许用户在同一台机器上安装和管理多个Node.js版本。这对于需要在不同项目之间切换Node.js版本的开发者来说非常有用&#xff0c;因为不同的项目可能依赖于不同版本的Node.js…

CAN总线通信协议

目录 一、CAN总线的介绍 二、主流通信协议对比 1.CAN硬件电路 三、CAN电平标准 四、CAN总线帧格式 1.CAN总线的5种类型帧 2.CAN总线的帧介绍 1.CAN总线的两种数据格式&#xff08;标准格式与扩展格式&#xff09; 2.遥控帧 3.错误帧 4.过载帧 5.帧间隔 3.位填充 4…

golang必备项目管理机制:工作区

在 Go 1.18 及以后的版本中&#xff0c;工作区&#xff08;Workspace&#xff09;是一种新的项目管理方式&#xff0c;可以让多个项目共享同一个模块缓存和依赖。这意味着你不需要在每个项目中单独安装依赖&#xff0c;而是可以共享依赖&#xff0c;这样可以节省空间和时间。 假…

CUDA 运行时GPU信息查询

cuda 官网文档名&#xff1a;CUDA_Runtime_API 运行时API查询GPU信息 调用 cudaDeviceProp prop; cudaGetDeviceProperties(&prop, device_id) 定义 由此可见&#xff0c;只能在主机上调用。 #include <cuda_runtime.h>#include <iostream> #include <…

ConditionVideo: 无训练的条件引导视频生成 | AAAI 2024

作者&#xff1a;彭博&#xff0c;上海人工智能实验室与上海交大2023级联培博士。 最近的工作已经成功地将大规模文本到图像模型扩展到视频领域&#xff0c;产生了令人印象深刻的结果&#xff0c;但计算成本高&#xff0c;需要大量的视频数据。在这项工作中&#xff0c;我们介…

游戏如何应对薅羊毛问题

在大众眼里&#xff0c;“薅羊毛”是指在电商领域&#xff0c;“羊毛党”利用平台、商家的促销规则&#xff0c;低价获取商品和服务的行为。如前不久“小天鹅被一夜薅走7000万”的案例震惊全网。 然而实际上&#xff0c;“薅羊毛”现象不仅存在于电商场景&#xff0c;在游戏中…

设计模式之适配器模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、适配器模式2、适配器模式的使用场景3、优点4、缺点5、主要角色6、代码示例1&#xff09;UML图2&#xff09;源代码&#xff08;1&#xff09;定义一部手机&#xff0c;它有个typec口。&#xff08;2&#xff09;定义一个vga接口。&#xff08;3&#x…

docker入门-快速学会docker

死记硬背一张图 镜像类似于我们是使用的虚拟机&#xff0c;创建虚拟机前需要下载的系统镜像文件&#xff0c;比如iso文件&#xff0c;img文件等等这样一些镜像文件。 容器可以比作正在运行中的一个虚拟机。 tar文件&#xff0c;tar文件类似于vm使用时的vmdk文件。通过load指…

在 Docker容器中安装 ROS-Melodic 并使用 rviz 进行图形化显示

文章目录 写在前面1. 背景描述2. 安装步骤2.1 允许本地机器上的用户或进程连接到 X server2.2 拉取 docker 镜像2.3 使用镜像osrf/ros:melodic-desktop-full创建并运行容器2.4 运行 roscore2.5 运行 rviz 参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0…