spring_2기[본캠프]/과제

[달리기반 과제] 1회차 과제

minwoo95 2025. 12. 9. 21:03

[필수미션]

  • 가렌 / 애쉬 등 챔피언을 기반으로한 클래스 2개 생성 후 상태(필드변수) / 행위(메서드) 지정하기 (캡슐화)
  • 유사한 성격을 가진 메서드를 모아 추상 클래스로 묶어보기(추상화)
  • 기존 클래스에 상속 후 코드 수정하기(상속)
  • 다형성을 활용하여 메서드 설정 및 main함수에서 모의 전투 롤플레잉 (다형성)

[추가미션 - 선택]

  • 가렌에게 “레벨업(levelUp)” 메서드를 만들어 체력·공격력 증가하게 해보기
  • takeDamage 후 체력이 0 이하가 되면 “가렌 사망!” 메시지 출력
  • attackDamage 값을 난수(랜덤)로 만들어 “치명타 개념” 추가해보기
  • Lux, Teemo 등 챔피언 2명 더 만들기
  • 인터페이스를 2개 이상 조합한 챔피언 만들기(예: 근거리 + 탱커)
  • Q/W/E/R 스킬을 모두 추상 메서드로 확장해보기
  • “치명타 확률” 같은 고유 패시브를 메서드로 추가해보기

 

Main

package Task_LOLChampion;

public class main {
    public static void main(String[] args) {
        Garen garen1 = new Garen("Garen1");
        Garen garen2 = new Garen("Garen2");
        Ash ash1 = new Ash("Ash1");
        Ash ash2 = new Ash("Ash2");

        //가렌1과 에쉬1이 서로 공격을 주고받음
        garen1.attackTo(ash1);
        ash1.attackTo(garen1);

        //Q/W/E/R 스킬을 모두 추상 메서드로 확장해보기
        ash2.useQ(garen2);
        ash2.useW(garen2);
        ash2.useE(garen2);
        ash2.useR(garen2);

        //Lux, Teemo 등 챔피언 2명 더 만들기
        Lux lux1 = new Lux("Lux1");
        Teemo teemo1 = new Teemo("Teemo1");

        //가렌에게 “레벨업(levelUp)” 메서드를 만들어 체력·공격력 증가하게 해보기
        garen1.levelUp(200);
        garen1.useR(ash1);

        //takeDamage 후 체력이 0 이하가 되면 “가렌 사망!” 메시지 출력
        ash1.useW(garen1);

        //attackDamage 값을 난수(랜덤)로 만들어 “치명타 개념” 추가해보기
        garen2.useE(ash2);

        //인터페이스를 2개 이상 조합한 챔피언 만들기(예: 근거리 + 탱커)
        garen2.defenseDamageUp();
        garen2.dash();

        //“치명타 확률” 같은 고유 패시브를 메서드로 추가해보기
        garen1.useE(ash1);

    }
}

 

결과창 보면 패시브가 랜덤확률로 발동되기 때문에, 위에는 패시브가 발동되었지만,

아래쪽은 패시브가 발동되지 않은 상태입니다.

 

Ash

package Task_LOLChampion;

public class Ash extends Champion {
    public Ash(String name){
        super(name,1,600,50,600,500,100);
    }
    @Override
    public void useQ(Champion target) {
        System.out.println(getName() + "이(가) 'Q' 스킬을 사용합니다.");
        attackTo(target);
    }
    @Override
    public void useR(Champion target) {
        System.out.println(getName() + "이(가) 'R' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 100;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useE(Champion target) {
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 50;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useW(Champion target) {
        System.out.println("------------useW------------");
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = getattackDamage();
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        target.takeDamage(hp);
        int mp = getMP();
        mp -= 20;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());

        System.out.println("----------------------------");
    }

}

 

Garen

package Task_LOLChampion;

public class Garen extends Champion implements Tanker,ShortDistance {
    public Garen(String name){
        super(name,1,100,50,600,500,100);
    }
    @Override
    public void defenseDamageUp() {
        System.out.println("------------근거리 패시브------------");
        System.out.println("방어력이 100 증가합니다.");
        setdefenseDamageUp1(100);
        System.out.println(getName()+"의 패시브 반영 방어력 : "+getdefenseDamageUp1());
        System.out.println("----------------------------");
    }
    @Override
    public void dash(){
        System.out.println("------------탱커 패시브------------");
        System.out.println("앞으로 순간이동을 실시합니다!!");
        System.out.println("----------------------------");
    }
    @Override
    public void useQ(Champion target) {
        System.out.println("------------useQ------------");
        System.out.println(getName() + "이(가) 'Q' 스킬을 사용합니다.");
        attackTo(target);
        System.out.println("----------------------------");
    }
    @Override
    public void useR(Champion target) {
        System.out.println("------------useR------------");
        System.out.println(getName() + "이(가) 'R' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 100;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
        System.out.println("----------------------------");
    }
    @Override
    public void useE(Champion target) {
        System.out.println("------------useE------------");
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        System.out.println(getName() + "의 'E' 스킬은 랜덤한 확률로 치명타 데미지가 발생합니다.");
        int probability = criticalDamage();
        if (probability >= 100) {
            int hp = target.getHP()-getrandomDamage();
            target.setHP(hp);
            System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        }else{
            System.out.println(getName() + "의 치명타가 발생하지 않았습니다.");
        }
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 50;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
        System.out.println("---------------------------");
    }
    @Override
    public void useW(Champion target) {
        System.out.println("------------useW------------");
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = getattackDamage();
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        target.takeDamage(hp);
        int mp = getMP();
        mp -= 20;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());

        System.out.println("----------------------------");
    }
    public void levelUp(int ex) {
        System.out.println("------------levelUp-------------");
        System.out.println(getName()+"이 획득한 경험치 : "+ex);
        int getex = getEx();
        int ex1 = getex+ex;
        setEx(ex1);
        System.out.println(getName()+"의 현재 총 경험치 : "+getEx());
        int getex1 = getEx();
        int maxex = getmaxEx();
        int ex2 = maxex-getex1;
        System.out.println(getName()+"의 레벨업까지 필요한 경험치 : "+ex2);
        if(getex1>=maxex){
            setlevel(1);
            System.out.println(getName()+"레벨업 하였습니다. : 현재레벨 "+getlevel());
            setattackDamage(50);
            setHP(150);
            System.out.println(getName()+"의 총 체력 : "+getHP()+" 총 공경력 :"+getattackDamage());
        }
        System.out.println("-------------------------------");
    }

 

Champion

package Task_LOLChampion;

import java.util.Random;

public abstract class Champion {
    private String name;
    private int levle;
    private int attackDamage;
    private int defenseDamage;
    private int HP;
    private int MP;
    private int ex;
    private int maxEx;
    Random rand = new Random();
    private int mindamage=100;
    private int maxmindamage=300;
    private int randomDamage;
    private int range = maxmindamage - mindamage+1;

