JAVA#19 _ 포켓몬 객체 배열 출력
package pokemon01;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
class Player { // 플레이어 클래스 >> 포켓몬을 저장할 배열, 플레이어 이름
private Pokemon[] datas; // Player 클래스 선언하면서 배열만 선언해두기
private String name;
Player() { // 이름을 입력하지 않은 경우 >> 무명으로 설정
this("무명");
}
Player(String name) { // 이름을 입력한 경우
this.name = name; // 입력한 이름이 내 이름
this.datas = new Pokemon[6]; // 배열의 크기 6으로 지정
this.datas[0] = new Pikachu(); // 배열의 0번째 자리는 피카츄 클래스 대입
this.datas[1] = new Butterfree(); // 배열의 1번째 자리는 버터플 클래스 대입
this.datas[2] = new Psyduck(); // 배열의 2번째 자리는 고라파덕 클래스 대입
// this.datas[2].setHp(0); // 고라파덕의 체력은 0이라고 가정선언
this.datas[0].setLv(5); // 피카츄의 레벨은 10으로 가정선언
this.datas[1].setLv(10); // 버터플의 레벨은 8로 가정
this.datas[2].setLv(10); // 고라파덕의 레벨은 5로 가정
this.datas[0].setExp(80); // 피카츄 경험치 99 가정
this.datas[1].setExp(90); // 버터플
this.datas[2].setExp(99); // 고라파덕
}
void printDatas() { // 배열 출력
for (Pokemon v : datas) {
if (v == null) { // 비어있는 경우 null로 표기되는 것이 아니라 아래 출력문으로 출력되도록
System.out.println("비어있는 공간");
} else { // 값이 있는 자리는 그대로 출력
System.out.println(v);
}
}
}
void highestLevel() {
Pokemon highestLvl = datas[0]; // 레벨이 가장 높은 포켓몬이 1마리라면 출력
for (int i = 0; i < datas.length - 1; i++) {
if (datas[i] == null) {
continue;
}
if (highestLvl.getLv() < datas[i].getLv()) {
highestLvl = datas[i];
}
}
System.out.println(highestLvl + "포켓몬을 자랑합니다.");
}
void highestExp() {
Pokemon highestExp = datas[0]; // 경험치가 가장 높은 포켓몬 1마리 출력
for (int i = 0; i < datas.length - 1; i++) {
if (datas[i] == null) {
continue;
}
if(highestExp.getLv()<datas[i].getLv() && highestExp.getExp() < datas[i].getExp()) {
highestExp = datas[i];
}
}
System.out.println(highestExp + " 포켓몬을 자랑합니다.");
}
void firstSavedPokemon() {
Pokemon firstSaved = datas[0];
for (int i = 0; i < datas.length-1; i++) {
if (datas[i] == null) {
continue;
}
if(firstSaved.getLv()<datas[i].getLv() && firstSaved.getExp() < datas[i].getExp()) {
firstSaved = datas[i];
}
}
System.out.println(firstSaved + " 포켓몬을 자랑합니다.");
}
// 레벨 높은 포켓몬을 datas[0]으로 일단 지정
// 만약 레벨이 같다면
// 경험치를 비교
// 경험치가 더 높은 포켓몬 출력
// void show(Pokemon[] datas) {
// Pokemon highest = datas[0];
// for (int i = 0; i < datas.length - 1; i++) {
// if(datas[i] == null || datas[i+1] == null) {
// continue;
// }
// if (highest.getLv() < datas[i + 1].getLv()) {
// int temp = datas[i].getLv();
// datas[i].setLv(datas[i + 1].getLv());
// datas[i + 1].setLv(temp);
// }
// }
// System.out.println(datas[i] + "포켓몬을 자랑합니다.");
// }
/*
* 트레이너는 소유한 모든 포켓몬들의 상태를 출력할 수 있습니다. 소유한 포켓몬의 체력이 0이라면 [기절]을 출력해주세요. 트레이너는 자랑을
* 할 수 있습니다. 자랑하기를 실행하면 레벨이 가장 높은 포켓몬을 출력해주세요. 레벨이 가장 높은 포켓몬이 2마리 이상이라면 경험치가 높은
* 포켓몬이 출력됩니다. 경험치가 동일하면 먼저 저장된 포켓몬이 출력됩니다.
*/
void game(Pokemon pokemon) { // 야생 포켓몬이 등장해서 대결을 시작
Scanner sc = new Scanner(System.in); // 번호 입력받기
int num;
while (true) {
System.out.print("번호입력 >> ");
num = sc.nextInt();
int code = check(num); // 에러코드
if (code == 0) { // 범위 내의 숫자를 잘 입력한 경우 while문 종료
break;
}
if (code == 1) {
System.out.println("범위외 입력입니다!");
} else if (code == 2) {
System.out.println("비어있는 공간입니다!");
} else if (code == 3) {
System.out.println("기절한 포켓몬입니다!");
}
}
this.datas[num - 1].game();
}
int check(int num) { // 유효성 검사, 길게 써도 상관없지만, 조건식이 너무 길어지는 느낌이 있기 때문에 조건을 나눠서 검사하고 각 조건에 맞춰 리턴값 입력
if (num < 1 || this.datas.length < num) { // 리턴값을 위의 코드로 다시 사용해야 하기 때문에 int로 설정하고 리턴값 정수로 받기
return 1;
} else if (this.datas[num - 1] == null) {
return 2;
} else if (this.datas[num - 1].getHp() <= 0) {
return 3;
}
return 0;
}
public Pokemon[] getDatas() {
return datas;
}
public void setDatas(Pokemon[] datas) {
this.datas = datas;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() { // 플레이어 이름과 배열에 저장된 포켓몬 배열 출력
return "Player [datas=" + Arrays.toString(datas) + ", name=" + name + "]";
}
}
class Pokemon {
private String name; // 멤버변수
private int hp;
private int lv;
private int exp;
Pokemon(String name) { // 포켓몬은 반드시 이름을 받아야하기 때문에, Player의 이름과 다르게 "무명" 부분이 없고 이름을 입력 받음
this.name = name;
this.hp = 5; // 체력, 레벨, 경험치 값은 주어졌기 때문에 입력 받는게 아니고 대입
this.lv = 5;
this.exp = 0;
}
// 반환값 만들고 싶으면 만들어도됨
void game() {
this.hp -= 3;
int rand = new Random().nextInt(10) + 1; // 1~10
if (rand <= 3) {
this.hp -= 3;
System.out.println(this.name + "은(는) 게임에서 패배했습니다...");
return;
}
System.out.println(this.name + "은(는) 게임에서 승리했습니다!");
int exp = new Random().nextInt(251) + 50; // 50~300
this.exp += exp;
while (true) {
if (this.exp < 100) {
break;
}
this.exp -= 100;
this.lv++;
System.out.println(this.name + ", 레벨업!");
this.hello();
}
}
void hello() { // 오버라이딩 해서 출력할 부분
System.out.println("고유의 울음소리");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getLv() {
return lv;
}
public void setLv(int lv) {
this.lv = lv;
}
public int getExp() {
return exp;
}
public void setExp(int exp) {
this.exp = exp;
}
@Override
public String toString() { // 포켓몬의 체력이 0이되어 기절을 출력해야 하는 경우, 다른 부분에서 건드리는게 아니라 Pokemon의 toString에서 [기절]을
// 출력해야함
if (this.hp <= 0) { // 만약 Pokemon의 체력이 0이하라면 >> 아래 내용 대신 [기절] 포켓몬 이름 으로 출력 시키기
return "[기절] " + this.name;
}
return "Pokemon [name=" + name + ", hp=" + hp + ", lv=" + lv + ", exp=" + exp + "]";
}
}
class Pikachu extends Pokemon {
Pikachu() {
super("피카츄");
}
@Override
void hello() { // 레벨업 시 나오는 소리 오버라이딩
System.out.println("피카피카");
}
}
class Butterfree extends Pokemon {
Butterfree() {
super("버터플");
}
@Override
void hello() {
System.out.println("rrrrr");
}
}
class Psyduck extends Pokemon {
Psyduck() {
super("고라파덕");
}
@Override
void hello() {
System.out.println("파덕파덕");
}
}
public class TeacherSecond {
public static void main(String[] args) {
Player p = new Player();
// p.printDatas();
// p.game(new Pikachu());
p.highestLevel();
p.highestExp();
p.firstSavedPokemon();
}
}