JAVA_

JAVA#19 _ 포켓몬 객체 배열 출력

Joyfullyever 2025. 1. 16. 09:06

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();

}

}