IT/JAVA

[JAVA] 객체배열 - 포켓몬 프로그램

_KH_ 2025. 1. 16. 09:15
package pokemon;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/*
플레이어(트레이너)가 있습니다.
트레이너는 1명당 최대 6마리의 포켓몬을 가질수있습니다.
트레이너는 이름을 가질수있습니다.
이름이 없는 트레이너는 '무명'으로 설정됩니다.
트레이너는 소유한 모든 포켓몬들의 상태를 출력할 수 있습니다.
소유한 포켓몬의 체력이 0이라면 [기절]을 출력해주세요.
트레이너는 자랑을 할 수 있습니다.
자랑하기를 실행하면 레벨이 가장 높은 포켓몬을 출력해주세요.
레벨이 가장 높은 포켓몬이 2마리 이상이라면 경험치가 높은 포켓몬이 출력됩니다.
경험치가 동일하면 먼저 저장된 포켓몬이 출력됩니다.
트레이너는 대결을 할 수 있습니다.
야생의 포켓몬을 만나면 내 포켓몬과 야생 포켓몬은 게임을 합니다.
야생 포켓몬을 만났을때, 야생 포켓몬과 게임할 포켓몬을 선택합니다.
게임에서 승리하면, 야생 포켓몬을 내 포켓몬으로 추가합니다.

포켓몬은 이름,체력,레벨,경험치가 있습니다.
포켓몬은 반드시 이름을 가져야합니다.
체력은 5, 레벨은 5, 경험치는 0으로 설정됩니다.
포켓몬은 게임을 할때마다 체력을 3 잃습니다.
포켓몬은 70% 확률로 게임을 성공합니다.
만약 게임에 실패한다면 즉시 체력을 3 잃습니다.
게임을 성공하면 50~300 사이의 랜덤 경험치를 획득합니다.
레벨업 할때마다 포켓몬 고유의 울음소리를 냅니다.

 */
class Player{
   private Pokemon[] datas;
   private String name;
   private int count;
   Player() {
      this("무명");
   }
   Player(String name) {
      this.datas=new Pokemon[6];
      this.datas[0]=new Pika();
      this.datas[1]=new Butterfree();
      this.datas[2]=new Psyduck();
      this.datas[0].setExp(5);
      this.datas[1].setExp(10);
      this.datas[2].setExp(20);
      this.name=name;
      this.count=3;
   }
   void printDatas() {
      for(Pokemon v:datas) {
         if(v==null) {
            System.out.println("비어있는 공간");
         }
         else {
            System.out.println(v);
         }
      }
   }
   void show() {

      int maxLevel=this.datas[0].getLevel();
      int maxExp=this.datas[0].getExp();
      int maxIndex=0;

      for(int i=1;i<count;i++) {

         if(this.datas[i].getLevel() > maxLevel) {
            maxIndex=i;
         }
         else if(this.datas[i].getLevel() == maxLevel) {
            if(this.datas[i].getExp() > maxExp) {
               maxIndex=i;
            }
         }
      }
      System.out.println(this.datas[maxIndex]);

   }
   void game(Pokemon pokemon) {
      //1,2,3 누구로 대결을 시킬지 플레이어가 지정
      Scanner sc=new Scanner(System.in);
      int num;
      while(true) {
         System.out.print("번호 입력");
         num=sc.nextInt();   
         int code=check(num);
         if(code==0) {
            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) {
         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 level;
   private int exp;

   Pokemon(String name){
      this.name=name;
      this.hp=5;
      this.level=5;
      this.exp=0;
   }
   void game() {
      if(this.hp<4) {
         System.out.println("체력이 낮아 게임을 할 수 없습니다");
      }
      this.hp-=3;
      int num=new Random().nextInt(10);
      if(num<=2) {
         System.out.println("졌네요..");
         this.hp-=3;
         return;

      }
      System.out.println("이겼습니다!");
      int expUp=new Random().nextInt(251)+50;
      this.exp+=expUp;
      while(true) {
         if(this.exp<100) {
            break;
         }
         this.exp-=100;
         this.level++;
         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 getLevel() {
      return level;
   }
   public void setLevel(int level) {
      this.level = level;
   }
   public int getExp() {
      return exp;
   }
   public void setExp(int exp) {
      this.exp = exp;
   }
   @Override
   public String toString() {
      if(this.hp<=0) {
         return "[기절]" + this.name;
      }
      return "Pokemon [name=" + name + ", hp=" + hp + ", level=" + level + ", exp=" + exp + "]";
   }


}
class Pika extends Pokemon{
   Pika(){
      super("피카츄");
   }
   @Override
   void hello() {
      System.out.println("피카피카");
   }
}
class Butterfree extends Pokemon{
   Butterfree(){
      super("버터플");
   }
   @Override
   void hello() {
      System.out.println("버터버터");
   }
}
class Psyduck extends Pokemon{
   Psyduck(){
      super("고라파덕");
   }
   @Override
   void hello() {
      System.out.println("파덕파덕");
   }
}

public class Test01 {

   public static void main(String[] args) {
      Player p1=new Player();

      p1.printDatas();
      //         p1.game(new Pika());
      p1.show();
   }

}

show() 메서드를 작성할 때 처음엔 굉장히 길게 작성했는데 다 작성하고 나니 너무 짧아져서 놀랐다..

코드를 최대한 간략화해서 쓸 수 있도록 노력해야겠다.

'IT > JAVA' 카테고리의 다른 글

Java Section 10 : 상속  (0) 2025.01.17
Java Section 09 : 생성자  (0) 2025.01.16
Java Section 08 : 메서드  (0) 2025.01.15
[DAY 11] 캡슐화, 상속, 오버라이딩, Object 클래스  (0) 2025.01.14
Java Section 07 : 클래스  (0) 2025.01.14