포켓몬 키우기 게임을 만들어라
① 각 캐릭터들의 동작과 상태 필요한 정보들을 만들어준다.
package Game;
//캐릭터들한테 상속 해주려고 만들었다.
public class Poketmon {
protected String name;
protected int hp, exp, lv;
public void eat() {
System.out.println(name + "밥먹는다");
}
public void sleep() {
System.out.println(name + "잠잔다");
}
public boolean play() { // 노는건 hp 감소하고 exp 는 증가 할꺼라
System.out.println(name + "논다");
return true;
}
public boolean exc() {// 운동하는건 hp 감소하고 exp 는 증가 할꺼라
System.out.println(name + "운동한다");
return true;
}
public void levelup() {
System.out.println(name + "레벨체크");
System.out.println(" lv : " + lv);
}
public void printStatus() {
System.out.println(name + "상태확인");
System.out.println(" hp : " + hp);
System.out.println(" exp : " + exp);
System.out.println(" lv : " + lv);
}
// 각 상태메뉴들을 한 클래스에 뺴주고 이걸 각각의 캐릭터들한테 상속 시켜 줄 예정.
}
② 캐릭터 class 를 생성해서 ①번에서 만든 부모 객체를 상속해준다.
그러면 부모객체에서 만든 모든 내용(private 제외) 하고 다 만들어진 캐릭터에 상속 된다.
package Game;
public class 피카츄 extends Poketmon { //앞에만든 Poketmon 클래스를 상속 시켜줬음
public 피카츄() {
name = "피카츄";
hp=40;
lv=1;
} //기본 제공 되는 정보들을 개발자가 원하는 대로 작성.
// source -> override/implement Method 클릭해서
//상속 받은 부모 오브젝트를 전부 클릭 해주면 자동 생성 됨
@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; //놀면 -5 만큼 hp 감소 할꺼고
boolean flag = hp>0; //살았으면
//살아을 때만 경험치 증가
if(flag) {
exp += 4; //능력치를 증가
levelup(); //레벨체크해주는 메소드. 이걸 호출해서 레벨 체크를 해주자
}return flag;
}
@Override
public boolean exc() {
// TODO Auto-generated method
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 + "의 레벨이 1증가 되었습니다. lv : " +lv);
}
}
public void 전기공격() { //개발자가 만듬
System.out.println("백만볼트 공격");
}
}
③ 사용자 정의로 프로그램 실행 시 실행 될 메뉴의 상세 내용들을 정의 해 준다.
package Game;
import java.util.Scanner;
public class menu {
private Poketmon p; // 업케스팅으로 피카츄 꼬북 파이리 중에 하나의 객체를 저장. 사용자가 뭘 입력할지 모르니까.
public menu(Poketmon p) { // 위의 private Poketmon p를 인자로 받음
this.p = p;
}
public void print1(Scanner sc) {
boolean flag = true;
while (flag) { // 잘못된 값을 입력 할 떄까지
System.out.println("메뉴를 선택 하시오");
System.out.println("1. 밥 먹기 2. 잠자기 3. 논다 4. 운동한다 5.레벨확인 6.상태체크 7.특기공격");
int m = sc.nextInt();
switch (m) { // 입력 받은 값 m을 switch 문을 사용해서 메뉴 번호에 맞게 구현
case 1:
p.eat(); // Pocketmon 객체의 먹는 것
break;
case 2:
p.sleep();
break;
case 3:
flag = p.play();
if (!flag) {
System.out.println(p.name + "캐릭터 사망");
} // 노는건 hp 감소하고 exp 는 증가 할꺼라 캐릭터가 사망 하는지 확인 해주어야함
break;
case 4:
flag = p.exc();
if (!flag) {
System.out.println(p.name + "캐릭터 사망");
}
break;
case 5:
p.levelup();
break;
case 6:
p.printStatus();
break;
case 7:
// 객체의 타입을 비교하는 연산자 instanceof : 타입이 같으면 true, 같지 않으면 false
if (p instanceof 피카츄) {
System.out.println("피카츄맞음");
((피카츄) p).전기공격();
// 형변환 연산자를 사용하여 P변수를 피카츄 객체로 변환하고 전기공격 메서드를 호출
} else if (p instanceof 파이리) {
System.out.println("파이리");
((파이리) p).불();
} else if (p instanceof 꼬북이) {
System.out.println("꼬북이맞음");
((꼬북이) p).물대포();
} // 다운캐스팅해라. p는 포켓몬이라 확장되어 추가 된 공격은 사용할 수 없다.
}
}
}
}
④ main class에 ① ~ ③ 의 내용들이 구현 될 수 있도록 풀어준다.
① ~ ③의 내용들이 사실은 깔끔하게 객체화 되어 있기 때문에 main class 에서 간단하게 구현 될 수 있는 것이다.
package Game;
import java.util.Scanner;
public class PoketmonGame {
public static void main(String[] args) {
// TODO Auto-generated method stub
Poketmon p = null;
Scanner sc = new Scanner(System.in);
System.out.println("캐릭터를 선택하세요");
System.out.println("1. 피카츄 2.파이리 3. 꼬북이");
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;
}
menu mm = new menu(p); // 메뉴를 객체화 시키고 인자값으로 P를 받는다
mm.print1(sc);
// 메뉴의 프린트1 메소드를 호출해 사용자정의로 만들어 놓았던 menu를 모두 실행 시킨다
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 (0) | 2023.03.04 |
---|---|
[JAVA] 추상 클래스 (0) | 2023.03.04 |
[JAVA] 객체지향 - 회원가입 만들기 (0) | 2023.03.02 |
[JAVA] 객체지향 - 상속과 배열로 간단화 (0) | 2023.03.02 |
[JAVA] 객체지향 - 클래스를 인자 값으로 받는 클래스 출력문 (0) | 2023.03.02 |