샤브의 블로그 RSS 태그 관리 글쓰기 방명록
Device & Language/Java (21)
2010-08-21 15:11:08

자~ 제목은 거창하지만 사실 내용은 별게 없습니다.
현재까지 배운 쏘스를 고쳐서 만드는 작업으로 현재 듣는 강의의 소스입니다~ ^^;;;
하나하나 해 가면서 첨부해 나갈 수도 있을 것이라고 생각합니다.

일단 과제는 이렇습니다.

1. 모든 병사는 건강도를 갖는다.
2. 척후병은 적군의 동태를 감시하다가 적군이 움직이면 지휘관에게 보고를 한다. 매번 보고때마다 건강도는 2씩 감소한다.
3. 지휘관은 척후병의 주어진 정보를 바탕으로 소총수에게 공격과 방어를 명령하낟. 이때, 적군의 수가 5명 이하이면 공격을 초과이면 방어를 하도록 한다.
4. 소총수는 소총으로 공격과 방어를 한다. 한번의 공격에 총알 5개를 사용하고, 한번의 방어에 총알1개를 사용한다. 건강도는 한번 공격때 5씩 감소하고, 한번 방어할 때 10씩 감소한다.
5. 소총수는 총탄이 떨어지면 지휘관에게 보고를 한다.
6. 지휘관은 소총수에게 총탄이 남아 있는 한 총탄을 지급한다. 한번 지급되는 총탄은 50발이다. 하지만 총탄이 모자라면 적게 줄 수도 있다.
7. 지휘관은 소총수의 건강도를 체크하다가 건강도가 70이하가 되면, 취사병에게 식사를 준비시킨다. 취사병이 식사를 먹일 때마다 지휘관과 척후병은 1씩, 나머지 병사들의 건강도는 10씩 증가한다.

위의 문제를 현재까지 배운 내용을 가지고서 분석/작성하는 것입니다.

그래서 제일 먼저 공통 사항을 뽑아 냈습니다.
위의 사람들은 사람이면서 군인입니다.
그래서 나온 녀석이 Soldier 클래스~

public abstract class Soldier {
   final static int MAXHEALTH = 100 ;
   final static int MINHEALTH = 0 ;
   final static int MAXBULLETIN = 280 ;
   final static int MINBULLETIN = 0 ;
 
   private int health =  80 ;
   private int bullet = 50 ;
 
   public int getHealth() {
       return health;
   }

   public void setHealth(int health) {
      this.health = health;
   }

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
 
   abstract void incHealth();
}


위에서 보시는 바와 같이 health와 bullet을 공통적으로 가지고 있으며 식사를 하게 되면 건강도가 올라가야 해서 3가지 공통 요소를 뽑아냈습니다.

그리고 다음은 척후병입니다.
척후병은 지휘관에게 보고를 해야하기에 지휘관이 누구인지를 정확하게 알아야 합니다.

import java.util.Random;

public class Scout extends Soldier {
   void reportNum(Commander commander) {
      int num = 0;
      Random r = new Random();
      num = r.nextInt(10) + 1;
      System.out.println("적 " + num + "명 출현!!!!!");
      decHealth(num);
      commander.report(num);
   }

   void decHealth(int num) {
      if (getHealth() < 2) {
         setHealth(0);
         System.out.println("척후병이 죽었습니다.");
         System.exit(0);
      } else {
         setHealth(getHealth() - 2);
         System.out.println("척후병의 HP:" + getHealth());
      }
   }

   void incHealth() {
      setHealth(getHealth() + 1);
      System.out.println("철후병의 HP:" + getHealth());
   }
}


보고를 할 때는 지휘관이 누구인지 알아야 하기에 지휘관의 클래스를 인자로 받는 함수를 선언하였습니다.
그리고 보고 할때마다 건강도가 감소해야한다는 조건이 있어서 decHealth와 report 함수를 호출하게 되어있습니다.

public class Commander extends Soldier {
   Rifleman rifle;
   Cooksoldier cook;
   Scout scout;
   Magazine magazine;

   public Commander(Rifleman rifle, Cooksoldier cook, Scout scout, Magazine magazine) {
      this.rifle = rifle;
      this.cook = cook;
      this.scout = scout;
      this.magazine = magazine;
   }

   void incHealth() {
      if (getHealth() != 100) {
         setHealth(getHealth() + 1);
      }
      System.out.println("지휘관의 HP:" + getHealth());
   }

   void giveBullet() {
      if (magazine.getBullet() > 50) {
         magazine.setBullet(magazine.getBullet() - 50);
         System.out.println("탄 50발을 소총수에게 보급하였습니다.");
         System.out.println("탄약고 잔탄:"+magazine.getBullet());
         rifle.incBullet(50);
      } else if(magazine.getBullet() > 0) {
         rifle.incBullet(magazine.getBullet());
         System.out.println("탄 " + magazine.getBullet() + "발을 소총수에게 보급하였습니다.");
         magazine.setBullet(0);
      } else{
         System.out.println("탄약고가 비었습니다.");
      }
   }

