《面向对象综合训练01~05》

《面向对象综合训练01~05》

训练01:文字版格斗游戏

  • 第一步:创建游戏角色的javabean类
java 复制代码
public class Role {
    private String name;
    private int blood;
    private char gender;
    private String face;//长相是随机的

    //创建男女长相的随机数组
    String[] boyfaces = {"风流俊雅", "气字轩昂", "相貌英俊", "五官端正", "相貌平平", "一塌糊涂", "面目狰狞"};
    String[] girlfaces = {"美奂绝伦", "沉鱼落雁", "婷婷玉立", "身材娇好", "相貌平平", "相貌简陋", "惨不忍睹"};
    //attack 攻击描述:
    String[] attacks_desc = {
            "%s使出了一招【背心钉】,转到对方的身后,一掌向%s背心的灵台穴拍去。",
            "%s使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向%s.",
            "%s大喝一声,身形下伏,一招【劈雷坠地】,捶向%s双腿。n",
            "%s运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向%s。",
            "%s阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向%s。",
            "%s上步抢身,招中套招,一招【劈挂连环】,连环攻向%s。"
    };
    //injured 受伤描述:
    String[] injureds_desc = {
            "结果%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 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 getFace() {
        return face;
    }

    public void setFace(char gender) {
        //在初始化过程中使用setFace随机设置长相
        Random r = new Random();
        if (gender == '男') {
            //如果人物性别是男,就从boyfaces随机一个长相
            int index = r.nextInt(boyfaces.length);
            this.face = boyfaces[index];
        } else if (gender == '女') {
            //如果人物性别是男,就从grilfaces随机一个长相
            int index = r.nextInt(girlfaces.length);
            this.face = girlfaces[index];
        } else {
            this.face = "面目狰狞";
        }
    }
    
    //输出所创建角色的所有属性
    public void getInfoRole() {
        System.out.println("姓名:" + getName());
        System.out.println("血量:" + getBlood());
        System.out.println("性别:" + getGender());
        System.out.println("长相:" + getFace());
    }
    
    //设计一个攻击方法
    public void attack(Role role) {
        //首先描述攻击招式
        Random r = new Random();
        int index = r.nextInt(attacks_desc.length);
        System.out.printf(attacks_desc[index], this.getName(), role.getName());
        System.out.println();

        //计算造成的伤害

        int hurt = r.nextInt(20) + 1;

        //计算被攻击者剩余血量
        int remainBlood = role.getBlood() - hurt;

        //对剩余血量做验证,如果已经为负数了,就修改为0
        remainBlood = remainBlood < 0 ? 0 : remainBlood;

        //修改被攻击者的剩余血量
        role.setBlood(remainBlood);

        //受伤情况描述
        if (remainBlood >= 90) {
            System.out.printf(injureds_desc[0], role.getName());
        } else if (remainBlood >= 80) {
            System.out.printf(injureds_desc[1], role.getName());
        } else if (remainBlood >= 70) {
            System.out.printf(injureds_desc[2], role.getName());
        } else if (remainBlood >= 60) {
            System.out.printf(injureds_desc[3], role.getName());
        } else if (remainBlood >= 40) {
            System.out.printf(injureds_desc[4], role.getName());
        } else if (remainBlood >= 20) {
            System.out.printf(injureds_desc[5], role.getName());
        } else if (remainBlood >= 10) {
            System.out.printf(injureds_desc[6], role.getName());
        } else {
            System.out.printf(injureds_desc[7], role.getName());
        }
        System.out.println();
    }
}
  • 创建游戏测试类进行测试
java 复制代码
public class GameTest {
    public static void main(String[] args) {
        //1.创建2个角色
        Role r1 = new Role("乔峰", 100,'男');
        Role r2 = new Role("鸠摩智", 100,'男');
        r1.getInfoRole();
        r2.getInfoRole();

        //2.使用while循环实现两个角色相互攻击
        while (true) {
            //r1先攻r2
            r1.attack(r2);
            //判断被攻击者的血量,如果为0跳出输出结果、跳出循环
            if (r2.getBlood() == 0) {
                System.out.println(r1.getName() + "K.O 了" + r2.getName());
                break;
            }
            //r2再共计r1
            r2.attack(r1);
            //判断被攻击者的血量,如果为0跳出输出结果、跳出循环
            if (r1.getBlood() == 0) {
                System.out.println(r2.getName() + "K.O 了" + r1.getName());
                break;
            }
        }
    }
}

