【黑马程序员java笔记】面向对象综合训练

文字版格斗游戏

题目

  1. 角色类:
    变量: 姓名:一维数组
    性别:一维数组
    外貌:二维数组
    攻击方式:一维数组
    血量:一维数组
    构造: 将上述变量合成一个角色
    方法: 设置角色的各种信息
    展示角色的信息
    攻击和受伤
  2. 测试类:
    变量:角色
    方法: 展示角色信息
    进行回合制攻击
    代码:
    角色类的代码:
package com.oop.demo04;
import java.util.Random;

/**
 * @author soso
 * @PackageName:com.oop.demo04
 * @ClassName:Role
 * @Description:根据性别随机给予外貌和攻击方式
 * @date 2024/9/516:24
 */
public class Role {
    //	变量: 姓名:一维数组
    //				性别:一维数组
    //				外貌:二维数组
    //				攻击方式:一维数组
    //				血量:一维数组
    private String name;
    private int blood;
    private char gender;
    private String appearance;

    String[][] appearances = {{"武力值高","长得漂亮","反应迅速"},{"高大强壮","灵活应变","聪明机智"}};
    //攻击和受伤描述
    String[] attackWays = {
        "%s利用回旋踢,踢向%s的头顶",
        "%s利用滑铲,将%s铲翻",
        "%s利用毒针,刺向%s的胸口"
    };
    String[] hurtWays = {
      "结果%s躲过,毫发无伤",
      "结果%s受重伤",
      "%s倒地不起"
    };

    //	构造: 将上述变量合成一个角色
    public Role(String name,int blood,char gender) {
        this.name = name;
        this.blood = blood;
        this.gender = gender;
        setAppearance(gender);

    }
    //	方法: 设置角色的各种信息
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBlood() {
        return blood;
    }

    public void setBlood(int blood) {
        this.blood = blood;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getAppearance() {
        return appearance;
    }

    public void setAppearance(char gender) {
        Random rand = new Random();
        if (gender == 'm') {
            int r = rand.nextInt(appearances.length);
            this.appearance = appearances[1][r];
        }else if (gender == 'f') {
            int r = rand.nextInt(appearances.length);
            this.appearance = appearances[0][r];
        }else{
            //默认长相
            this.appearance = appearances[0][0];
        }
    }

    //				展示角色的信息
    public void showRoleInfo(){
        System.out.println("Name: " + getName());
        System.out.println("Blood: " + getBlood());
        System.out.println("Gender: " + getGender());
        System.out.println("Appearance: " + getAppearance());
    }
    //				攻击和受伤
    public void attack(Role role){
        Random rand = new Random();
        int index = rand.nextInt(attackWays.length);
        String realAttack = attackWays[index];

        //输出攻击效果
        System.out.printf(realAttack,this.getName(),role.getName());
        System.out.println();

        //计算收到的伤害
        int hurt = rand.nextInt(30)+1;

        //剩余血量
        int remainBoold =role.getBlood()-hurt;
        //对剩余血量进行判断,为负则改为零
        remainBoold =remainBoold < 0 ? 0 : remainBoold;
        //修改剩余血量
        role.setBlood(remainBoold);

        //受伤描述
        if (remainBoold > 90){
            System.out.printf(hurtWays[0],role.getName());
        }else if (remainBoold > 60){
            System.out.printf(hurtWays[1],role.getName());
        }else{
            System.out.printf(hurtWays[2],role.getName());
        }
        System.out.println();
    }


}

测试类的代码:

package com.oop.demo04;

/**
 * @author soso
 * @PackageName:com.oop.demo04
 * @ClassName:GameTest
 * @Description:两个角色进行格斗
 * @date 2024/9/516:24
 */
public class GameTest {
    public static void main(String[] args) {
        //	变量:角色
        Role r1 = new Role("大乔",100,'f');
        Role r2 = new Role("悟空",100,'m');

        //	方法: 展示角色信息
        r1.showRoleInfo();
        r2.showRoleInfo();
        //				进行攻击
        int i = 0;
        while(true) {
            //r1攻击r2
            r1.attack(r2);
            i++;
            //判断r2的剩余血量
            if(r2.getBlood() == 0){
                System.out.println(r1.getName()+ "K.O.了" +r2.getName());
                break;
            }else{
                System.out.println(r2.getName()+"第"+i+"血");
            }
            //r2攻击r1
            r2.attack(r1);
            //判断r1的剩余血量
            if(r1.getBlood() == 0){
                System.out.println(r2.getName()+ "K.O.了" +r1.getName());
                break;
            }else{
                System.out.println(r1.getName()+"第"+i+"血");
            }
        }
    }
}

结果图:
回合攻击

外貌描述
重点:理清楚每一类中需要有什么变量、构造和方法;
问题:
如何构造实现测试类中通过输入来选择角色?
如何将攻击方式扣除的血量固定?

两个对象数组

数组的添加、遍历、删除和修改
题目

