JAVA/[실습문제]

[실습문제] 포켓몬(추상클래스, private)

Itchild 2024. 4. 8. 17:40
728x90
반응형

문제

 

class Player 를 만든다.

최대 3마리의 포켓몬을 소유할수있다.

Player 생성시 최초 소지 포켓몬은 무조건 피카츄이다.

final static int maxIndex=3; // 최대 3마리로 정해놨다.

int preIndex; // 소유한 포켓몬 수

Pokemon[] data; // new Pokemon[maxIndex]

// data[0]=new 피카츄(); // 양식

 

void play()

// data에 저장된 포켓몬을 랜덤으로 2마리 선택하여 게임을 진행

// 단, 2마리의 포켓몬이 서로 같은 포켓몬이면 더이상 진행하지않음 [Object최상위클래스->equals() 오버라이딩]

클래스 타입이 같으면 같은 포켓몬

// 서로 다른 포켓몬이면 포켓몬.game()을 진행함

// game()메서드는 블로그 개념정리 - (접근)제어자 파트 추상클래스★ 예제 참조

// 이긴 포켓몬의 울음소리가 console에 출력됨

// 포켓몬.hello() 이것역시 블로그 개념정리 - (접근)제어자 파트 추상클래스★ 예제참조

 

class Pokemon [abstract]

String name;

int win; // 이긴횟수

void hello() // 울음소리. 하위클래스에 따라 수행되는 기능이 다름에 유의 [오버라이딩 강제->추상메서드]

boolean game(Pokemon pokemon)

// win이 홀홀일때는 작은쪽이 이김

// win이 짝짝일때는 큰쪽이 이김

// win이 홀짝일때는 홀수가 이김

// win이 동일하다면 주어(주체)가 이김

// 이후 이긴쪽의 win이 1 증가

 

1. 포켓몬 추가

2. 가진 포켓몬 전체 출력

3. 게임시키기

4. 프로그램 종료

package class01;

import java.util.Random;

class Player{
	private final static int maxIndex=3;
	private int preIndex;
	private Pokemon[] data;
	Player(){
		this.preIndex=0;
		this.data=new Pokemon[maxIndex];

		this.data[this.preIndex++]=new Pika();
	}
	// 기능 : 내 배열에 포켓몬 추가하기(포켓몬을 main()에서 받아온다!)
	// INPUT: 포켓몬
	// OUTPUT: x
	void addPokemon(Pokemon pokemon) {
		this.data[this.preIndex++]=pokemon;
	}
	// 기능 : 내 배열에 저장된 포켓몬을 출력
	// INPUT: x
	// OUTPUT: x
	void printData() {
		for(int i=0;i<this.preIndex;i++) {
			System.out.println(this.data[i]);
		}
	}
	void play() {
		Random rand=new Random();
		int num1=rand.nextInt(this.preIndex);
		int num2=rand.nextInt(this.preIndex);
		System.out.println(" num1 = "+num1+", num2 = "+num2);
		if(this.data[num1].equals(this.data[num2])) {
			// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
			// this.data[num1]가 equals()를 수행하는 주체(주어)
			// 타입==포켓몬      피카츄,파이리,메타몽,...
			// 부모.메서드()했어도, 알아서
			// 자식이 구현한 메서드가 실행되는 현상
			//  == 동적바인딩 -> "다형성"이 실현되었다! 라고 한다.

			// ☆ 실제 equals()를 수행하는 주체(주어)가
			// 피카츄,파이리,꼬부기,...
			System.out.println("같은 포켓몬이라 종료합니다.");
			return;
		}
		if(this.data[num1].game(this.data[num2])) {
			this.data[num1].hello();
		}
		else {
			this.data[num2].hello();
		}
	}
	public int getPreIndex() {
		return preIndex;
	}
	public void setPreIndex(int preIndex) {
		this.preIndex = preIndex;
	}
	public Pokemon[] getData() {
		return data;
	}
	public void setData(Pokemon[] data) {
		this.data = data;
	}
}

// class 생성시
// 1. abstract일까?
//    1) 이 클래스의 객체가 필요한가?
//    2) 추상메서드가 있나? == 오버라이딩을 강제해야하는 메서드가 있나?
//         == 재정의해야하는 메서드가 있나?
// 2. 멤버변수 생성
//    1) private
//    2) getter,setter
// 3. 생성자
// 4. 메서드
//    1) 오버라이딩(재정의)을 강제해야되나? => 추상메서드로 만들어야하나?
//    2) '기능'을 보고, "INPUT,OUTPUT"을 생각하여 '메서드 시그니처' 작성

abstract class Pokemon{ // 추상클래스
	private String name;
	private int win;
	Pokemon(String name){ // 추상클래스 생성자 소유 가능 (소유는 가능)
		this.name=name;
		this.win=0;
	}
	abstract void hello();
	boolean game(Pokemon pokemon) { 
		if(this.win%2==1 && pokemon.win%2==1) {
			if(this.win<=pokemon.win) {
				this.win++;
				return true;
			}
			else {
				pokemon.win++;
				return false;
			}
		}
		else if(this.win%2==0 && pokemon.win%2==0) {
			if(this.win>=pokemon.win) {
				this.win++;
				return true;
			}
			else {
				pokemon.win++;
				return false;
			}
		}
		else {
			if(this.win%2==1) {
				this.win++;
				return true;
			}
			else {
				pokemon.win++;
				return false;
			}
		}
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getWin() {
		return win;
	}
	public void setWin(int win) {
		this.win = win;
	}
	@Override
	public String toString() {
		return this.name+"이(가) 이긴 횟수는 "+this.win+"번입니다.";
	}
}

class Pika extends Pokemon{
	Pika() {
		super("피카츄");
	}
	@Override
	void hello() {
		System.out.println("피카피카");
	}
	// 1. 메서드 안 만든거 있어 => 오버라이딩 강제되고있는 메서드(추상메서드)
	//    => 1. 나도 추상클래스 하거나
	//       2. 추상메서드 오버라이딩 해줘 ◀
	// 2. super()를 호출하는 중이야 => 부모클래스에게는 기본생성자가 현재 없음
	//    => 1. 부모클래스에 기본생성자 만들거나
	//       2. 부모클래스의 다른생성자를 사용해줘 ◀
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Pika) { // Pika와 비교하려는 obj의 클래스가 같니?
			return true;
		}
		return false;
	}
}
class Metamon extends Pokemon{
	Metamon() {
		super("메타몽");
	}
	@Override
	void hello() {
		System.out.println("˚▽˚");
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Metamon) { // Metamon와 비교하려는 obj의 클래스가 같니?
			return true;
		}
		return false;
	}
}

public class Test03 {
	public static void main(String[] args) {
		Pika pika=new Pika();
		Metamon m1=new Metamon();
		Metamon m2=new Metamon();

		System.out.println();
		System.out.println();
		System.out.println();

		// 포켓몬 추가
		// 기능이 없네? -> 메서드 정의(선언,생성)
		// "누가"하는 기능?
		// "플레이어"가 하는 기능! // 주체(주어)가 누구인지 항상 고려 !
		Player player = new Player();
		player.addPokemon(new Metamon());
		player.addPokemon(new Metamon());

		for(int i=0;i<20;i++) {
			player.play();
		}

		// 포켓몬 출력
		// "플레이어"가 하는 기능! // 주체(주어)가 누구인지 항상 고려 !
		player.printData();
 

 

 

728x90
반응형