VO
- 포켓몬 클래스(부모)
멤버변수 : int hp, exp = 0, lv = 1; String name(캐릭터 이름);
- 자식 클래스 (부모 상속)
피카츄
꼬부기
이상해씨
----- 각 클래스 생성시 생성창 browse 에서 상속받을 클래스 추가
메서드: 밥먹기(), 잠자기(), 운동하기(), 놀기(), 상태확인(), 레벨업()
------ 캐릭터마다 hp, exp 할당량 다르게.
Service
메뉴
1.밥먹기 2.잠자기 3.운동하기 4.놀기 5.종료 6. 상태확인
메인
캐릭터 선택 >> 1.피카츄 2.꼬부기 3.이상해씨
캐릭터 생성 -> 메뉴 선택
▼ 강사님 모범답안
VO (객체 설정창)
▼ 포켓몬 (부모클래스)
package picachu;
//피카츄 꼬부기 이상해씨한테 상속해주려고. (공통점 묶음)
public class Pocketmon {
protected String name;
protected int hp;
protected int exp;
protected int lv;
public void eat() {
System.out.println(name + "밥먹는다");
}
public void sleep() {
System.out.println(name + "잠잔다");
}
public boolean play() { //exp가 닳아서 죽을 수도 있으니까(false)
System.out.println(name + "논다");
return true;
}
public boolean exc() { //exp가 닳아서 죽을 수도 있으니까(false)
System.out.println(name + "운동한다");
return true;
}
public void levelUp() {
System.out.println(name + "레벨체크");
}
public void printStatus() {
System.out.println(name + "상태확인");
System.out.println("hp: " + hp);
System.out.println("exp: " + exp);
System.out.println("lv: " + lv);
}
}
▼ 피카츄
package picachu;
public class Picachu extends Pocketmon {
public Picachu() {
name = "피카츄";
hp = 40;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 3;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 5;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 5;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 4;
levelUp(); // 레벨체크
}
return flag;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 8;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 9;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >=30) {
lv++;
exp -= 30;
System.out.println(name + "레업 업! lv: " + lv);
}
}
public void 전기공격() {
System.out.println("백만볼트!! 쮸우우우~~~~~");
}
}
▼ 꼬부기
package picachu;
public class 꼬부기 extends Pocketmon {
public 꼬부기() {
name = "꼬부기";
hp = 50;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 5;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 4;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 7;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 10;
levelUp(); // 레벨체크
}
return flag;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 5;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 6;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >=35) {
lv++;
exp -= 35;
System.out.println(name + "레업 업! lv: " + lv);
}
}
public void 물대포() {
System.out.println("물대포!! 콸콸콸~~~~~");
}
}
▼ 이상해씨
package picachu;
public class 이상해씨 extends Pocketmon {
public 이상해씨() {
name = "이상해씨";
hp = 50;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 4;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 3;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 4;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 5;
levelUp(); // 레벨체크
}
return flag;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 9;
boolean flag = hp > 0;
// 살았을 때만 경험치 증가
if (flag) {
exp += 10;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >= 40) {
lv++;
exp -= 40;
System.out.println(name + "레업 업! lv: " + lv);
}
}
public void 넝쿨공격() {
System.out.println("넝쿨!! 촤악! 촤악!");
}
}
Service - Menu
package picachu;
import java.util.Scanner;
public class Menu {
private Pocketmon p; // 업캐스팅으로 피카츄, 꼬부기, 이상해씨 중 하나의 객체를 저장
public Menu(Pocketmon p) {
this.p = p;
}
public void run(Scanner sc) {
boolean flag = true;
while (flag) {
System.out.println("1.밥 2.잠 3.운동 4.놀기 5.상태확인 6.종료 7.특기공격");
int m = sc.nextInt();
switch (m) {
case 1:
p.eat();
break;
case 2:
p.sleep();
break;
case 3:
flag = p.exc();
if (!flag) {
System.out.println(p.name + " 사망");
}
break;
case 4:
flag = p.play();
if (!flag) {
System.out.println(p.name + " 사망");
}
break;
case 5:
p.printStatus();
break;
case 6:
flag = false;
break;
}
case 7:
//instanceof: 타입 비교 연산자. 타입 같으면 true, 다르면 false 반환
if (p instanceof Picachu) {
((Picachu)p).전기공격(); //다운캐스팅 해서 추가메소드 호출
} else if (p instanceof 꼬부기) {
((꼬부기)p).물대포();
} else if (p instanceof 이상해씨) {
((이상해씨)p).넝쿨공격();
}
break;
}
}
System.out.println("게임종료");
}
}
Main (실행창)
package picachu;
import java.util.Scanner;
public class PMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("캐릭터 선택\n1.피카츄(기본) 2.꼬부기 3.이상해씨");
int m = sc.nextInt();
Pocketmon p = null;
switch (m) {
case 2:
p = new 꼬부기();
break;
case 3:
p = new 이상해씨();
break;
default:
p = new Picachu();
break;
}
Menu mm = new Menu(p);
mm.run(sc);
}
}
▼ 내가 안보고 짜봄
사실 좀 봤음..
1. VO 에서 반복되는 부분을 계속 서술함. ---- 기능상 문제는 없지만 코드가 지저분함.
2. Service 클래스에서
- 변수 선언 안함. (업클래스 까지는 기억해냈는데 어떻게 해야할지 기억 안났음..)
- 심지어 Pocketmon 타입의 변수를 선언해야 했음.. 업클래스를 위해서라면..
- sc파라메터생성자에서 값 할당도 안 함. --- 디폴트 생성자에 출력문 넣고 있었음.
- Menu 를 While 문으로 구성할 때 출력문과 nextInt()를 While문 밖에 놨다가 무한 루프 돌아감. ㅜㅠㅠ.
3. Main 창에서
- "Pocketmon 타입"의 변수!!!를 초기화 해야 했음 ㅠㅠ --- 어쩐지 계속 피카츄 대신 null이 밥먹더라.. 업캐스팅이 안됐던..
- Service의 메서드를 불러올 때 Service의 sc파라메터생성자를 호출하고! 메서드 호출했어야 함.
--- 사실상 값 할당 (this.p = p;)을 안해놨기 때문에 계속 오류가 떠서 잉?? 했던 ㅠㅠ
- 그리고! 위치를 계속 고민했음.. case 안에 넣었는데 제대로 실행 안됨.
--- switch 문은 Pocketmon을 선택해서 업캐스팅하는 용도이기 때문에, Menu 선택은 switch문 밖에 놔야 했음!!
VO
package mypocketmon;
public class Pocketmon {
protected String name;
protected int hp;
protected int exp;
protected int lv;
public Pocketmon() {
}
public Pocketmon(String name, int hp, int exp, int lv) {
this.name = name;
this.hp = hp;
this.exp = exp;
this.lv = lv;
}
public void eat () {
System.out.println(name + "가 밥을 먹습니다.");
}
public void sleep () {
System.out.println(name + "가 잠을 잡니다.");
}
public boolean exc () {
System.out.println(name + "가 운동을 합니다.");
return true;
}
public boolean play () {
System.out.println(name + "가 놉니다.");
return true;
}
public boolean fight () {
System.out.println(name + "가 야생의 포켓몬을 만났다!");
return true;
}
public void levelUp () {
System.out.println(name + "의 경험치가 올랐습니다.");
}
public void printState () {
System.out.println(name + "의 상태 확인");
System.out.println("hp: " + hp);
System.out.println("exp: " + exp);
System.out.println("lv: " + lv);
}
}
package mypocketmon;
public class 피카츄 extends Pocketmon {
public 피카츄() {
name = "피카츄";
hp = 30;
exp = 0;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 5;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 10;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 5;
boolean flag = hp > 0;
if (flag) {
exp += 10;
levelUp();
}
return flag;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 8;
boolean flag = hp > 0;
if (flag) {
exp += 7;
levelUp();
}
return flag;
}
@Override
public boolean fight() {
// TODO Auto-generated method stub
super.fight();
hp -= 20;
System.out.println("피카츄! 백만볼트!!");
System.out.println("쮸우우우우우우~~~~~~!!");
System.out.println("(번쩍!)\n.\n.\n.");
boolean flag = hp > 0;
if (flag) {
System.out.println(name + "가 이겼다!!");
exp += 20;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >= 30) {
lv++;
System.out.println(name + " 레벨업! lv: " + lv);
exp -= 30;
}
}
}
package mypocketmon;
public class 꼬부기 extends Pocketmon {
public 꼬부기() {
name = "꼬부기";
hp = 40;
exp = 0;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 4;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 9;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 4;
boolean flag = hp > 0;
if (flag) {
exp += 12;
levelUp();
}
return flag;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 7;
boolean flag = hp > 0;
if (flag) {
exp += 10;
levelUp();
}
return flag;
}
@Override
public boolean fight() {
// TODO Auto-generated method stub
super.fight();
hp -= 20;
System.out.println("꼬부기! 물대포!!");
System.out.println("콸콸콸~~~~~~!!");
System.out.println("(번쩍!)\n.\n.\n.");
boolean flag = hp > 0;
if (flag) {
System.out.println(name + "가 이겼다!!");
exp += 20;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >= 40) {
lv++;
System.out.println(name + " 레벨업! lv: " + lv);
exp -= 40;
}
}
}
package mypocketmon;
public class 이상해씨 extends Pocketmon {
public 이상해씨() {
name = "이상해씨";
hp = 45;
exp = 0;
lv = 1;
}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
hp += 3;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
super.sleep();
hp += 8;
}
@Override
public boolean exc() {
// TODO Auto-generated method stub
super.exc();
hp -= 5;
boolean flag = hp > 0;
if (flag) {
exp += 13;
levelUp();
}
return flag;
}
@Override
public boolean play() {
// TODO Auto-generated method stub
super.play();
hp -= 6;
boolean flag = hp > 0;
if (flag) {
exp += 11;
levelUp();
}
return flag;
}
@Override
public boolean fight() {
// TODO Auto-generated method stub
super.fight();
hp -= 20;
System.out.println("이상해씨! 넝쿨채찍!!");
System.out.println("촤악~! 촤악~!");
System.out.println("(번쩍!)\n.\n.\n.");
boolean flag = hp > 0;
if (flag) {
System.out.println(name + "가 이겼다!!");
exp += 20;
levelUp();
}
return flag;
}
@Override
public void levelUp() {
// TODO Auto-generated method stub
super.levelUp();
if (exp >= 40) {
lv++;
System.out.println(name + " 레벨업! lv: " + lv);
exp -= 40;
}
}
}
Service
package mypocketmon;
import java.util.Scanner;
public class ServiceMenu {
//변수를 선언하고 Main에서 업캐스팅에서 사용.
private Pocketmon p; //Pocketmon 타입의 p (클래스 정의 했으므로 가능)
public ServiceMenu(Pocketmon p) { //값을 대입해줘야 아래 함수에 값 대입됨 ㅠ
this.p = p;
}
public void Menu(Scanner sc) {
boolean flag = true;
while (flag) {
System.out.println("1.밥먹기 2.잠자기 3.운동하기 4.놀기 5.전투 6.상태확인 7.종료");
int x = sc.nextInt();
switch (x) {
case 1:
p.eat();
break;
case 2:
p.sleep();
break;
case 3:
flag = p.exc();
if (!flag) {
System.out.println(p.name + "사망...");
break;
}
break;
case 4:
flag = p.play();
if (!flag) {
System.out.println(p.name + "사망...");
break;
}
break;
case 5:
flag = p.fight();
if (!flag) {
System.out.println(p.name + "가 졌다...");
System.out.println(p.name + " 사망...");
break;
}
break;
case 6:
p.printState();
break;
case 7:
System.out.println("게임 종료");
flag = false;
break;
}
}
System.out.println("게임 종료");
}
}
Main
package mypocketmon;
import java.util.Scanner;
public class Play {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("캐릭터 선택\n1.피카츄 2.꼬부기 3.이상해씨");
// 업캐스팅 할 변수를 선언하고 초기화.
Pocketmon p = null; //Pocketmon 타입의 p 선언(클래스 정의 했으므로 가능)
int x = sc.nextInt();
switch (x) {
case 1:
p = new 피카츄(); // 업캐스팅해서 피카츄 클래스의 변수와 메서드 호출
break;
case 2:
p = new 꼬부기();
break;
case 3:
p = new 이상해씨();
break;
default:
System.out.println("다시 선택하세요.");
break;
}
ServiceMenu m = new ServiceMenu(p);
m.Menu(sc);
}
}