   void report(int num) {
      if (num > 5) {
         System.out.println("지휘관:방어하라!!!");
         rifle.command(this, 2);
      } else {
         System.out.println("지휘관:공격하라!!!");
         rifle.command(this, 1);
      }
      if (rifle.getHealth() <= 70)
         checkHealth();
      }

   void checkHealth() {
      System.out.println("취사병~!!! 밥준비해~~~");
      cook.cooking(this);
   }
}


지휘관은 척후병에게 보고 받은 사항에 대해서 판단을 하여 공격인지 방어인지에 대해서 소총수에게 명령을 하게 되고 소총수가 총탄이 떨어지는 경우에는 탄약고에 있는 총탄을 소총수에게 주는 작업을 하게 되어 있고 또한 소총수의 건강도를 점검하다가 70이하로 떨어진 경우에는 취사병에게 취사명령을 하여 모든 군인들의 건강도를 올리도록 합니다.

다음은 소총수 입니다.

public class Rifleman extends Soldier {
   void decHealth(Commander commander, int command) {
      int temp = getHealth();
      switch (command) {
      case 1:
         if (temp > 5) {
            setHealth(getHealth() - 5);
         } else {
            setHealth(0);
         }
         break;
      case 2:
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
         }
         break;
      }
      temp = getHealth();
      if (getBullet() == 0) {
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
            System.out.println("소총수가 죽었습니다.");
            System.exit(0);
         }
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void decBullet(Commander commander, int code) {
      switch (code) {
      case 1:
         if (getBullet() > 5) {
         setBullet(getBullet() - 5);
         System.out.println("소총수가 5발을 소모하였습니다.[" + getBullet() + "]");
      } else if (getBullet() > 0) {
         System.out.println("소총수가 " + getBullet() + "발을 소모하였습니다.[0]");
         setBullet(0);
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   case 2:
      if (getBullet() > 1) {
         setBullet(getBullet() - 1);
         System.out.println("소총수가 1발을 소모하였습니다.[" + getBullet() + "]");
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   }

   if (getBullet() < 1)
      commander.giveBullet();
   }

   void incBullet(int num) {
      setBullet(getBullet() + num);
      System.out.println("소총수가 " + num + "발을 보충받았습니다.");
   }

   void command(Commander commander, int code) {
      switch (code) {
      case 1:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      case 2:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      }
   }
}


소총수는 지휘관에게 명령을 받으면 공격이나 방어를 하면서 건강도가 변하게 되고 총탄도 소모하게 됩니다. 그리고 총탄을 소모하게 되면 지휘관에게 보고 하고 총탄을 보급받게 되어 있습니다.

다음은 밥만 짓는 취사병이네요~

public class Cooksoldier extends Soldier {
   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("취사병의 HP:" + getHealth());
   }

   void cooking(Commander commander){
      commander.incHealth();
      incHealth();
      commander.rifle.incHealth();
      commander.scout.incHealth();
   }
}


병사들 중에 가장 간단한 클래스네요. 밥져주고 건강도가 올라가는 함수로 구성되어 있습니다.
마지막으로 탄약고입니다.
클래스 상속은 없는 간단한 클래스 입니다.

public class Magazine {
   int bullet = 70;

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
}


여기 까지 모든 클래스가 끝났네요~
위의 클래스들을 돌려주는 클래스를 한번 보시죠~

public class ArmyDemo {
   public static void main(String[] args) {
      Cooksoldier cook = new Cooksoldier();
      Rifleman rifle = new Rifleman();
      Scout scout = new Scout();
      Magazine magazine = new Magazine();
      Commander commander = new Commander(rifle, cook, scout, magazine);

      while (true) {
         scout.reportNum(commander);
      }
   }
}


총탄을 280로 주면 100% 사람이 죽기에 총탄수와 건강도의 기본 값을 수정하여 테스트 해보았습니다.

적 3명 출현!!!!!
척후병의 HP:78
지휘관:공격하라!!!
소총수의 HP:75
소총수가 5발을 소모하였습니다.[45]
적 5명 출현!!!!!
척후병의 HP:76
지휘관:공격하라!!!
소총수의 HP:70
소총수가 5발을 소모하였습니다.[40]
취사병~!!! 밥준비해~~~
지휘관의 HP:81
취사병의 HP:90
소총수의 HP:80
철후병의 HP:77
.................................................
....중간 생략....
.................................................
적 10명 출현!!!!!
척후병의 HP:24
지휘관:방어하라!!!
소총수의 HP:5
보유한 탄이 없습니다.
탄약고가 비었습니다.
취사병~!!! 밥준비해~~~
지휘관의 HP:100
취사병의 HP:100
소총수의 HP:15
철후병의 HP:25
적 1명 출현!!!!!
척후병의 HP:23
지휘관:공격하라!!!
소총수가 죽었습니다.

누군가가 죽으면 끝나게 만들어서 이렇게 되는 군요~
총탄도 많고 건강도가 조금씩 떨어져서 이렇게 내용이 좀 적네요~^^

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java StringBuilder vs StringBuffer  (1) 2010.08.23
Java Message Service spec  (0) 2010.08.22