Java巅峰之路---基础篇---综合练习(面向对象)

目录

文字版格斗游戏

基础版

souf输出语句

进阶版

键盘录入的说明

复杂对象数组练习

需求:

添加和遍历

删除和遍历

修改和遍历


文字版格斗游戏

基础版

格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new 对象的时候),这些信息就应该被确定下来。

思路:首先需要创建一个Role类,成员变量为姓名和血量以及写出对应的set和get方法,这里还需要有一个attack(Role r1, Role r2)方法,谁打了谁,谁又掉血,根据封装思想的原则:对象代表什么(人物类),就得封装对应的数据(姓名和血量),并提供数据对应的行为,所以这个行为要写在Role类里边。

package CeShi;
import java.util.Random;
public class Role {private String name;private int blood;Role(){}Role(String name, int blood){this.blood = blood;this.name = name;}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setBlood(int blood){this.blood = blood;}public int getBlood(){return this.blood;}/** 根据封装的思想,人物攻击别人,以及损失血量都要在人物类中完成* r1攻击r2,r1.attack(r2);表示r1攻击r2* 谁攻击谁?方法的调用者去攻击参数* */public void attack(Role role){Random r = new Random();int hurt = r.nextInt(20) + 1;//造成的伤害//剩余血量int remain_blood = (role.getBlood() - hurt) > 0 ?(role.getBlood() - hurt) : 0;role.setBlood(remain_blood);System.out.println(this.name+"举起拳头打了" + role.getName()+ "一下,造成了"+ hurt+"点伤害," +role.getName()+"还剩下"+role.getBlood()+"点血");}}
package CeShi;public class GameText {public static void main(String[] args) {Role role1 = new Role("乔峰",100);Role role2 = new Role("鸠摩智",100);while(true){role1.attack(role2);if(role2.getBlood() == 0){System.out.println(role1.getName() + "K.O了" + role2.getName());break;}role2.attack(role1);if(role1.getBlood() == 0){System.out.println(role2.getName() + "K.O了" + role1.getName());break;}}}
}

souf输出语句

包含两部分参数
第一部分参数:要输出的内容%s(占位)
第二部分参数:填充的数据

