헬린코린이

Second Project 본문

Project/Team Project

Second Project

HCD 2022. 12. 3. 14:00
package test;

import java.util.*;

public class TEST {
    public static void main(String[] args) {
        ArrayList<Bird> bdatas = new ArrayList<>(); // 새 데이터들

        Scanner sc = new Scanner(System.in);

        System.out.println("================================");
        System.out.println("========  조류보호센터  ========");
        System.out.println("================================");
        while (true) {
            System.out.println();
            System.out.println("--------------------------------");
            System.out.println();
            System.out.println("1. 새 등록하기");
            System.out.println("2. 보호하고 있는 새 목록 보기");
            System.out.println("3. 음식 급여하기");
            System.out.println("4. 재활 운동 시키기");
            System.out.println("5. 방사시키기");
            System.out.println("6. 프로그램 종료");
            System.out.println();
            System.out.println("--------------------------------");

            System.out.print("입력 > ");
            int act = sc.nextInt();
            sc.nextLine();

            System.out.println();

            if (act == 1) { // 새 등록
                System.out.println("----------- 조류 등록 -----------"); //
                addBird(bdatas); // bdatas 배열에 새 추가하기

            } else if (act == 2) { // 새 리스트 출력
                if (bdatas.isEmpty()) { // bdatas에 새가 없으면
                    System.out.println("현재 보호하고 있는 새 없음");
                    System.out.println();
                    continue;
                }
                printBirds(bdatas);

            } else if (act == 3) { // 새 선택 -> 밥 먹기
                if (bdatas.isEmpty()) { // bdatas에 새가 없으면
                    System.out.println("현재 보호하고 있는 새 없음");
                    System.out.println();
                    continue;
                }
                feedBird(bdatas);

            } else if (act == 4) { // 새 선택 -> 운동
                if (bdatas.isEmpty()) { // bdatas에 새가 없으면
                    System.out.println("현재 보호하고 있는 새 없음");
                    System.out.println();
                    continue;
                }
                excercise(bdatas);

            } else if (act == 5) { // 새 방사(삭제)
                if (bdatas.isEmpty()) { // bdatas에 새가 없으면
                    System.out.println("현재 보호하고 있는 새 없음");
                    System.out.println();
                    continue;
                }
                delete(bdatas);

            } else if (act == 6) { // 프로그램 종료
                System.out.println("프로그램이 종료됩니다.");
                return;
            } else { // 입력 유효성 검사
                System.out.println(" 잘못 입력하셨습니다.");
                System.out.println();
            }

        }

    }

    /*
     * *********************
     * main 에서 사용할 함수들
     * 
     * private static Bird validateInput(ArrayList<Bird> bdatas) : 유효성 검사. 존재하는 값 입력시 해당 새 반환, 없는 값이면 null 반환
     * private static void addBird(ArrayList<Bird> bdatas) : bdatas에 새 추가
     * private static void printBdatas(ArrayList<Bird> bdatas) : bdatas에 있는 새들 출력
     * private static void feedBird(ArrayList<Bird> bdatas) : bdatas에 있는 새들 중 하나를
     * 선택해 밥 먹이기(체력회복)
     * private static void delete(ArrayList<Bird> bdatas) : bdatas에 있는 새들 중 하나 선택해
     * 방사. 체력이 10 이어야 함
     */


    // 새의 고유번호를 입력받아 유효성 검사 후, 존재하는 값을 입력했으면 해당 새를 반환하고, 없는 값을 입력했으면 null 을 반환하는 함수
    private static Bird validateInput(ArrayList<Bird> bdatas) {
        Scanner sc = new Scanner(System.in);

        printBirds(bdatas); // 새 출력

        System.out.print("개체번호 입력 > ");
        int uniqueNum = sc.nextInt(); // 입력받은 고유번호
        sc.nextLine();

        System.out.println();

        boolean isMatched = false; // 존재하는 새라면 true로 바뀜
        Bird preBird = null; // 선택된 새
        for (int i = 0; i < bdatas.size(); i++) {
            if (bdatas.get(i).getUniqueNum() == uniqueNum) { // 입력받은 고유번호와 일치하면 그 객체 저장
                preBird = bdatas.get(i);
                isMatched = true;
                break;
            }
        }

        if (!isMatched) { // 없는 고유 번호라면
            System.out.println();
            System.out.println("고유번호 없음: [" + uniqueNum + "] 에 해당하는 개체가 없습니다.");
            return null; // 첫 화면으로.
        }

        return preBird;
    }

