헬린코린이
Second Project 본문
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