    public static void main(String[] args) {System.out.printf("你好啊%s","张三\n");//你好啊张三System.out.printf("%s你好啊%s","张三", "李四");//张三你好啊李四}

进阶版

 思路:长相设置为随机,这时需要根据性别在setFace方法中写相关逻辑,同时有参构造方法中不用加长相的变量,直接用setFace方法就行。

在展示攻击效果以及受伤描述时,采用了数组以及souf输出语句;展示攻击效果用的是随机索引,受伤描述则根据人物剩余血量。

package CeShi1;import java.util.Random;public class Role {private String name;private int blood;private char gender;private String face;//随机长相String[] boyfaces= {"风流俊雅","气宇轩昂","相貌英俊","五官端正","相貌平平","一塌糊涂","面目狰狞"};String[] girlfaces ={"美奂绝伦","沉鱼落雁","婷婷玉立","身材娇好","相貌平平","相貌简陋","惨不忍睹"};String[] attacks_desc={"%s使出了一招【背心钉】,转到对方的身后,一掌向%s背心的灵台穴拍去。","%s使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向%s。","%s大喝一声,身形下伏,一招【劈雷坠地】,捶向%s双腿。","%s运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向%s。","%s阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向%s。","%s上步抢身,招中套招,一招【劈挂连环】,连环攻向%s。"};String[] injureds_desc={"结果%s退了半步,毫发无损","结果给%s造成一处瘀伤","结果一击命中,%s痛得弯下腰","结果%s痛苦地闷哼了一声,显然受了点内伤","结果%s摇摇晃晃,一跤摔倒在地","结果%s脸色一下变得惨白,连退了好几步","结果『轰』的一声,%s口中鲜血狂喷而出","结果%s一声惨叫,像滩软泥般塌了下去"};Role(){}Role(String name, int blood,char gender){this.blood = blood;this.name = name;this.gender = gender;setFace(gender);}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String getFace() {return face;}public void setFace(char gender) {if(gender == '男'){//从boyfaces数组中选取Random r =  new Random();this.face = boyfaces[r.nextInt(boyfaces.length)];} else if (gender == '女') {//从girlfaces数组中选取Random r =  new Random();this.face = girlfaces[r.nextInt(girlfaces.length)];}else {this.face = "面目狰狞";}}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setBlood(int blood){this.blood = blood;}public int getBlood(){return this.blood;}/** 根据封装的思想,人物攻击别人,以及损失血量都要在人物类中完成* r1攻击r2,r1.attack(r2);表示r1攻击r2* 谁攻击谁?方法的调用者去攻击参数* */public void attack(Role role){Random r = new Random();//攻击效果描述String kungFu = attacks_desc[r.nextInt(attacks_desc.length)];System.out.printf(kungFu,this.name,role.name);System.out.println();int hurt = r.nextInt(20) + 1;//造成的伤害1~20//剩余血量int remain_blood = (role.getBlood() - hurt) > 0 ?(role.getBlood() - hurt) : 0;role.setBlood(remain_blood);//受伤效果描述if(remain_blood >= 90){System.out.printf(injureds_desc[0],role.name);} else if (remain_blood >= 80 && remain_blood < 90) {System.out.printf(injureds_desc[1],role.name);} else if (remain_blood >= 70 && remain_blood < 80) {System.out.printf(injureds_desc[2],role.name);} else if (remain_blood >= 60 && remain_blood < 70) {System.out.printf(injureds_desc[3],role.name);} else if (remain_blood >= 40 && remain_blood < 60) {System.out.printf(injureds_desc[4],role.name);} else if (remain_blood >= 20 && remain_blood < 40) {System.out.printf(injureds_desc[5],role.name);} else if (remain_blood >= 10 && remain_blood < 20) {System.out.printf(injureds_desc[6],role.name);} else if (remain_blood >= 0 && remain_blood < 10) {System.out.printf(injureds_desc[7],role.name);}System.out.println();}@Overridepublic String toString() {return "Role{" +"name='" + name + '\'' +", blood=" + blood +", gender=" + gender +", face='" + face + '\'' +'}';}
}
package CeShi1;public class GameText {public static void main(String[] args) {Role role1 = new Role("乔峰",100,'男');Role role2 = new Role("鸠摩智",100,'男');System.out.println(role1.toString());System.out.println(role2.toString());while(true){role1.attack(role2);if(role2.getBlood() == 0){System.out.println(role1.getName() + "K.O了" + role2.getName());break;}role2.attack(role1);if(role1.getBlood() == 0){System.out.println(role2.getName() + "K.O了" + role1.getName());break;}}}
}

键盘录入的说明

第一套体系

nextInt()、nextDouble()、next():遇到空格、制表符、回车就停止接受,这些符号后面的数据就不会接受了

第二套体系

nextLine():可以接收空格、制表符,遇到回车才停止接受数据

        Scanner sc = new Scanner(System.in);int num1 = sc.nextInt();int num2 = sc.nextInt();System.out.println(num1);System.out.println(num2);

        Scanner sc = new Scanner(System.in);String s = sc.nextLine();System.out.println(s);

复杂对象数组练习

需求:

定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。学生的属性:学号,姓名,年龄。

· 再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。

· 添加完毕之后,遍历所有学生信息

· 通过id删除学生信息;如果存在,则删除;不存在,则提示删除失败

· 删除完毕之后,遍历所有学生信息

· 查询数组id为"heima002"的学生,如果存在,则将他的年龄+1岁。

初步思路:根据题目要求,我们需要先创建一个Student类(标准的javabin类)和一个能放3名学生对象的数组,存储1~3个数据;然后再依次完成下列五个要求

添加和遍历

思路:在添加之前,我们需要先进行唯一性判断,若存在,则添加失败;反之,开始进行添加操作。不过,因为我们是数组存储数据,而我们定义的数组最大容量为3,所以我们还需要判断数组是否填满,填满则需进行扩容操作,没填满就根据索引将该学生对象添加进数组即可。

之后遍历数组即可

package CeShi3;public class StudentText {public static void main(String[] args) {Student[] arr = new Student[3];arr[0] = new Student("1","zhangsan",23);arr[1] = new Student("2", "lisi", 24);arr[2] = new Student("3", "wangwu", 25);//添加一个学生对象,并在添加的时候进行学号的唯一性判断Student stu = new Student("4","zhaoliu", 26);if(contains(arr,stu)){//表示学生id已经存在System.out.println("学生id已经存在,请重新输入");}else {//表示学生id不存在//此时还需判断数组是否已经添加满int count = getCount(arr);if(count == arr.length){//表示数组已经添加满arr = createNewArr(arr);arr[count] = stu;System.out.println("添加成功");printArr(arr);}else {//表示数组还未添加满arr[count] = stu;System.out.println("添加成功");printArr(arr);}}}private static void printArr(Student[] arr) {for (int i = 0; i < arr.length; i++) {if(arr[i] != null){System.out.println(arr[i]);}}}//数组扩容,即构建一个新的数组public static Student[] createNewArr(Student[] arr){Student[] newArr = new Student[arr.length + 1];for (int i = 0; i < arr.length; i++) {newArr[i] = arr[i];}return newArr;}//获取数组中的学生数目(遇到null之前或者完整遍历arr时),添加新学生时也可作为其索引public static int getCount(Student[] arr){int count = 0;for (int i = 0; i < arr.length; i++) {if(arr[i] != null)count++;else return count;}return count;}//判断该学生学号是否已经存在public static boolean contains(Student[] arr, Student stu){for (int i = 0; i < arr.length; i++) {if(arr[i] != null){if(arr[i].getId() == stu.getId())return true;}}return false;}
}

删除和遍历

思路:首先要判断该学生对象是否存在(根据id),若存在,则根据对应的索引进行删除操作;若不存在,则提示“删除失败”。“删除成功”之后,遍历数组就行

package CeShi3;public class StudentText1 {public static void main(String[] args) {Student[] arr = new Student[3];arr[0] = new Student("1","zhangsan",23);arr[1] = new Student("2", "lisi", 24);arr[2] = new Student("3", "wangwu", 25);//删除id为2的学生int index = getIndex(arr,"2");if(index >= 0){//学生对象存在System.out.println("删除成功");arr[index] = null;printArr(arr);}else{//学生对象不存在System.out.println("删除失败");}}//获取要删除学生在数组中的索引,没有则返回-1public static int getIndex(Student[] arr, String id){for (int i = 0; i < arr.length; i++) {if(arr[i] != null){if(arr[i].getId() == id)return i;}}return -1;}private static void printArr(Student[] arr) {for (int i = 0; i < arr.length; i++) {if(arr[i] != null){System.out.println(arr[i]);}}}
}

修改和遍历

思路:先判断该学生id是否存在,不存在,则“查询失败”;若存在,则需要将年龄加一

package CeShi3;public class StudentText2 {public static void main(String[] args) {Student[] arr = new Student[3];arr[0] = new Student("1","zhangsan",23);arr[1] = new Student("2", "lisi", 24);arr[2] = new Student("3", "wangwu", 25);//对id为2的学生进行修改操作int index = getIndex(arr,"5");if(index >= 0){//存在System.out.println("修改成功");int age  = arr[index].getAge() + 1;arr[index].setAge(age);printArr(arr);}else {//不存在System.out.println("该学生id不存在,修改失败");}}//获取要修改学生在数组中的索引,没有则返回-1public static int getIndex(Student[] arr, String id){for (int i = 0; i < arr.length; i++) {if(arr[i] != null){if(arr[i].getId() == id)return i;}}return -1;}private static void printArr(Student[] arr) {for (int i = 0; i < arr.length; i++) {if(arr[i] != null){System.out.println(arr[i]);}}}
}

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

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

相关文章

c++入门基础篇(上)

目录 前言&#xff1a; 1.c&#xff0b;&#xff0b;的第一个程序 2.命名空间 2.1 namespace的定义 2.2 命名空间使用 3.c&#xff0b;&#xff0b;输入&输出 4.缺省参数 5.函数重载 前言&#xff1a; 我们在之前学完了c语言的大部分语法知识&#xff0c;是不是意…

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

最新 Kubernetes 集群部署 + Containerd容器运行时 + flannel 网络插件(保姆级教程,最新 K8S 1.28.2 版本)

资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

JVM:运行时数据区

文章目录 一、总览二、程序计数器1、介绍2、程序计数器在运行中会出现内存溢出吗&#xff1f; 三、栈1、介绍2、栈帧的组成部分&#xff08;1&#xff09;局部变量表&#xff08;2&#xff09;操作数栈&#xff08;3&#xff09;帧数据&#xff08;3&#xff09;栈内存溢出&…

everything搜索不到任何文件-设置

版本&#xff1a; V1.4.1.1024 (x64) 问题&#xff1a;搜索不到任何文件 click:[工具]->[选项]->下图所示 将本地磁盘都选中包含

mavsdk_server安卓平台编译

1.下载好mavsdk并进入mavsdk目录 2.生成docker安卓平台文件 docker run --rm dockcross/android-arm64 >./dockcross-android-arm64 3.生成makefile ./dockcross-android-arm64 cmake -DCMAKE_BUILD_TYPERelease -DBUILD_MAVSDK_SERVERON -DBUILD_SHARED_LIBSOFF -Bbuild/…

【学习笔记】4、组合逻辑电路(下)

接前文《【学习笔记】4、组合逻辑电路(上)》 4.4.5 算术运算电路 1. 半加器和全加器 半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。 &#xff08;1&#xff09;半加器 半加器&#xff1a;只考虑两个加数本身&#xff0c;不考虑低位进…

SuiteCRM SQL注入漏洞复现(CVE-2024-36412)

0x01 产品简介 SuiteCRM是一款屡获殊荣的企业级开源客户关系管理系统&#xff0c;它具有强大的功能和高度的可定制性&#xff0c;且完全免费。 0x02 漏洞概述 SuiteCRM存在SQL注入漏洞&#xff0c;未经身份验证的远程攻击者可以通过该漏洞拼接执行SQL注入语句&#xff0c;从…

C++20中的consteval说明符

在C20中&#xff0c;立即函数(immediate function)是指每次调用该函数都会直接或间接产生编译时常量表达式(constant expression)的函数。这些函数在其返回类型前使用consteval关键字进行声明。 立即函数是constexpr函数&#xff0c;具体情况取决于其要求。与constexpr相同&…

光学遥感图像中的目标检测技术全面综述,以及新的大规模基准数据集DIOR介绍。

原版论文&#xff1a;https://arxiv.org/abs/1909.00133 数据获取地址&#xff1a;https://www.dilitanxianjia.com/15648/ 获取全文可以入下图所示进行操作&#xff1a; 这篇文章主要对光学遥感图像中的目标检测技术进行了全面的综述&#xff0c;并提出了一个新的大规模基准…

神经网络以及简单的神经网络模型实现

神经网络基本概念&#xff1a; 神经元&#xff08;Neuron&#xff09;&#xff1a; 神经网络的基本单元&#xff0c;接收输入&#xff0c;应用权重并通过激活函数生成输出。 层&#xff08;Layer&#xff09;&#xff1a; 神经网络由多层神经元组成。常见的层包括输入层、隐藏层…

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表&#xff1a; Camunda组件与服务与…

浏览器插件使用方法

如果我们经常使用的浏览器不是edge或者是chrome浏览器时&#xff0c;需要在浏览器安装插件时&#xff0c;无法获取插件以及不知道如何安装插件&#xff0c;本文章教你如何获取以及安装使用。 获取方法 第一种方法&#xff08;推荐&#xff09; 无需“魔法”&#xff0c;即可访问…

多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程

2024.7.13 一、 对于多表的更深层的认识1. 认识2. 多表联合查询的列子&#xff1a;3. 对于多表查询的进一步认识4. 在实现功能的时候&#xff0c;原本对于省市县这样的表&#xff0c;对于项目的要求&#xff0c;是直接全部查询出来&#xff0c;然后开始使用&#xff0c;但我想着…

PDF 中图表的解析探究

PDF 中图表的解析探究 0. 引言1. 开源方案探究 0. 引言 一直以来&#xff0c;对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格&#xff0c;这篇文章主要记录了对表格的探究。还有&#xff0c;我个人主要做日本项目&…

如何解决VMware 安装Windows10系统出现Time out EFI Network...

一、问题描述 使用VMware 17 安装windows10出现如下图所示Time out EFI Network… Windows10镜像为微软官方下载的ISO格式镜像&#xff1b; 二、问题分析 VMware 17 默认的固件类型是UEFI(E)&#xff0c;而微软官网下载的Windows10 ISO格式镜像不支持UEFI(E)&#xff0c;支…

Android APT实战

Android开发中,注解平时我们用的比较多,也许我们会比较好奇,注解的背后是如何工作的,这篇文章帮大家一步步创建一个简单的注解处理器。 简介 APT(Annotation Processing Tool)即注解处理器,在编译的时候可以处理注解然后搞一些事情,也可以在编译时生成一些文件之类的。…

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…

nginx的四层负载均衡实战

目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询&#xff0…