    final double CRITICAL_CHANCE = 0.5;//50% 확률
    Random random = new Random();

    public Champion(String name,int level,int attackDamage,int defenseDamage,int HP,int MP,int maxEx) {
        this.name = name;
        this.levle = level;
        this.attackDamage=attackDamage;
        this.defenseDamage = defenseDamage;
        this.HP = HP;
        this.MP = MP;
        this.maxEx = maxEx;
    }
    public int criticalDamage(){
        double probabilityCheck = random.nextDouble();
        if (probabilityCheck < CRITICAL_CHANCE) {
            randomDamage = rand.nextInt(range)+mindamage;
        }
        return this.randomDamage;
    }
    public int getlevel() {
        return levle;
    }
    public void setlevel(int level) {
        this.levle += level;
    }
    public int getrandomDamage(){
        return randomDamage;
    }
    public void setdefenseDamageUp1(int defenseDamage) {
        this.defenseDamage += defenseDamage;
    }
    public int getdefenseDamageUp1(){
        return defenseDamage;
    }
    public int getmaxEx(){
        return maxEx;
    }
    public void setmaxEx(int maxEx) {
        this.maxEx = maxEx;
    }
    public int getEx(){
        return ex;
    }
    public void setEx(int ex){
        this.ex = ex;
    }
    public String getName() {
        return name;
    }
    public int getLevle() {
        return levle;
    }
    public void setHP(int HP) {
        this.HP = HP;
    }
    public int getHP() {
        return this.HP;
    }
    public int getMP() {
        return this.MP;
    }
    public void setMP(int MP) {
        this.MP = MP;
    }
    public int getattackDamage() {
        return this.attackDamage;
    }
    public void setattackDamage(int attackDamage){
        this.attackDamage += attackDamage;
    }
    public void attackTo(Champion target){
        this.HP-=target.getattackDamage();
        System.out.println(target.getName()+"가"+this.name+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+this.HP+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        this.MP-=100;
        System.out.println(this.name+"의 남은 마력 : "+this.MP);
    }
    public abstract void useQ(Champion target);
    public abstract void useW(Champion target);
    public abstract void useE(Champion target);
    public abstract void useR(Champion target);
    public void takeDamage(int damage) {
        System.out.println("------------takeDamage------------");
        int m = this.HP - damage;
        if (m <= 0) {
            System.out.println(this.name + "가 사망 하였습니다.");
            System.out.println("-------------------------------");
            setHP(0);
        } else {
            System.out.println(this.name + "의 남은 체력 :" + this.HP);
            System.out.println("-------------------------------");
            setHP(m);
        }
    }
}

 

Lux

package Task_LOLChampion;

public class Lux extends Champion {
    public Lux(String name) {
        super(name,5,50,10,500,600,100);
    }
    @Override
    public void useQ(Champion target) {
        System.out.println(getName() + "이(가) 'Q' 스킬을 사용합니다.");
        attackTo(target);
    }
    @Override
    public void useR(Champion target) {
        System.out.println(getName() + "이(가) 'R' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 100;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useE(Champion target) {
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 10;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useW(Champion target) {
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 40;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }

}

 

Teemo

package Task_LOLChampion;

public class Teemo extends Champion{
    public Teemo(String name) {
        super(name,2,30,10,800,400,100);
    }
    @Override
    public void useQ(Champion target) {
        System.out.println(getName() + "이(가) 'Q' 스킬을 사용합니다.");
        attackTo(target);
    }
    @Override
    public void useR(Champion target) {
        System.out.println(getName() + "이(가) 'R' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 100;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useE(Champion target) {
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 60;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
    @Override
    public void useW(Champion target) {
        System.out.println(getName() + "이(가) 'E' 스킬을 사용합니다.");
        int hp = target.getHP()-getattackDamage();
        target.setHP(hp);
        System.out.println(target.getName()+"가"+getName()+"에게 공격 당하였습니다. 현재"+target.getName()+"의 체력은"+target.getHP()+"입니다.");
        //출력문을 데미지 계산 위에 위치시켜서 감소된 HP 확인이 안되었다.[문제]
        int mp = getMP();
        mp -= 80;
        setMP(mp);
        System.out.println(getName()+"의 남은 마력 : "+getMP());
    }
}

 

인터페이스 Tanker

package Task_LOLChampion;

public interface Tanker {
    public void defenseDamageUp();
}

 

인터페이스 ShortDistance

package Task_LOLChampion;

public interface ShortDistance {
    public void dash();
}

 

 

 

다시한번 객체화와 추상화에 따른 코드의 정형화를 복습하는 시간이 되었다.