코딩항해기

[실습/JAVA] 캐릭터와 무기 (+풀이 0712) 본문

problem solving/과제&실습 코딩

[실습/JAVA] 캐릭터와 무기 (+풀이 0712)

miniBcake 2024. 7. 12. 16:30

 

 

[문제]

캐릭터 클래스가 있습니다.

캐릭터는 이름, 레벨, 무기를 가집니다.

캐릭터는 attact() 공격을 할 수 있습니다.

캐릭터가 무기를 가졌다면, 무기로 공격합니다.

캐릭터는 이름을 반드시 가져야합니다.

캐릭터는 레벨 10으로 시작합니다.

캐릭터에게 무기가 없다면 맨손으로 공격합니다.

무기를 이용한 공격이 성공한다면, 레벨이 1증가합니다.

캐릭터가 attack()을 성공했는지, 실패했는지에 대한 결과를 main()에서 알 수 있습니다.

무기 클래스가 있습니다.

캐릭터가 무기를 활용해서 attack()공격을 하기 때문에, 무기 클래스도 attack()메서드를 구현해야합니다.

 

[실습]

package class05;

import java.util.Random;

class Character implements CharaterAction {
	private String name;
	private int level;
	private Weapon weapon;

	static Random rand = new Random();
	public Character(String name) {
		this(name, new Weapon());
	}
	public Character(String name, Weapon weapon) {
		this.name = name;
		this.weapon = weapon;
		this.level = 10;
	}

	@Override
	public void attack() {
		//주체
		System.out.print(this.name+"(이)가 ");
		
		//공격
		weapon.attack();
		
		//공격결과
		if(rand.nextInt(2) == 0) { //랜덤값이 조건에 맞을 때만 성공
			this.level++;
			System.out.println("공격 성공!");
			System.out.print("레벨이 1 증가하였습니다.");
		}
		else {
			System.out.println("공격 실패!");
			System.out.print("레벨이 유지됩니다.");
		}
		//레벨 결과값
		System.out.println("[ Lv."+this.level+" ]");
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	public Weapon getWeapon() {
		return weapon;
	}
	public void setWeapon(Weapon weapon) {
		this.weapon = weapon;
	}
	@Override
	public String toString() {
		return "Character [name=" + name + ", level=" + level + ", weapon=" + weapon + "]";
	}
}

class Weapon implements CharaterAction{
	private String name;

	public Weapon() {
		this("맨손");
	}
	public Weapon(String name) {
		this.name = name;
	}
	@Override
	public void attack() {
		System.out.println(this.name+"(으)로 공격을 합니다!");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Weapon [name=" + name + "]";
	}
}

interface CharaterAction {
	void attack();
}

public class Test03 {
	public static void main(String[] args) {
		Character c1 = new Character("캐릭터1", new Weapon("장난감"));
		c1.attack();
		System.out.println();
		Character c2 = new Character("캐릭터2");
		c2.attack();
		
	}
}

 

 

[풀이]

package class07;

import java.util.Random;

interface CharacAction {
   boolean attack();
}
class Charac implements CharacAction {
   String name;
   int level;
   Weapon weapon;
   Charac(String name){
      this(name,null); // null 없다 == 맨손
   }
   Charac(String name,Weapon weapon){
      this.name=name;
      this.level=10;
      this.weapon=weapon;
   }
   @Override
   public boolean attack() {
      // 캐릭터가 무기를 가졌다면, 무기로 공격
      // 캐릭터에게 무기가 없다면 맨손으로 공격합니다...
      // 무기를 이용한 공격이 성공한다면, 레벨이 +1 증가합니다.
	   
	  if(this.weapon!=null) {//무기가 있다면
		  //무기로 공격
		  if(this.weapon.attack()) {//성공한다면
			  //레벨++
			  this.level++;
			  return true;
		  }
		  System.out.println("무기공격 실패...");
	  }
	  else {
		  //맨손공격
		  System.out.println("맨손으로 공격...");
	  }
	   
      return false;
   }
}
abstract class Weapon implements CharacAction {
   String name;
   Weapon(String name){
      this.name=name;
   }
   @Override
   public abstract boolean attack();
   
}

class Fork extends Weapon{

	Fork() {
		super("포크");
	}

	@Override
	public boolean attack() {
		if(new Random().nextBoolean()) {
			System.out.println("포크 던지기!");
			return true;
		}
		System.out.println("포크가 빗나갔습니다.");
		return false;
	}
	
}

class Gun extends Weapon {

	Gun() {
		super("총");
	}

	@Override
	public boolean attack() {
		System.out.println("빵야!");
		return true;//백프로로 성공하는 공격
	}
	
}
public class Test01 {
	public static void main(String[] args) {
		
	}
}

 

 

[후기]

했다가 뺐던 부분들이 문제의 방향성에 맞는 부분이었어서 아쉬웠고,

("맨손"지정 위치, attack 리턴타입, 확률 지정 위치 등...)

추상메소드나 상속 활용 부분을 제대로 연결시키지 못했던 것 같다...! 

Weapon 이나 Pokemon 등이 주체가 아니고 따로 클래스를 빼줘야한다고 인식하는 부분이 약한 것 같다..

(풀이의 private는 추가해야하는 부분이다. 풀이 진행 중 빠졌을 뿐!)