    // bdatas 에 새 추가
    private static void addBird(ArrayList<Bird> bdatas) {
        Scanner sc = new Scanner(System.in); // 이렇게 해야되나?
        System.out.println("어떤 새를 추가하시겠어요?");
        System.out.println("1. 독수리");
        System.out.println("2. 오리");
        System.out.print("입력 > ");
        int act = sc.nextInt();
        sc.nextLine();

        System.out.println();

        if (act == 1) { // 독수리 입소
            bdatas.add(new Eagle());
        } else if (act == 2) { // 오리 입소
            bdatas.add(new Duck());
        } else { // 유효성 검사
            System.out.println("잘못 입력하셨습니다.");
            return;
        }
        Bird preBird = bdatas.get(bdatas.size() - 1); // 방금 추가한 새.

        System.out.println("새로운 새 " + preBird.getKind() + "가 들어왔다...");
        System.out.println();
        System.out.println("********************************");
        System.out.println(bdatas.get(bdatas.size() - 1));
        System.out.println("********************************");
       
    }

    // bdatas에 있는 새들 출력하는 함수
    private static void printBirds(ArrayList<Bird> bdatas) {
        for (Bird b : bdatas) {
            System.out.println(b); // Bird 클래스에서 toString()을 오버라이딩 함
            System.out.println("--  --  --  --  --  --  --  --  ");
        }
    }

    // 밥 먹이기
    private static void feedBird(ArrayList<Bird> bdatas) {
        System.out.println("어떤 새를 먹여야할까?");
        System.out.println();
       
        Bird preBird = validateInput(bdatas); // 유효성 검사 후 값 preBird
        if (preBird == null) { // 선택한 새가 존재하지 않으면
            return; // 첫 화면으로.
        }

        preBird.eat();
    }

    // 새 선택해 운동시키기
    private static void excercise(ArrayList<Bird> bdatas) {
        System.out.println("어떤 새를 운동시킬까? ");
        System.out.println();

        Bird preBird = validateInput(bdatas);
        if (preBird == null) {
            return;
        }

        preBird.action();
    }

    // 새 선택해 방사하기
    private static void delete(ArrayList<Bird> bdatas) {

        System.out.println("어떤 새를 자연으로 돌려보내줄까? ");
        System.out.println();

        Bird preBird = validateInput(bdatas);

        if (preBird == null) { // 선택한 새가 존재하지 않으면
            return; // 첫 화면으로.
        }

        if (preBird.getHp() < 10) { // 체력이 부족하면 방사 안 됨
            System.out.println("이 " + preBird.getKind() + "는 아직 체력이 " + preBird.getHp() + " 밖에 안된다.");
            System.out.println("더 운동시키고 더 먹여야겠다…");

            return;
        }

        preBird.sounds();
        System.out.println(" \n….\n");
        System.out.println(preBird.getKind() + "(" + preBird.getUniqueNum() + ") 을 보냈다…");
        bdatas.remove(preBird);

        System.out.println();
    }
}


abstract class Bird {
    private String kind; // 종. ex.독수리, 거위.. 등등
    private int hp; // 체력(1~10) : 나쁨(1~4), 보통(5~8), 좋음(9~10)  최초는 랜덤설정
    private String statement; // 상태.
    private int uniqueNum; // 각각 가지고 있는 개체 번호. 입소할 때 자동으로 부여됨
    protected static int SERIAL_NUM = 10000; // 개체번호가 10000부터 시작됨
    protected boolean canFly;


