Java面向对象(综合案例)有点难度 附代码解释

01-文字版格斗游戏

代码:

Role类(JavaBean)的代码:

package com.xiaonan.exercise01;

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_des = {
            "%s使出了一招[螺旋飞刺],转到对方的身后一掌向%s背心的灵台穴拍去",
            "%s施展了一记[螺旋飞刺],猛地转身,一掌拍向%s的背心灵台穴]",
            "%s运用[螺旋飞刺]的绝技,转身快如闪电,向%s背后的灵台穴击出一掌]",
            "%s身法矫捷,使出[螺旋飞刺]绝技,转身后一掌拍向%s的背心灵台穴]",
            "%s突然使出[螺旋飞刺]绝技,转身瞬间,向%s背后的灵台穴拍去一掌]"
    };


    //方法
    public Role() {
    }

    public Role(String name, int blood, char gender) {
        this.name = name;
        this.blood = blood;
        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) {
        //长相是随机的
        Random r = new Random();

        if (gender == '男') {
            int index = r.nextInt(boyFaces.length);
            this.face = boyFaces[index];

        } else if (gender == '女') {
            int index = r.nextInt(girlFaces.length);
            this.face = girlFaces[index];
        } else {
            this.face = "未知长相";
        }
    }

    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 void attack(Role role) {
        //创建Random对象
        Random r = new Random();
        //随机招式
        int index = r.nextInt(attacks_des.length);
        String kongfu = attacks_des[index];
        //输出一下攻击的效果
        System.out.printf(kongfu,this.getName(),role.getName()); //这里this.name也可以

        //设置随机伤害的大小 1-20
        int hurt = r.nextInt(20) + 1;
        //剩余血量
        int remainBlood = role.getBlood() - hurt;
        remainBlood = remainBlood < 0 ? 0 : remainBlood;
        //输出伤害
        System.out.println("造成了"+hurt+"点伤害"+role.getName()+"还剩下"+remainBlood+"的血量");
        System.out.println();
        //修改一下被打的人的血量
        role.setBlood(remainBlood);

    }

    //角色的信息
    public void showRole() {
        System.out.println("姓名为:" + getName());
        System.out.println("血量为:" + getBlood());
        System.out.println("性别为:" + getGender());
        System.out.println("长相为:" + getFace());

    }
}

GameTest类的代码:

package com.xiaonan.exercise01;

public class GameTest {
    public static void main(String[] args) {
        //1. 创建第一个角色 初始化名字 和血量(100)
        Role r1 = new Role("莫华南", 100, '男');
        //2. 创建第二个角色 初始化名字 和血量(100)
        Role r2 = new Role("恐龙", 100, '女');

        //展示一下角色的信息
        r1.showRole();
        r2.showRole();
        //设置一个标志 用于代表是第几个回合
        int flag = 0;
        //3. 开始格斗 回合制游戏
        while (true) {
            flag++;
            System.out.println("第" + flag + "回合");
            //先第一个角色打第二个角色
            r1.attack(r2);
            //当角色血量为0时 退出循环 结束格斗
            if (r2.getBlood() == 0) {
                System.out.println(r1.getName() + "在第" + flag + "回合中KO了" + r2.getName());
                break;
            }

            //然后第二个角色打第一个角色
            r2.attack(r1);
            if (r1.getBlood() == 0) {
                System.out.println(r2.getName() + "在第" + flag + "回合中KO了" + r1.getName());
                break;
            }
        }
    }

}

代码解释:

  1. Role 类是角色的定义,具有以下属性:

    • name:角色名字
    • blood:角色血量
    • gender:角色性别
    • face:角色长相(随机选择)
  2. boyFaces 和 girlFaces 是保存男性和女性角色长相的字符串数组。

  3. attacks_des 是保存攻击描述的字符串数组,包含不同的攻击方式描述。

  4. Role 类有两个构造方法,一个是默认构造方法,另一个是带有参数的构造方法,用于初始化角色的属性。

  5. setFace(char gender) 方法根据传入的性别参数随机选择角色的长相。使用 Random 类生成随机数来选择对应性别的长相。

  6. attack(Role role) 方法表示角色进行攻击的行为。首先使用 Random 类生成随机数来选择攻击描述,然后输出攻击效果。接着生成随机数来确定造成的伤害大小,计算剩余血量,并输出伤害信息。最后修改被攻击角色的血量。

  7. showRole() 方法用于展示角色的信息,输出角色的姓名、血量、性别和长相。

  8. GameTest 类是游戏的测试类,包含 main 方法。在 main 方法中,创建两个角色对象 r1 和 r2,并初始化它们的属性。然后展示两个角色的信息。

  9. 使用一个循环来模拟回合制的格斗游戏。在每个回合中,先由第一个角色 r1 攻击第二个角色 r2,然后判断被攻击角色的血量是否为0,如果为0,则输出击败信息并结束游戏。接着第二个角色 r2 攻击第一个角色 r1,同样判断被攻击角色的血量是否为0,如果为0,则输出击败信息并结束游戏。

02-两个对象数组的练习

代码:

package com.xiaonan.exercise03;

public class Car {
    //属性
    private String brand;//品牌
    private double price;//价格
    private String color;//颜色

    //构造方法
    public Car() {
    }

    public Car(String brand, double price, String color) {
        this.brand = brand;
        this.price = price;
        this.color = color;
    }

