面向对象综合案例:

1.键盘录入两套体系:

(1)第一套:

  • nextInt()接收整数

  • nextDouble()接收小数

  • next()接收字符串

  • 注意:遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了

(2)第二套:

  • nextLine()接收字符串

  • 注意:只有遇到回车才停止

(3)禁止混用以上的两套体系:

弊端:先用nextInt,再用nextLine会导致下面的nextLine接受不到数据;

2.文字版格斗游戏:

格斗游戏,每个游戏角色姓名、血量、都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。

例:

面向对象综合案例:_第1张图片

(1)简单版: 

package com.PlayGame;
​
import java.util.Random;
​
public class Role {
    private String name;
    private int blood;
    public void attack(Role role ){
//        计算造成的伤害1~20
        Random random = new Random();
        int hurt=random.nextInt(20)+1;
//        剩余血量
        int count=role.getBlood()-hurt;
//        对剩余血量做一个验证,为负数则修改为0;
        count=count<0?0:count;
//        修改挨揍人的血量
        role.setBlood(count);
        System.out.println(this.getName()+"打了"+role.getName()+"一下,造成"+hurt+"点的伤害,"+role.getName()+"还剩下"+count+"点的血量");
    }
​
    public Role() {
    }
​
    public Role(String name, int blood) {
        this.name = name;
        this.blood = blood;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return blood
     */
    public int getBlood() {
        return blood;
    }
​
    /**
     * 设置
     * @param blood
     */
    public void setBlood(int blood) {
        this.blood = blood;
    }
​
    public String toString() {
        return "XW{name = " + name + ", blood = " + blood + "}";
    }
}
 public static void main(String[] args) {
​
        Role r1 = new Role("乔峰",100);
        Role r2 = new Role("小五",100);
//        r1.攻击(xw)方法的调用者攻击参数
        while (true){
            r1.attack(r2);
            if(r2.getBlood()==0){
                System.out.println(r1.getName()+"ko了"+r2.getName());
                break;
            }
            r2.attack(r1);
            if(r1.getBlood()==0){
                System.out.println(r2.getName()+"ko了"+r1.getName());
                break;
            }
        }
    }

(2)优化版:

package com.Test;
​
import java.util.Random;
​
public class Role {
    private String name;
    private int blood;
    private String gender;
    private String face;//长相随机
    String[] boyfaces = {"风流俊雅", "气宇轩昂", "相貌英俊", "五官端正"};
    String[] girlfaces = {"沉鱼落雁", "亭亭玉立", "相貌平平", "惨不忍睹"};
//    attack受伤描述
    String[] attacks_desc={
            "%s使出一招【背心钉】,转到对方身后,一掌向%s背心的灵台穴拍去",
            "%s使出一招【游空探爪】,转到对方身后,一掌向%s抓去",
            "%s使出一招【掌心雷】,转到对方身后,一掌向%s拍去",
    };
    //injured受伤描述:
    String[] injureds_desc={
            "%s退了半步,毫发无损",
            "%s造成一处淤伤",
            "%s一击命中,疼的弯下腰",
    };
​
    public Role() {
    }
​
    public Role(String name, int blood, String gender) {
        this.name = name;
        this.blood = blood;
        this.gender = gender;
        setFace(gender);
    }
    public void showRoleInfo(){
        System.out.println("姓名为:"+getName());
        System.out.println("血量为:"+getBlood());
        System.out.println("性别为:"+getGender());
        System.out.println("长相为:"+getFace());
    }
​
​
    public void attack(Role role) {
        Random random = new Random();
        int index = random.nextInt(attacks_desc.length);
        String kungfu=attacks_desc[index];
//        输出一个攻击的效果
        System.out.printf(kungfu,this.getName(),role.getName());
//        计算造成的伤害1~20
​
        int hurt = random.nextInt(20) + 1;
//        剩余血量
        int count = role.getBlood() - hurt;
//        对剩余血量做一个验证,为负数则修改为0;
        count = count < 0 ? 0 : count;
//        修改挨揍人的血量
        role.setBlood(count);
//        受伤描述
//        血量>90 0索引
//        40~90 1索引
//        0~30 2索引
        if(count>90){
            System.out.printf(injureds_desc[0],role.getName());
        } else if (count>=40&&count<=90) {
            System.out.printf(injureds_desc[1],role.getName());
        }else {
            System.out.printf(injureds_desc[2],role.getName());
        }
        System.out.println( role.getName() + ",还剩下" + count + "点的血量");
    }
​
    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     *
     * @return blood
     */
    public int getBlood() {
        return blood;
    }
​
    /**
     * 设置
     *
     * @param blood
     */
    public void setBlood(int blood) {
        this.blood = blood;
    }
​
    /**
     * 获取
     *
     * @return gender
     */
    public String getGender() {
        return gender;
    }
​
    /**
     * 设置
     *
     * @param gender
     */
    public void setGender(String gender) {
        this.gender = gender;
    }
​
    /**
     * 获取
     *
     * @return face
     */
    public String getFace() {
        return face;
    }
​
    /**
     * 设置
     *
     * @param gender
     */
    public void setFace(String 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 toString() {
        return "Role{name = " + name + ", blood = " + blood + ", gender = " + gender + ", face = " + face + "}";
    }
}
public static void main(String[] args) {
        Role r1 = new Role("乔峰", 100, "男");
        Role r2 = new Role("小五",100,"男");
        r1.showRoleInfo();
        r2.showRoleInfo();
//        r1.攻击(xw)方法的调用者攻击参数
       while (true){
            r1.attack(r2);
            if(r2.getBlood()==0){
                System.out.println(r1.getName()+"ko了"+r2.getName());
                break;
            }
            r2.attack(r1);
            if(r1.getBlood()==0){
                System.out.println(r2.getName()+"ko了"+r1.getName());
                break;
            }
        }
    }

(3)printf:

 public static void main(String[] args) {
        //两部分参数:
        //第一部分参数:要输出的内容%s(占位)
//        第二部分参数:填充的数据
        System.out.printf("你好啊%s","张三");
        System.out.println();
        System.out.printf("%s你好啊%s","张三","李四");
    }

3.对象数组:

(1)例1:定义一个数组存储3个商品的对象。

商品的属性:商品的id,名字,价格,库存。

创建三个商品对象,并把商品对象存入2到数组中;

public static void main(String[] args) {
//        创建一个数组
        Goods[] arr = new Goods[3];
//        创建三个商品对象
        Goods g1 = new Goods("1","华为p40",5999.0,100);
        Goods g2 = new Goods("2","保温杯",227.0,50);
        Goods g3 = new Goods("3","枸杞",12.7,70);
//        把商品添加到数组中
        arr[0]=g1;
        arr[1]=g2;
        arr[2]=g3;
//        遍历
        for (int i = 0;i < arr.length; i++) {
            Goods goods=arr[i];
            System.out.println(goods.getId()+","+goods.getName()+","+goods.getPrice()+","+goods.getCount());
        }
    }

(2)例2:定义数组存储3部汽车对象;

汽车的属性:品牌、价格、颜色。

创建三个汽车对象,数据通过键盘录入而来,并把数据存入到数据当中。

public static void main(String[] args) {
        Car[] cars = new Car[3];
        Scanner sc = new Scanner(System.in);
//        注意:创建对象放在循环里面。否则在外面只会认为是仅一个对象,输入的结果会被最后输入的值覆盖,从而输出三次
        for (int i = 0; i < cars.length; i++) {
//            创建汽车对象
            Car c = new Car();
            System.out.println("请输入品牌,价格,颜色");
            String name=sc.next();
            c.setName(name);
            double price=sc.nextDouble();
            c.setPrice(price);
            String color=sc.next();
            c.setColor(color);
            cars[i]=c;
        }
        for (int i = 0; i < cars.length; i++) {
            Car car = cars[i];
            System.out.println(car.getName()+" ,"+car.getPrice()+" ,"+car.getColor());
        }
    }

(3)例3:定义数组存储3部手机对象。

手机的属性:品牌,价格,颜色。

要求,计算出三部手机平均价格。

public static void main(String[] args) {
    Phone[] phones = new Phone[3];
    Phone c1 = new Phone("小米",599.0,"红色");
    Phone c2 = new Phone("华为",9999.0,"黑色");
    Phone c3 = new Phone("苹果",5999.0,"白色");
​
    phones[0]=c1;
    phones[1]=c2;
    phones[2]=c3;
​
    double price=0;
    for (int i = 0; i < phones.length; i++) {
        Phone phone = phones[i];
        price=price+phone.getPrice();
    }
    System.out.println(price/ phones.length);
}

(4)例4:定义数组存储4个女朋友的对象,

女朋友属性:姓名、年龄、性别、爱好

要求1:计算出四女朋友的平均年龄

要求2:统计年龄比平均值低的女朋友有几个?并把她们的所有信息打印出来。

public static void main(String[] args) {
    /*
    要求1:计算出四女朋友的平均年龄
    要求2:统计年龄比平均值低的女朋友有几个?并把她们的所有信息打印出来。
    */
    girlFriends[] gf = new girlFriends[4];
    girlFriends gf1 = new girlFriends("小时",23,"女","打麻将");
    girlFriends gf2 = new girlFriends("小虎",20,"女","旅游");
    girlFriends gf3 = new girlFriends("小妲",19,"女","玩游戏");
    girlFriends gf4 = new girlFriends("小商",28,"女","旅游");
    gf[0]=gf1;
    gf[1]=gf2;
    gf[2]=gf3;
    gf[3]=gf4;
    int age=0;
    for (int i = 0; i < gf.length; i++) {
        girlFriends girlFriends = gf[i];
        age+=girlFriends.getAge();
    }
    int avg=age/gf.length;
    System.out.println(avg);
    int count=0;
    for (int i = 0; i < gf.length; i++) {
        girlFriends girlFriends = gf[i];
        if(girlFriends.getAge()

(5)例5:定义一个长度为3的数组,数组存储1~3名学生对象作为初始化数据,学生对象的学号,姓名各个不相同。

学生的属性:学号、姓名、年龄;

要求1:再添加一个学生对象,并在添加的时候进行学号的唯一性;

要求2:添加完成后,遍历所有学生信息;

public static void main(String[] args) {
        /*
        要求1:再添加一个学生对象,并在添加的时候进行学号的唯一性;
        要求2:添加完成后,遍历所有学生信息;
        */
        Student[] students = new Student[3];
        Student s1 = new Student(110, "dhh", 18);
        Student s2 = new Student(121, "xdd", 28);
        Student s3 = new Student(212, "css", 24);
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;
//        要求1:再添加一个学生对象,并在添加的时候进行学号的唯一性;
//        新建一个学生对象
        Student s4 = new Student(210, "dff", 21);
//        判断学号是否唯一,唯一则添加,不唯一不用添加
        boolean flag = contains(students, s4.getSno());
        if(flag){
//            已存在,不用添加
            System.out.println("当前sno重复,请修改sno后再进行添加");
        }else {
//            不存在--就可以添加进数组
//        添加入数组:数组没满直接添加
//        数组满了,在原来的数组长度+1
            int count = count(students);
            if(count==students.length){
//                已存满
                Student[] newStu = creat(students);
                newStu[count]=s4;
                printStu(newStu);
            }else {
//                没有存满
//                [s1,s2,null]方法count获取到2,表示数组当中已经有2个元素
//                还有一层意思:如果下一次要添加数据,就是添加到2索引的位置
                students[count]=s4;
                printStu(students);
​
            }
        }
    }
    public static void printStu(Student[] students){
        for (int i = 0; i < students.length; i++) {
            Student stu = students[i];
            if(students[i]!=null){
                System.out.println(stu.getSno()+","+stu.getName()+","+stu.getAge()+",");
            }
        }
    }
​
//    创建一个新数组,长度=老数组的长度+1
//    然后把老数组的元素,拷贝到新数组当中
    public static Student[] creat(Student[] students){
        Student[] stu1 = new Student[students.length+1];
//        循环得到老数组中的每一个元素
        for (int i = 0; i < students.length; i++) {
            stu1[i]=students[i];
        }
        return stu1;
    }
​
    public static int count(Student[] students){
        int count=0;
        for (int i = 0; i < students.length; i++) {
            if(students[i]!=null){
                count++;
            }
        }
        return count;
    }
​
    //    1:我要干嘛? 唯一性判断
//    2:我干这件事情需要什么才能完成? 数组,id
//    3:调用处是否需要继续使用方法的结果? 是
    public static boolean contains(Student[] students, int sno) {
        for (int i = 0; i < students.length; i++) {
            Student stu = students[i];
            if(stu!=null){
                if (stu.getSno() == sno) {
                    return true;
                }
            }
        }
        return false;
    }

要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。

要求4:删除完毕后,遍历所有学生信息;

public static void main(String[] args) {
       /*
        要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
        要求4:删除完毕后,遍历所有学生信息;
        */
        Student[] stu = new Student[3];
        Student s1 = new Student(1, "zs", 18);
        Student s2 = new Student(2, "ls", 28);
        Student s3 = new Student(3, "ww", 24);
        stu[0]=s1;
        stu[1]=s2;
        stu[2]=s3;
//         要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您要删除的学号:");
        int id= sc.nextInt();
        int index = index(stu,id);
        if(index>=0){
            stu[index]=null;
            printStu(stu);
        }else {
            System.out.println("该学号不存在!");
        }
    }
    public static void printStu( Student[] stu) {
        for (int i = 0; i < stu.length; i++) {
            Student s = stu[i];
            if(s!=null){
                System.out.println(s.getSno()+","+s.getName()+","+s.getAge());
            }
        }
    }
    public static int index( Student[] stu,int id) {
        for (int i = 0; i < stu.length; i++) {
            Student s = stu[i];
            if (s!= null) {
                int sno = s.getSno();
                if (sno==id) {
                    return i;
                }
            }
        }
        return -1;
    }

要求5:查询数组id为“212”学生,如果存在,则将他的年龄+1;

public static void main(String[] args) {
   /*
    要求5:查询数组id为“212”学生,如果存在,则将他的年龄+1;
    */
    Student[] stu = new Student[3];
    Student s1 = new Student(1, "zs", 18);
    Student s2 = new Student(2, "ls", 28);
    Student s3 = new Student(3, "ww", 24);
    stu[0]=s1;
    stu[1]=s2;
    stu[2]=s3;
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入您的学号:");
    int id= sc.nextInt();
    int index = index(stu,id);
    if(index>=0){
        stu[index].setAge(stu[index].getAge()+1);
        printStu(stu);
    }else {
        System.out.println("该学号不存在!");
    }
}
public static void printStu( Student[] stu) {
    for (int i = 0; i < stu.length; i++) {
        Student s = stu[i];
        if(s!=null){
            System.out.println(s.getSno()+","+s.getName()+","+s.getAge());
        }
    }
}
public static int index( Student[] stu,int id) {
    for (int i = 0; i < stu.length; i++) {
        Student s = stu[i];
        if (s!= null) {
            int sno = s.getSno();
            if (sno==id) {
                return i;
            }
        }
    }
    return -1;
}

你可能感兴趣的:(Java,java)