训练02:两个对象数组练习

  • 对象数组练习1
    • 定义数组存储3个商品对象,
    • 商品的属性:商品的id,名字,价格,库存。
    • 创建四个商品对象,并把商品对象存入到数组当中;

第一步:创建商品的javabean类

java 复制代码
public class Goods {
    private String id;
    private String name;
    private double price;
    private  int count;

    public Goods() {
    }

    public Goods(String id, String name, double price, int count) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.count = count;
    }

    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 double getPrice() {
        return price;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", count=" + count +
                '}';
    }
}

第二步:定义数组,创建4个商品对象,并存入数组

java 复制代码
public class GoodsTest {
    public static void main(String[] args) {
        //1.动态初始化创建数组
        Goods[] goods = new Goods[4];

        //2.创建3个商品对象
        Goods g1 = new Goods("001","华为P40",5999.0,100);
        Goods g2 = new Goods("001","保温杯",239.0,50);
        Goods g3 = new Goods("001","小米笔记本",6999.0,10);
        Goods g4 = new Goods("001","苹果13手机",7999.0,59);

        //3.把商品对象存入数组中
        goods[0] = g1;
        goods[1] = g2;
        goods[2] = g3;
        goods[3] = g4;

        //3.打印数组
        for (int i = 0; i < goods.length; i++) {
            Goods good = goods[i];
            System.out.println(good.toString());
        }
    }
}
  • 对象数组练习2
    • 定义数组存储3部汽车对象;
    • 汽车的属性:品牌,价格,颜色;
    • 创建三个汽车对象,数据通过键盘录入而来,并把数据存入到数组当中;
  • 第一步:创建汽车的javabean类
java 复制代码
public class Cars {
    private String brand;
    private int price;
    private String color;

    public Cars() {
    }

