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

    @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]);
            }
        }
    }
}

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

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

相关文章

[BJDCTF2020]Mark loves cat

黑盒直接扫 dirsearch -u http://bba9a212-64d3-4a16-88b4-3605fe3ef749.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.txt我们用GitHack拿一下源码 没有的去下载一下&#xff0c;开源代码 cd GitHackpython GitHack.py http://bba9a212-64d3-4a16-88b4-3605…

排序算法3_冒泡排序、快速排序

一、冒泡排序 1.1 冒泡排序定义和思路 冒泡排序的基本思想是&#xff1a;通过相邻两个元素之间的比较和交换&#xff0c;使较大的元素逐渐从前面移向后面&#xff08;升序&#xff09;&#xff0c;就像水底下的气泡一样逐渐向上冒泡&#xff0c;所以被称为“冒泡”排序。  在…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法 5.附加&#xff08;1&#xff09;圆环饼图的绘制&#xff08;2&#xff09;南丁格尔玫瑰饼图A.半径展示数…

新手小白的pytorch学习第三弹-------tensor的基本操作

reshape, view, stacking, squeeze(), unsqueeze(),permute()torch.tensor 和 numpy 的 array切片&#xff0c;张量里面获取元素值随机种子 1 导入torch import torch2 reshape() tensor_A torch.arange(1, 11) tensor_Atensor_A.reshape(2, 5) tensor_A.reshape(2, 5)tenso…

浮点数存储方法(float,double,long double)

前言&#xff1a; 浮点数家族包括float、double、long double 类型。 如果你打出3.14&#xff0c;编译器默认是double类型的。若想让他为float类型&#xff0c;则要在前面加f&#xff1b; 1E10是科学计数法&#xff0c;代表1.010^10 (1) 浮点型如何在内存中存放&#xff1f;…

husky 和 lint-staged 构建代码项目规范

目录 前言 最简单的方法 过 scripts 来解决如果检测工具多&#xff0c;需要多次处理 通过 husky(哈士奇)来解决容易遗忘的问题 1. 安装 2. husky init 3. 试一试​ lint-stadge 只 lint 改动的 1. 安装 2. 修改 package.json 配置 3. 添加 npm 脚本: 4.使用 Husky…

Linux的load(负载)

负载(load)是Linux机器的一个重要指标&#xff0c;直观了反应了机器当前的状态。 在Linux系统中&#xff0c;系统负载是对当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数。 Linux的负载高&#xff0c;主要是由于CPU使用、内存使用、10消…

【AI】目标检测算法【R-CNN:Regions with CNN features】

1. 常用目标检测算法介绍 目标检测是计算机视觉领域的一个重要分支&#xff0c;它旨在识别并定位图像中的各种对象。以下是一些流行的目标检测算法&#xff1a; 1.1 二阶段目标检测算法 R-CNN (Regions with CNN features): 通过选择性搜索算法选取候选区域&#xff0c;然后…

【C语言】详解结构体(上)

文章目录 前言1. 结构体类型的含义2.结构体的声明2.1 结构体声明的语法2.2 结构体变量的创建和初始化 3.结构体的特殊声明4. 结构体的自引用5.小结 前言 C语言的数据类型分为内置数据类型和自定义的数据类型。所谓的内置的数据类型可以认为是C语言自带的数据类型&#xff08;c…

【网络安全】基于PHP study的DVWA靶场搭建教程

PHP study的安装本文略过 DVWA安装地址 https://github.com/digininja/DVWA?tabreadme-ov-file将zip文件安装至PHP study的www目录下&#xff1a; 解压&#xff0c;进入config目录中&#xff0c;将.dist后缀删除&#xff1a; 接着打开该php文件&#xff0c;将用户名、密码改为…

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

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

Qt5离线安装包无法下载问题解决办法

Qt5离线安装包无法下载问题解决办法 文章目录 Qt5离线安装包无法下载问题解决办法1、前言2、Qt5安装包下载办法 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt安装包官方下载地址 Qt5离线安装包目前在国内已经被墙…

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 二.返回倒数第k个节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 三.反转链表思路1&#xff1a;头插法思路2&#xff1a;反转指针的指向 四.链表的回文结构思路1&#xff1a;利…

react + redux 状态管理操作

目录 1 概念2 Redux 安装3 创建子模块并导入4 中间件为 react 注入 store5 在组件中使用 store 数据6 修改 store 数据7 提交 action 传参8 异步状态操作9 redux 调试工具 1 概念 Redux 是一个全局状态管理的 JS 库 2 Redux 安装 在react中使用redux&#xff0c;官方要求安…

css设置弹性flex后,如果设置100vh高度不撑满的原因

问题 父元素设置height为100%&#xff0c;有两个子元素&#xff0c;第一个设置height:100vh&#xff0c;第二个设置flex:1&#xff0c;此时第一个高度无法撑满盒子 原因解决方式 当父元素设置display为flex,第一个div设置高度64px,剩一个div设置高度为flex&#xff1a;1,这时…

DROO论文笔记

推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址&#xff1a;用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址&#xff1a;DR…

AG32 的MCU与FPGA的主频可以达到568MHz吗

Customers: AG32/ AGRV2K 这个芯片主频和定时器最高速度是多少&#xff1f;用户期望 CPLD计时器功能0.1ns以下。 AGM RE: CPLD做不到 0.1ns的速率&#xff0c;这个需要10G以上的时钟。 那AGRV2K最高多少MHz呢&#xff1f; 一般200MHZ比较容易实现。 进一步说明&#xff1…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

51单片机5(GPIO简介)

一、序言&#xff1a;不论学习什么单片机&#xff0c;最简单的外设莫过于I口的高低电平的操作&#xff0c;接下来&#xff0c;我们将给大家介绍一下如何在创建好的工程模板上面&#xff0c;通过控制51单片机的GPIO来使我们的开发板上的LED来点亮。 二、51单片机GPIO介绍&#…