열심히 끝까지

[코딩 문제] - 6/21 포켓몬과제 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[코딩 문제] - 6/21 포켓몬과제

노유림 2022. 6. 22. 08:33

코드 과제
1. 포켓몬[] data=new 포켓몬[3];
   data[0]=new 피카츄();
   data[1]=new 피카츄();
   data[2]=new 파이리();
   입력: 피카츄
   피카츄는(은) 2마리 존재합니다!
   입력: 꼬부기
   꼬부기는(은) 없습니다...
   equals() 오버라이딩으로 구현하기

2. void action()에서
   공격출력문구를 attack()을 사용하기 -> [모듈화]
   그래서 온전한 오버라이딩을 완성하기
------------------------------------
void action()
   출력   => attack()
String attack()
   return ㅁㅁ공격!
------------------------------------


1번은 완료

package class04;
import java.util.Random;
import java.util.Scanner;
class Pokemon{
	String name; // => ☆
	int level;
	int exp;
	String obj;
	void action() {
//		this.attack();
		System.out.println(this.name + "이(가) ㅁㅁ공격!");
		if(this.check()) {
			this.success();
		}
		else {
			this.fail();
		}
	}
	String attack() {
		return this.attack("꼬부기");
	}
	String attack(String name) {
		this.name = name;
		String msg = this.name + "이(가) ㅁㅁ공격!";
		return msg;
	}
	boolean check() {
		Random rand = new Random();
		int num = rand.nextInt(5); // 성공 80%, 실패 20%
		if(num == 0) {
			return false;
		}
		return true;
	}
	void success() {
		Random rand = new Random();
		int exp = rand.nextInt(201) + 10; // 10 ~ 210
		this.exp += exp;
		while(this.exp >= 100) {
			this.exp -= 100;
			this.level++;
			System.out.println(this.name + ", 레벨 업!");
		}
		System.out.println(this.name + " 공격 성공! 획득 경험치 " + exp);
	}
	void fail() {
		System.out.println(this.name + "공격 실패");
		if(this.level == 1) {
			System.out.println("레벨은 1미만이 불가능합니다.");
			return;
		}
		level--;
	}
	Pokemon(String name){
		this.name = name;
		Random rand = new Random();
		this.level = rand.nextInt(5)+5;
		this.exp = 0;
	}
	@Override
	public String toString() {
		String msg = this.name + " ";
		msg += "Lv." +this.level + " ";
		msg += "[" + this.exp + "/100]";
		return msg;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Pokemon) {
			Pokemon pk = (Pokemon)obj;
			if(this.name.equals(pk.name)) {
				return true;
			}
		}
		return false;
	}
}
class Pikachu extends Pokemon{
	@Override
	void action() { // 오버라이딩
		if(this.check()) {
//			this.attack("피카츄");
			System.out.println(this.name + "이(가) 백만볼트!");
			this.success();
		}
		else {
			this.fail();
		}
	}
	Pikachu(){
		super("피카츄");
	}
}
class Pieri extends Pokemon{
	@Override
	void action() {
		System.out.println(this.name + "이(가) 불꽃공격!");
		if(this.check()) {
			this.success();
		}
		else {
			this.fail();
		}
	}
	Pieri(){
		super("파이리");
	}
}
public class Test02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Pokemon[] data = new Pokemon[3];
//				Pikachu pika = new Pikachu();
//				pika.action();
//				pika.action();
//				pika.action();
//				pika.action();
//				pika.action();
//				System.out.println(pika);
		data[0] = new Pikachu();
		data[1] = new Pikachu();
		data[2] = new Pieri();
		int num = 0;
		System.out.print("입력 : ");
		String po = sc.next();
		for(int i = 0; i < data.length; i++) {
			if(data[i].name.equals(po)) {
				num++;
			}
		}
		if(num == 0) {
			System.out.println(po + "는(은) 없습니다..");
		}
		else {
			System.out.println(po + "는(은) " + num + "마리 존재합니다!");
		}
	}
}

 

강사님의 1, 2번 답