    public Cars(String brand, int 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 int getPrice() {
        return price;
    }

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

    public String getColor() {
        return color;
    }

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

    @Override
    public String toString() {
        return "Cars{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}
  • 第二步:创建3个汽车对象,使用键盘接收汽车属性,并把3个汽车对象存入数组中
java 复制代码
public class CarsTest {

    public static void main(String[] args) {
        //1.创建一个汽车数组
        Cars[] cars = new Cars[3];
        //2.创建3个汽车对象,使用键盘接收汽车属性,并把3个汽车对象存入数组中
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < cars.length; i++) {
            //创建汽车对象,通过键盘接收汽车属性数据
            Cars car = new Cars();//创建汽车对象一定要写在for循环的里面,因为为我们要创建3和不同的对象
            System.out.println("请输入汽车的品牌:");
            String brand = scanner.next();
            car.setBrand(brand);
            System.out.println("请输入汽车的价格:");
            int price = scanner.nextInt();
            car.setPrice(price);
            System.out.println("请输入汽车的颜色:");
            String color = scanner.next();
            car.setColor(color);
            //把创建的汽车对象存入数组中
            cars[i] = car;
        }
        //3.遍历数组
        for (int i = 0; i < cars.length; i++) {
            System.out.println(cars[i].toString());
        }
    }
}
  • 以上练习中需掌握键盘输入的两套体系
  • 第一套体系:
    • nextInt();接收整数
    • nextDouble();接收小数
    • next();接收字符串
    • 遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了
  • 第二套体系:
    • nextLine();接收字符串
    • 可以接收空格,制表符,遇到回车才停止接受数据
  • 以上练习中还需要注意
  • Cars car = new Cars();创建汽车对象一定要写在for循环的里面,因为为我们要创建3和不同的对象;

训练03:两个对象数组练习-判断并统计

  • 对象数组练习3
    • 定义数组存储3部手机对象
    • 手机的属性:品牌,价格,颜色。
    • 要求,计算出三部手机的平均价格
  • 第一步:创建手机javabean类
java 复制代码
public class Phone {
    private String brand;
    private int price;
    private String color;

    public Phone() {
    }

    public Phone(String brand, int 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 int getPrice() {
        return price;
    }

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

    public String getColor() {
        return color;
    }

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

    @Override
    public String toString() {
        return "Phone{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}
  • 第一步:定义数组存储3部手机对象,并计算出三部手机的平均价格
java 复制代码
public class PhoneTest {
    public static void main(String[] args) {
        //1.创建一个大小为3的手机数组
        Phone[] phones = new Phone[3];
        //2.创建3个手机对象
        Phone p1 = new Phone("小米",3999,"黑色");
        Phone p2 = new Phone("华为",5999,"蓝色");
        Phone p3 = new Phone("苹果",7999,"白色");
        //3.把3个手机对象存入数组中
        phones[0] = p1;
        phones[1] = p2;
        phones[2] = p3;
        int sum = 0;
        for (int i = 0; i < phones.length; i++) {
            sum = sum + phones[i].getPrice();
        }
        int vag = sum / phones.length;
        System.out.println(vag);
    }
}
  • 对象数组练习4
    • 定义数组存储4个女朋友的对象
    • 女朋友的属性:姓名、年龄、性别、爱好
    • 要求1:计算出四个女朋友的平均年龄
    • 要求2:统计年龄比平均值低的女朋友有几个?并把她们的所有信息打印出来
      第一步:创建女朋友的javabean类
java 复制代码
public class GirlFriend {
    private String name;
    private int age;
    private String gender;
    private String hobby;

    public GirlFriend() {
    }

    public GirlFriend(String name, int age, String gender, String hobby) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.hobby = hobby;
    }

    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 String getGender() {
        return gender;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", hobby='" + hobby + '\'' +
                '}';
    }
}

第二步:创建GirlFriendTest类实现功能

java 复制代码
public class GirlFriendTest {
    public static void main(String[] args) {
        //1.定义数 组存储4个女朋友对象
        GirlFriend[] girlFriends = new GirlFriend[4];
        //2.创建4个女朋对象
        GirlFriend gf1 = new GirlFriend("小诗诗",18,"萌妹子","吃零食");
        GirlFriend gf2 = new GirlFriend("小丹丹",19,"萌妹子","睡觉");
        GirlFriend gf3 = new GirlFriend("小慧慧",20,"萌妹子","看书");
        GirlFriend gf4 = new GirlFriend("小艳艳",21,"萌妹子","运动");
        //3.将4个对象添加到数组
        girlFriends[0] = gf1;
        girlFriends[1] = gf2;
        girlFriends[2] = gf3;
        girlFriends[3] = gf4;
        //4.计算4个女朋友的年龄之和
        int sum = 0;
        for (int i = 0; i < girlFriends.length; i++) {
            sum += girlFriends[i].getAge();
        }
        //5.求平均年龄
        int vag = sum / girlFriends.length;
        System.out.println(vag);
        //6.统计低于平均年龄的女朋友个数,并打印出来
        int count = 0;
        for (int i = 0; i < girlFriends.length; i++) {
            if (girlFriends[i].getAge() < vag){
                count++;
                System.out.println(girlFriends[i].toString());
            }
        }
        System.out.println(count);
    }
}

训练05/06:复杂对象数练习-添加、遍历、修改、删除

复制代码
定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,
学生对象的学号,姓名各不相同学生的属性:学号,姓名,年龄。
要求1:再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
要求2:添加完毕之后,遍历所有学生信息。
要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
要求4:删除完毕之后,遍历所有学生信息。
要求5:查询数组id为"2"的学生,如果存在,则将他的年龄+1岁。
  • 代码示例:
java 复制代码
public class StudentTest {
    /*
    定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同学生的属性:学号,姓名,年龄。
    要求1:再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
    要求2:添加完毕之后,遍历所有学生信息。
    要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
    要求4:删除完毕之后,遍历所有学生信息。
    要求5:查询数组id为"2"的学生,如果存在,则将他的年龄+1岁。
    */
    public static void main(String[] args) {
        //1.定义一个长度为3的数组
        Student[] students = new Student[3];
        //2.创建3个学生对象
        Student s1 = new Student(1, "张三", 23);
        Student s2 = new Student(2, "李四", 24);
        Student s3 = new Student(3, "王五", 24);
        //3.将3个学生对象存入数组中
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;
        //4.创建一个新的学生对象
        Student s4 = new Student(5, "赵六", 26);
        //5.判断新创建学生对象学号的唯一性(设计一个方法判断新创建的学生对象的id,是否包含在老数组中)
        if (contains(students, s4.getId())) {
            //5.1已存在----提示id重复,添加失败
            System.out.println("学生id重复,添加失败");
        } else {
            //5.2不存在---添加新的学生对象
            //6.判断老数组是否已经存满数据(设计一个方法判断来老数组数据是否已经存满)
            int count = getCount(students);
            System.out.println(count);
            if (count == students.length) {
                //6.1数组已满,则对创建比原数组空间大1个的新数组,将新的学生对象存入其中;
                students = createArr(students);
                students[count] = s4;
                //打印数组
                printArr(students);
            } else {
                //6.2数组没有存满,直接将新学生对象存入其中
                students[count] = s4;
                //打印数组
                printArr(students);
            }
        }
        //要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
        int index = getIndex(students, 5);
        if (index >= 0) {
            //如果存在,则删除
            students[index] = null;
            System.out.println("删除成功");
            //要求4:删除完毕之后,遍历所有学生信息。
            printArr(students);
        } else {
            //如果不存在,则提示学生id不存在,删除失败
            System.out.println("学生id不存在,删除失败");
        }
        //要求5:查询数组id为"2"的学生,如果存在,则将他的年龄+1岁。
        int index1 = getIndex(students, 2);
        if (index1 >= 0) {
            //id为2的学生存在,则将他的年龄+1岁
            Student stu = students[index1];
            int newAge = stu.getAge() + 1;
            stu.setAge(newAge);
            System.out.println("年龄+1岁成功");
            printArr(students);
        } else {
            //id为2的学生不存在
            System.out.println("学生信息不存在,修改失败");
        }
    }

    //设计一个方法获取待删除学生在数组中的位置
    /*
    1.我要个干嘛? 答:通过id获取学生对象在数组中的数组下标
    2.我需要什么? 答:需要数组,学生id
    3.方法的调用处是否需要继续使用方法的结果? 答:需要,如果存在则返回学生对象的数组下标,如果不存在返回-1
     */
    public static int getIndex(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                if (arr[i].getId() == id) {
                    return i;
                }
            }
        }
        return -1;
    }

    //设计一个方法遍历数组元素
    public static void printArr(Student[] arr) {
        for (Student student : arr) {
            if (student != null) {
                System.out.println(student);
            }
        }
    }

    //设计一个方法,创建比原数组空间大1个的新数组
    /*
    1.我要个干嘛? 答:创建一个新数组,比老数组空间大1,并复制老数组元素到新数组中
    2.我需要什么? 答:需要老数组
    3.方法的调用处是否需要继续使用方法的结果? 答:需要,需要返回新创建的数组
     */
    public static Student[] createArr(Student[] arr) {
        Student[] newStudents = new Student[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            newStudents[i] = arr[i];
        }
        return newStudents;
    }

    //设计一个方法判断新创建的学生对象的id,是否包含在老数组中
        /*
        1.我要个干嘛? 答:判断新创建的学生对象的id,是否包含在老数组中
        2.我需要什么? 答:需要老数组,需要新创建学生对象的id
        3.方法的调用处是否需要继续使用方法的结果? 答:需要判断的结果
         */
    public static boolean contains(Student[] arr, int id) {
        for (Student student : arr) {
            if (student != null) {
                if (student.getId() == id) {
                    return true;
                }
            }
        }
        return false;
    }

    //设计一个方法判断来老数组数据已经存了几个数据
    /*
    1.我要个干嘛? 答:判断老数组数据已经存了几个数据
    2.我需要什么? 答:需要来老数组
    3.方法的调用处是否需要继续使用方法的结果? 答:需要返回已存入数据的数量
     */
    public static int getCount(Student[] arr) {
        //创建一个统计变量
        int count = 0;
        //判断数组中元素的值是否为null,如果不是null则说明存在一个数据,count加1
        for (Student student : arr) {
            if (student != null) {
                count++;
            }
        }
        //循环结束后返回数组中已添加元素的个数
        return count;
    }
}
相关推荐
lightqjx4 分钟前
【数据结构】顺序表(sequential list)
c语言·开发语言·数据结构·算法
巨人张13 分钟前
信息素养Python编程题
开发语言·python
东阳马生架构15 分钟前
订单初版—5.售后退货链路中的技术问题说明文档
java
小小寂寞的城20 分钟前
JAVA策略模式demo【设计模式系列】
java·设计模式·策略模式
阿猿收手吧!37 分钟前
【计算机网络】HTTP1.0 HTTP1.1 HTTP2.0 QUIC HTTP3 究极总结
开发语言·计算机网络
JAVA学习通38 分钟前
图书管理系统(完结版)
java·开发语言
abigalexy1 小时前
深入Java锁机制
java
paishishaba1 小时前
处理Web请求路径参数
java·开发语言·后端
七七七七071 小时前
C++类对象多态底层原理及扩展问题
开发语言·c++