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

news2024/11/15 6:22:29

目录

文字版格斗游戏

基础版

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();
    }

    @Override
    public 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("删除失败");
        }
    }
    //获取要删除学生在数组中的索引,没有则返回-1
    public 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不存在,修改失败");
        }
    }
    //获取要修改学生在数组中的索引,没有则返回-1
    public 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.coloradmin.cn/o/1926311.html

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

相关文章

2024最新Cloudways主机使用教程(含最新Cloudways折扣码)

Cloudways是一家提供云托管服务的公司&#xff0c;可以帮助你轻松管理和运行你的网站。本教程是Cloudways主机注册和使用教程。Cloudways界面简洁&#xff0c;使用方便&#xff0c;不需要复杂的设置&#xff0c;就能快速搭建一个WordPress网站。它的主机功能包括高级缓存和Bree…

Linux命令更新-Vim 编辑器

简介 Vim 是 Linux 系统中常用的文本编辑器&#xff0c;功能强大、可扩展性强&#xff0c;支持多种编辑模式和操作命令&#xff0c;被广泛应用于程序开发、系统管理等领域。 1. Vim 命令模式 Vim 启动后默认进入命令模式&#xff0c;此时键盘输入的命令将用于控制编辑器本身&…

QT控件篇三

一、微调框 微调框&#xff08;QSpinBox&#xff09;是一个常用的Qt控件&#xff0c;允许用户通过增加或减少值来输入数字。分为两种, 整型-QSpinBox 浮点 QDoubleSpinBoxQSpinBox&#xff08;微调框&#xff09;的 setSingleStep 函数可以用来设置每次调整的步长&#xff08;…

Kafka基础入门-代码实操

Kafka是基于发布/订阅模式的消息队列&#xff0c;消息的生产和消费都需要指定主题&#xff0c;因此&#xff0c;我们想要实现消息的传递&#xff0c;第一步必选是创建一个主题&#xff08;Topic&#xff09;。下面我们看下在命令行和代码中都是如何创建主题和实现消息的传递的。…

TDesign组件库日常应用的一些注意事项

【前言】Element&#xff08;饿了么开源组件库&#xff09;在国内使用的普及率和覆盖率高于TDesign-vue&#xff08;腾讯开源组件库&#xff09;&#xff0c;这也导致日常开发遇到组件使用上的疑惑时&#xff0c;网上几乎搜索不到其文章解决方案&#xff0c;只能深挖官方文档或…

Python编程工具PyCharm和Jupyter Notebook的使用差异

在编写Python程序时需要用到相应的编程工具&#xff0c;PyCharm和Jupyter Notebook是最常用2款软件。 PyCharm是很强大的综合编程软件&#xff0c;代码提示、代码自动补全、语法检验、文本彩色显示等对于新手来说实在太方便了&#xff0c;但在做数据分析时发现不太方便&#xf…

UGUI优化篇(更新中)

UGUI优化篇 1. 基础概念2. 重要的类1. MaskableGraphic类继承了IMaskable类2. 两种遮罩的实现区别RectMask2DMask 3. 渲染部分知识深度测试深度测试的工作原理 渲染队列透明物体在渲染时怎么处理为什么透明效果会造成性能问题 1. 基础概念 所有UI都由网格绘制的如image由两个三…

成为CMake砖家(2): macOS创建CMake本地文档的app

大家好&#xff0c;我是白鱼。 使用 CMake 的小伙伴&#xff0c; 有的是在 Windows 上&#xff0c; 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式&#xff0c; 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…

数模·图论

matlab中图的表示 顶点集权值集的形式 s是源点&#xff0c;t是终点&#xff0c;w是对应的权值 调用graph(s,t,w)作为参数创建图 调用plot函数绘图plot(G,EdgeLabel,G.Edges.Weight,LineWidth,2) 设置x和y的坐标范围set(gca,XTick,[],YTick,[]) s[1 2 3]; t[4 1 2]; w[5 2 6]; …

程序包不存在【java: 程序包org.springframework.boot不存在】

1、问题提示&#xff1a;java: 程序包org.springframework.boot不存在 注意&#xff1a;已经下载好了程序包&#xff0c;就是提示不存在 2、解决办法

一个开源完全免费的无损视频或音频的剪切/裁剪/分割/截取和视频合并工具

大家好&#xff0c;今天给大家分享一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具LosslessCut。 LosslessCut是一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具&#xff0c;专为实现对视频、音频、字幕以及其他相关媒体资产的超高速无损编辑而精心打造。…

《后端程序猿 · EasyPOI 导入导出》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

蓝桥杯嵌入式第十五届模拟考试3解析

1 题目 2 程序 /* USER CODE BEGIN PTD */ char buf1[20],buf2[20],buf3[20],buf4[20],buf5[20],buf6[20],buf7[20],buf8[20],buf9[20]; struct keys {int step;int length;int state; }key[5]; int display; double v1,v2; int t; double v1l1.2,v1u2.2,v2l1.4,v2u3.0; dou…

深度学习复盘与论文复现D

文章目录 一、新环境搭建与适应1、easy_install和pip的安装使用2、关于安装包超时的解决方案3、brew安装包安装4、使用新环境运行以前项目5、解决win的pycharm修改内存后无法启动 二、Dataset 数据读取问题1、Lightning Torch 读取数据2、Pytorch的DataLoader数据读取机制3、Py…

Dify中的经济索引模式实现过程

当索引模式为经济时&#xff0c;使用离线的向量引擎、关键词索引等方式&#xff0c;降低了准确度但无需花费 Token。 一.提取函数**_extract** 根据不同文档类型进行内容的提取&#xff1a; def _extract(self, index_processor: BaseIndexProcessor, dataset_document: Data…

力扣经典题目之->移除值为val元素的讲解,的实现与讲解

一&#xff1a;题目 博主本文将用指向来形象的表示下标位的移动。 二&#xff1a;思路 1&#xff1a;两个整形&#xff0c;一个start&#xff0c;一个end&#xff0c;在一开始都 0&#xff0c;即这里都指向第一个元素。 2&#xff1a;在查到val之前&#xff0c;查一个&…

C语言 ——— 将一句英语短句中的单词进行倒置

目录 题目要求 代码实现 题目要求 将一句英语短句中的单词进行倒置&#xff0c;标点符号不倒置 如&#xff1a; 输入&#xff1a;"I like chongqing very much," 输出&#xff1a;"much, very chongqing like I" 代码实现 #include<stdio.h> #i…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

搭建调用链监控Zipkin和Sleuth

项目环境: win7、jdk8 1、添加依赖&#xff0c;添加了spring-cloud-starter-zipkin会自动导入Sleuth <!--Sleuth&#xff0c;zipkin--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</…

安卓onNewIntent 什么时候执行

一.详细介绍 onNewIntent 方法 onNewIntent 是 Android 中 Activity 生命周期的一部分。它在特定情况下被调用&#xff0c;主要用于处理新的 Intent&#xff0c;而不是创建新的 Activity 实例。详细介绍如下&#xff1a; 使用场景 singleTop 启动模式&#xff1a; 如果一个 Ac…