  1. 学生类:
    变量:学号,姓名,年龄。
    构造:获得学号,姓名和年龄
    方法:展示学生信息
  2. 测试类:
    变量:定义一个数组用于存储学生
    方法:
    1. 定义一个数组,用于存储初始学生
    2. 添加一个学生对象,可以从键盘读入
    3. 进行学号唯一性判断
    3.1 判断学生对象的学号是否包含于已经存在的数组中
    3.2 如果存在,则提示重复不加入数组。否则,加入数组
    3.2.1 利用数组中是否存在null值判断数组是否存储满
    3.2.2 如果存储满了,则定义一个新的数组,长度为原数组长度加一,将新的学生对象存储
    3.2.3 否则,直接加入原数组
    3.2.4 导出添加好学生对象的数组
    4. 遍历学生信息,注意判断数组中是否存在空值,存在则不打印
    5. 键盘读入要删除的学生id
    5.1 判断是否存在(可用3.1的方法)
    5.2 不存在则提示该学生不存在
    5.3 存在则删除
    5.3.1 获得该id在数组中的索引,利用方法导出索引
    5.3.2 定义一个新的数组为原数组长度减一
    5.3.3 该索引前原数组赋值给新数组,该索引后原数组全部往前移一个给新数组
    5.3.4 导出删除后的数组
    6. 再次遍历数组学生信息
    7. 判断id为“A02”的学生是否存在,存在则利用setAge将其年龄加一岁,否则打印不存在该学生
    学生类:
package com.oop.demo06;

/**
 * @author soso
 * @PackageName:com.oop.demo06
 * @ClassName:student
 * @Description:定义学生对象
 * @date 2024/9/521:26
 */
public class Student {
    private String id;
    private String name;
    private int age;