    //方法

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

package com.xiaonan.exercise03;

import java.util.Scanner;

public class CarTest {
    public static void main(String[] args) {
        //1. 动态定义一个数组
        Car[] arr = new Car[3];
        //2. 创建三个Car对象 由键盘录入
        Scanner sc = new Scanner(System.in);
        //Car c = new Car();
        for (int i = 0; i < arr.length; i++) {
            Car c = new Car();
            System.out.println("请输入手机的品牌");
            String brand = sc.next();
            //赋值到c的brand属性
            c.setBrand(brand);
            System.out.println("请输入手机的价格");
            double price = sc.nextDouble();
            //赋值到c的price属性
            c.setPrice(price);
            System.out.println("请输入手机的颜色");
            String color = sc.next();
            //赋值到c的color属性
            c.setColor(color);

            //把对象赋值到数组里
            arr[i] = c;

        }
        //遍历输出
        for (int i = 0; i < arr.length; i++) {
            Car car = arr[i];
            System.out.println(car.getBrand()+" "+car.getPrice()+" "+car.getColor());
        }
    }
}

注意点:

    //Car c = new Car();
    for (int i = 0; i < arr.length; i++) {
        Car c = new Car();

Car c = new Car();这句话不能写在for循环的外面,在外面表示只创建了一个Car对象,并不断的赋值

写在循环的里面,表示创建三个对象,并对对象里的属性进行赋值

03-复杂对象数组练习-添加和遍历

代码:

package com.xiaonan.exercise05;

public class Student {
    //属性
    private int number;
    private String name;
    private int age;
    //构造方法

    public Student() {
    }

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

    //方法

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

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



package com.xiaonan.exercise05;

import java.util.Scanner;

public class StudentTest {
    public static void main(String[] args) {
        //1. 定义一个长度为2 的数组
        Student[] arr = new Student[2];
        //2. 创建一个Studen对象 并赋值到数组里
        Student stu1 = new Student(1, "莫华南", 18);
        Student stu3 = new Student(3, "莫才兴", 18);

        arr[0] = stu1;
        arr[1] = stu3;
        //3. 在次添加一个学生对象 并在添加的时候进行 学号的唯一性的判断
        Student stu2 = new Student(2, "莫华棋", 18);
        boolean flag = judgeNumber(arr, stu2.getNumber());
        if (flag) {
            // flag为真 就说明该学号已经存在
            System.out.println("您输入的学号已经存在");
        } else {
            //不存在 那就添加

            //如果数组已经满了
            int count = arrCount(arr);
            if (count == arr.length) {
                // 在创建一个新的数组长度为原来的数组长度+1
                Student[] newArr = createNewArr(arr);
                //将所要添加的数据赋值到新数组里
                //count 就代表下一个数字的索引
                newArr[count] = stu2;

                //遍历输出数组里的元素 实参为新数组的引用
                printArr(newArr);

                //否则数组没有满
            } else {
                //将所要添加的数据赋值到旧数组里
                //count 同理
                arr[count] = stu2;
                //遍历输出数组里的元素 实参为旧数组的引用
                printArr(arr);
            }
        }
    }

    //遍历输出数组里的数据
    public static void printArr(Student[] arr) {
        for (int i = 0; i < arr.length; i++) {
            //引入一个新的Student变量 便于理解
            Student stu = arr[i];
            if (stu == null) {
                break;
            } else {
                System.out.println(stu.getNumber() + " " + stu.getName() + " " + stu.getAge());
            }
        }
    }

    //创建一个新的数组 并将原来数组的内容赋值到新的数组里 并返回新的数组
    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;
    }


    //判断数组是否满了 返回数组里的元素的个数
    public static int arrCount(Student[] arr) {   //static 可以直接用类名来调用 而不用创建对象去调用
        //用于统计数组里的元素的个数
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            Student stu = arr[i];
            if (stu == null) {
                break;
            } else {
                count++;
            }
        }
        return count;
    }


    //学号的唯一性判断
    public static boolean judgeNumber(Student[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            Student stu = arr[i];
            //注意arr数组里面有可能为null 所以要加if判断 不为null才进行下一步的判断
            if (stu != null) {
                int stuNumber = stu.getNumber();
                if (stuNumber == number) {
                    return true;
                }
            }
        }
        return false;
    }

}

代码解释:

这段代码是一个简单的学生信息管理程序。它包含了一个Student类和一个StudentTest类。

Student类定义了学生对象的属性和方法。每个学生对象有学号(number)、姓名(name)和年龄(age)属性。它还提供了构造方法和相应的getter和setter方法。

StudentTest类是程序的入口点。它创建一个长度为2的学生数组(arr),并初始化其中的两个元素。然后,它尝试添加第三个学生对象(stu2)到数组中,并进行学号的唯一性判断。如果学号已经存在,则输出提示信息;否则,根据数组是否已满进行添加操作。如果数组已满,它会创建一个新的数组(newArr),将原数组的元素复制到新数组中,并将新的学生对象添加到新数组的末尾。最后,它调用printArr方法遍历输出数组中的学生信息。

printArr方法用于遍历输出数组中的学生信息。它使用一个循环遍历数组中的每个元素,并通过调用学生对象的getter方法获取学号、姓名和年龄,并输出到控制台。

createNewArr方法用于创建一个新的数组,并将原数组的内容复制到新数组中。它首先创建一个长度比原数组大1的新数组(newArr),然后使用一个循环将原数组的元素逐个复制到新数组中。

arrCount方法用于判断数组是否已满,即数组中元素的个数是否等于数组的长度。它使用一个循环遍历数组中的每个元素,如果遇到null值,则认为数组已满,立即退出循环;否则,增加计数器的值。最后,它返回计数器的值作为元素个数。

judgeNumber方法用于判断学号是否已经存在于数组中。它使用一个循环遍历数组中的每个元素,如果遇到非null的元素,并且学号与给定的学号相等,则返回true表示学号已经存在;如果循环结束仍未找到匹配的学号,则返回false表示学号不存在。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