package class04;
import java.util.Random;
import java.util.Scanner;
class Pokemon{
	String name; // => ☆
	int level;
	int exp;
	String obj;
	void action() {
		//		this.attack();
		System.out.println(this.name + "이(가) ㅁㅁ공격!");
		if(this.check()) {
			this.success();
		}
		else {
			this.fail();
		}
	}
	//	void attack(String name) {
	//		this.name = name;
	//		
	//		
	//	}
	boolean check() {
		Random rand = new Random();
		int num = rand.nextInt(5); // 성공 80%, 실패 20%
		if(num == 0) {
			return false;
		}
		return true;
	}
	void success() {
		Random rand = new Random();
		int exp = rand.nextInt(201) + 10; // 10 ~ 210
		this.exp += exp;
		while(this.exp >= 100) {
			this.exp -= 100;
			this.level++;
			System.out.println(this.name + ", 레벨 업!");
		}
		System.out.println(this.name + " 공격 성공! 획득 경험치 " + exp);
	}
	void fail() {
		System.out.println(this.name + "공격 실패");
		if(this.level == 1) {
			System.out.println("레벨은 1미만이 불가능합니다.");
			return;
		}
		level--;
	}
	Pokemon(String name){
		this.name = name;
		Random rand = new Random();
		this.level = rand.nextInt(5)+5;
		this.exp = 0;
	}
	@Override
	public String toString() {
		String msg = this.name + " ";
		msg += "Lv." +this.level + " ";
		msg += "[" + this.exp + "/100]";
		return msg;
	}
	@Override
	public boolean equals(Object obj) { // 문자열이 들어왔지만 Object로 보임
		// 현재 obj의 상태 main()에서는 실제로 문자열(String)을 보낸 상태
		//              받을 때는 Object로 받았기 때문에, 현재 상자가 Object 
		if(this.name.equals(obj.toString())) {// 인자로 받은 name문자열이 내 이름과 같니?
			// 자동 호출되는지 알았다면 그냥 obj, 저렇게 쓰는 것도 맞다!
			// 타입캐스팅도 가능하다. 하지만 toString()은 최상위에 있기 때문에 대부분 가능!
			return true;
		}
		return false;
	}
}
class Pikachu extends Pokemon{
	@Override
	void action() { // 오버라이딩
		if(this.check()) {
			//			this.attack("피카츄");
			System.out.println(this.name + "이(가) 백만볼트!");
			this.success();
		}
		else {
			this.fail();
		}
	}
	Pikachu(){
		super("피카츄");
	}
}
class Pieri extends Pokemon{
	@Override
	void action() {
		System.out.println(this.name + "이(가) 불꽃공격!");
		if(this.check()) {
			this.success();
		}
		else {
			this.fail();
		}
	}
	Pieri(){
		super("파이리");
	}
}
public class Test02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Pokemon[] data = new Pokemon[3];
		//				Pikachu pika = new Pikachu();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				System.out.println(pika);
		// 원래는 Pokemon을 넣는 것이 올바르다.(하지만 자식클래스도 넣을 수 있더라)
		data[0] = new Pikachu(); 
		data[1] = new Pikachu();
		data[2] = new Pieri();
		int num = 0;
		System.out.print("입력 : ");
		String name = sc.next();
		for(int i = 0; i < data.length; i++) {
			data[i].action();
		}
		for(int i = 0; i < data.length; i++) {
			System.out.println(data[i]);
		}
		for(int i = 0; i < data.length; i++) {
			if(name.equals(data[i].name)) { // 이렇게 나오는 건 거의 없다
				// 대부분 data[i].getName과 같이 받아온다.
				num++; // 카운팅
			}
		}
		System.out.print(name + "는(은) "); // 반복되는 출력문 빼기
		if(num == 0) {
			System.out.println("없습니다..");
		}
		else {
			System.out.println(num + "마리 존재합니다!");
		}
	}
}

--2번 출력

package class04;
import java.util.Random;
import java.util.Scanner;
class Pokemon{
	String name; // => ☆
	int level;
	int exp;
	String obj;
	String attack() {
		return "ㅁㅁㅁ";
	}
	void action() {
		System.out.println(this.name + "이(가)" + this.attack() + "공격!");
		if(this.check()) {
			this.success();
		}
		else {
			this.fail();
		}
	}
	boolean check() {
		Random rand = new Random();
		int num = rand.nextInt(5); // 성공 80%, 실패 20%
		if(num == 0) {
			return false;
		}
		return true;
	}
	void success() {
		Random rand = new Random();
		int exp = rand.nextInt(201) + 10; // 10 ~ 210
		this.exp += exp;
		while(this.exp >= 100) {
			this.exp -= 100;
			this.level++;
			System.out.println(this.name + ", 레벨 업!");
		}
		System.out.println(this.name + " 공격 성공! 획득 경험치 " + exp);
	}
	void fail() {
		System.out.println(this.name + "공격 실패");
		if(this.level == 1) {
			System.out.println("레벨은 1미만이 불가능합니다.");
			return;
		}
		level--;
	}
	Pokemon(String name){
		this.name = name;
		Random rand = new Random();
		this.level = rand.nextInt(5)+5;
		this.exp = 0;
	}
	@Override
	public String toString() {
		String msg = this.name + " ";
		msg += "Lv." +this.level + " ";
		msg += "[" + this.exp + "/100]";
		return msg;
	}
	@Override
	public boolean equals(Object obj) { // 문자열이 들어왔지만 Object로 보임
		// 현재 obj의 상태 main()에서는 실제로 문자열(String)을 보낸 상태
		//              받을 때는 Object로 받았기 때문에, 현재 상자가 Object 
		if(this.name.equals(obj.toString())) {// 인자로 받은 name문자열이 내 이름과 같니?
			// 자동 호출되는지 알았다면 그냥 obj, 저렇게 쓰는 것도 맞다!
			// 타입캐스팅도 가능하다. 하지만 toString()은 최상위에 있기 때문에 대부분 가능!
			return true;
		}
		return false;
	}
}
class Pikachu extends Pokemon{
	@Override
	String attack() {
		return "백만볼트";
	}
	Pikachu(){
		super("피카츄");
	}
}
class Pieri extends Pokemon{
	@Override
	String attack() {
		return "불꽃";
	}
	Pieri(){
		super("파이리");
	}
}
public class Test02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Pokemon[] data = new Pokemon[3];
		//				Pikachu pika = new Pikachu();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				pika.action();
		//				System.out.println(pika);
		// 원래는 Pokemon을 넣는 것이 올바르다.(하지만 자식클래스도 넣을 수 있더라)
		data[0] = new Pikachu(); 
		data[1] = new Pikachu();
		data[2] = new Pieri();
		int num = 0;
		System.out.print("입력 : ");
		String name = sc.next();
		for(int i = 0; i < data.length; i++) {
			data[i].action();
		}
		for(int i = 0; i < data.length; i++) {
			System.out.println(data[i]);
		}
		for(int i = 0; i < data.length; i++) {
			if(name.equals(data[i].name)) { // 이렇게 나오는 건 거의 없다
				// 대부분 data[i].getName과 같이 받아온다.
				num++; // 카운팅
			}
		}
		System.out.print(name + "는(은) "); // 반복되는 출력문 빼기
		if(num == 0) {
			System.out.println("없습니다..");
		}
		else {
			System.out.println(num + "마리 존재합니다!");
		}
	}
}