    //构造
    public Student() {

    }
    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    //方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //方法
    public void display() {
        System.out.println("ID: " + getId() + " Name: " + getName() + " Age: " + getAge());
    }
}

测试类:

package com.oop.demo06;
import java.util.Scanner;

/**
 * @author soso
 * @PackageName:com.oop.demo06
 * @ClassName:studentTest
 * @Description:对学生数组进行添加、遍历、修改和删除
 * @date 2024/9/521:27
 */
public class StudentTest {
    public static void main(String[] args) {
        //1. 定义一个数组,用于存储初始学生
        Student[] students = new Student[3];
        Student s1 = new Student("A01","Mary",18);
        Student s2 = new Student("A02","Jane",18);
        Student s3 = new Student("A03","Frede",18);

        students[0] = s1;
        students[1] = s2;
        students[2] = s3;

        //		2. 添加一个学生对象,可以从键盘读入
        Student s4 = new Student("A04","soso",18);
        //		3. 进行学号唯一性判断并添加,只能一个一个添加,尚未实现批量添加
        students = insertStudents(students,s4);

        //		4. 遍历学生信息,注意判断数组中是否存在空值,存在则不打印
        for (int i = 0; i < students.length; i++) {
            students[i].display();
        }
        //		5. 键盘读入要删除的学生id
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter student ID: ");
        String deleteId = sc.nextLine();
        students = deleteStudents(students,deleteId);
        sc.close();

        //		6. 再次遍历数组学生信息
        for (int i = 0; i < students.length; i++) {
            students[i].display();
        }
        //		7. 判断id为“A02”的学生是否存在,存在则利用setAge将其年龄加一岁,否则打印不存在该学生
        changeStudent(students,"A02");

    }
    //3.
    public static Student[] insertStudents(Student[] students, Student s) {
        //			3.1 判断学生对象的学号是否包含于已经存在的数组中
        //			3.2 如果存在,则提示重复不加入数组。否则,加入数组
        if(!isId(s.getId(), students)){
            //加入数组
            return insertStudent(students, s);

        }else{
            System.out.println("Student with id "+s.getId()+" already exists");
        }
        return students;
    }
    //3.1
    public static boolean isId(String id, Student[] students) {
        for (int i = 0; i < students.length; i++) {
            if (students[i].getId().equals(id)) {
                return true;
            }
        }
        return false;
    }
    //3.2
    public static Student[] insertStudent(Student[] students,Student s) {
        //				3.2.1 利用数组中是否存在null值判断数组是否存储满
        for (int i = 0; i < students.length; i++) {
            if (students[i].getId() == null){
                //				3.2.3 否则,直接加入原数组
                students[i] = s;
                //				3.2.4 导出添加好学生对象的数组
                return students;
            }
        }
        //				3.2.2 如果存储满了,则定义一个新的数组,长度为原数组长度加一,将新的学生对象存储
        Student[] newStudents = new Student[students.length+1];
        for (int i = 0; i < students.length; i++) {
            newStudents[i] = students[i];
        }
        newStudents[newStudents.length-1] = s;
        //				3.2.4 导出添加好学生对象的数组
        return newStudents;
    }
    //5.
    public static Student[] deleteStudents(Student[] students, String deleteId) {
        //			5.1 判断是否存在(可用3.1的方法)
        if(isId(deleteId, students)){
            //			5.3 存在则删除
            return deleteStudent(students, deleteId);
        }else{
            //			5.2 不存在则提示该学生不存在
            System.out.println("Student with id "+deleteId+" does not exist");
        }
        return students;
    }
    //5.3
    public static Student[] deleteStudent(Student[] students,String deleteId) {
        //				5.3.1 获得该id在数组中的索引,利用方法导出索引
        int index = getIndex(students,deleteId);
        //				5.3.2 定义一个新的数组为原数组长度减一
        Student[] newStudents = new Student[students.length-1];
        //				5.3.3 该索引前原数组赋值给新数组,该索引后原数组全部往前移一个给新数组
        for (int i = 0; i < index; i++) {
            newStudents[i] = students[i];
        }
        for (int i = index+1; i < students.length; i++) {
            newStudents[i-1] = students[i];
        }
        //				5.3.4 导出删除后的数组
        return newStudents;
    }
    //5.3.1
    public static int getIndex(Student[] students, String deleteId) {
        for (int i = 0; i < students.length; i++) {
            if (students[i].getId().equals(deleteId)){
                return i;
            }
        }
        return -1;
    }
    //7.
    public static void changeStudent(Student[] students, String changeId) {
        int flag = 0;
        for (int i = 0; i < students.length; i++) {
            if (students[i].getId().equals(changeId)){
                int newAge = students[i].getAge() + 1;
                students[i].setAge(newAge);
                System.out.println("The age of the student "+students[i].getId()+" has been changed to "+newAge);
                students[i].display();
                flag = 1;
                break;
            }
        }
        if (flag == 0){
            System.out.println("Student with id "+changeId+" does not exist");
        }
    }
}

结果图:
不能删除
可以删除

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值