    // 재활운동. 비행 여부에 따라 회복 속도가 다름. hp가 1 혹은 2씩 상승. 나는 새: 낮은 비행, hp++/ 못 나는 새: 푸드덕, hp+=2
    abstract void action();
    // 울음소리 내기
    abstract void sounds();

    //밥 먹기. 어떤 새든 hp가 1 상승.
    void eat() {
        if(this.hp >= 10) {
            System.out.println(this.kind + "(이)가 충분히 건강해졌다.");
            return;
        }
        // 먹임
        this.hp++;
        this.setStatement();
        System.out.println(this.kind + "(이)가 밥을 먹었다. 회복되는 것 같다. (1 회복)");
        
    }

    // 체력을 랜덤으로 세팅함. hp는 1~4 중 랜덤
    void setRandomHP() {
        this.hp = new Random().nextInt(4) + 1;
    }

    // 체력에 따라 나쁨(1~4), 보통(5~8), 좋음(9~10) 값 가짐
    void setStatement() {
        this.statement = "나쁨";
        if(this.hp > 8) {
            this.statement = "좋음";
        }
        else if(this.hp > 4) {
            this.statement = "보통";
        }
    }

    public String getKind() {
        return kind;
    }
    public void setKind(String kind) {
        this.kind = kind;
    }
    public int getHp() {
        return hp;
    }
    public void setHp(int hp) {
        this.hp = hp;
    }
    public String getStatement() {
        return statement;
    }
    public void setStatement(String statement) {
        this.statement = statement;
    }
    public int getUniqueNum() {
        return uniqueNum;
    }
    public void setUniqueNum(int uniqueNum) {
        this.uniqueNum = uniqueNum;
    }

    Bird(String kind) {
        this.kind = kind;
        this.setRandomHP();
        this.setStatement();
        this.uniqueNum = SERIAL_NUM++; // 개체 번호 자동 부여
    }

    @Override
    public String toString() {
        return "[" + this.uniqueNum + "] " + this.kind + ", " + "상태: " + this.statement + "(" + this.hp + ")";
    }

}

// 날지 못하는 새
abstract class FlightlessBird extends Bird {
    @Override
    void action() { // 못 나는 새: 푸드덕, hp+=2
        this.sounds();

        this.setHp(getHp() + 2);
        if(this.getHp() >= 10) {
            this.setHp(10);
            System.out.println(this.getKind() + "(이)가 충분히 건강해졌다.");
            return;
        }
        this.setStatement();
        System.out.println(this.getKind() + "(이)가 푸드덕거렸다. 체력이 더 회복된 것 같다. (2 회복)");

    }
    FlightlessBird(String kind) {
        super(kind);
        super.canFly = false;
    }

}

// 나는 새
abstract class FlyingBird extends Bird {

    @Override
    void action() { // 나는 새: 낮은 비행, hp++
        this.sounds();

        this.setHp(getHp() + 1);
        if(this.getHp() >= 10) {
            this.setHp(10);
            System.out.println(this.getKind() + "(이)가 충분히 건강해졌다.");
            return;
        }
        this.setStatement();
        System.out.println(this.getKind() + "(이)가 낮은 비행을 했다. 체력이 조금 회복된 것 같다. (1 회복)");
    }
    
    FlyingBird(String kind) {
        super(kind);
        super.canFly = true;
    }
}
package test;

class Eagle extends FlyingBird {

    Eagle() {
        super("독수리");
    }

    @Override
    void sounds() {
        System.out.println("scream~~~~~~\n");
        System.out.println("… 영어를 들은 것 같다.\n");
    }

}

class Duck extends FlightlessBird {

    Duck() {
        super("오리");
    }

    @Override
    void sounds() {
        System.out.println(" 꽉  꽉 ");
        System.out.println("    꽉    꽉");
    }
    
}

 

Comments