[필수미션]
- 가렌 / 애쉬 등 챔피언을 기반으로한 클래스 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();
}
다시한번 객체화와 추상화에 따른 코드의 정형화를 복습하는 시간이 되었다.
'spring_2기[본캠프] > 과제' 카테고리의 다른 글
| [달리기반 과제] 3회차 과제 (0) | 2025.12.16 |
|---|---|
| [달리기반 과제] 2회차 과제 (0) | 2025.12.15 |
| [과제] 계산기 만들기 2 (0) | 2025.12.08 |
| [과제] 협업으로 팀 소개 페이지 만들기(튜터님 피드백 반영) (0) | 2025.12.02 |
| [과제]맛집 관리 API 설계하기(튜터님 피드백 반영) (0) | 2025.11.26 |