Player 0 : 소서리스 ( HP : 6500, Recovery : 50, 일반 공격력 : 100~300, 메테오 스킬 :  1000~5000 )
Player 1 : 바바리안 ( HP : 9700, Recovery : 100, 일반 공격력 : 300~400, 휠윈드 스킬 : 2000~2500 )

잡몹  : 이름을 String mobName[] = {"루나틱","픽키","콘도르","카라멜","코코","쵸코","프릴도라","키메라","크램프","프리저"};
중에서 랜덤으로 생성함.
잡몹의 개체수 역시 5~10마리 랜덤 생성
잡몹의 HP : 2000~4000 랜덤, 공격력은 25~35 동일, 체력 회복 없음, 스킬 없음.

보스몹 : 디아블로 ( HP : 30000, Recovery : 100, 일반 공격력 200~600 + 10% 확률로 크리티컬 공격(800~1600) ) 잡몹이 모두 죽은 후에 등장합니다.

플레이어의 스킬은 전투가 시작되면 1개를 얻습니다.
이후 매 5턴마다 플레이어는 새 스킬을 얻음과 동시에 사용할 기회가 주어집니다.
스킬은 모았다 한 번에 사용할 수 있습니다. (스킬 2개를 모았다 3번째 스킬 부여될 때 사용하면 2+1 총 3배로 공격함.)

스킬 선택시 원하지 않는 다른 숫자가 들어오거나, 문자가 들어올 때의 예외처리 완료.

코드 오류 : 잡몹과 디아블로의 사망시 사망 처리 및 체력 0 처리는 된 것 같은데나 플레이어가 사망했을 경우 사망처리를 한 것 같기는 한데 망자가 되어 계속 공격합니다....(어쩌면 잡몹의 코드가 잘못 되었을수도!?) 시간 부족으로 다른 공부를 해야해서 더이상의 수정은 어려울 것 같고 혹시 수정해보고 싶다면 수정해보세요.

(주의 : 깔끔하고 좋은 코드는 아닙니다. 날아다니는 사람 많은 곳에서 혼자 뛰다 지쳐 포기는 하지 않고 계속 걷고 있는 학생의 코드니 오류가 있어도 이해하고 봐주세요.)

 

1. 메인 클래스

import java.util.Random;
import java.util.Scanner;

public class Hunt_the_Mobs_on_Field {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		Random r = new Random();
				
		int mobNum = 5 + r.nextInt(6);
		int damageBar;
		int damageSor;
		
		// Player 생성.
		Player[] player = new Player[2];
		player[0] = new Sorceress();
		player[1] = new Barbarian();
		
		System.out.println(player[0]);
		System.out.println(player[1] + "\n");
		
		System.out.println("플레이어는 전투가 시작되면 스킬을 1개 부여받고 이후 5턴마다 하나씩 부여받습니다.");
		System.out.println("스킬은 바로 사용할 수도 있지만 모아둘 경우 한 번에 2배, 3배로 공격할 수 있습니다.");
		System.out.println("대신 스킬을 모은 턴은 플레이어는 공격을 하지 않습니다.\n");
		
		// 일반몹 생성.
		// 방법 1.
//		CommonMob mob = new CommonMob(mobNum);
//				
//		Monster[] mob = new Monster[mobNum];
//
//		for (int i = 0; i < mobNum; i++) {
//			mob[i] = new CommonMob(i);
//		}
//	
//		System.out.println(mob);
		
		// 방법 2.
		Monster[] mob = new Monster[mobNum];
		
		for (int i = 0; i < mobNum; i++) {
			mob[i] = new CommonMob();
		}
		System.out.println("가 나타났습니다.");
		
		
		// 일반몹과 전투 진행.
		for (int i = 0; i < 9999; i++) {
			System.out.println("턴 진행 (리턴 입력)");
			s.nextLine();
			

			// 플레이어의 공격.
			if (i % 5 == 0) {
				damageSor = 0;	// 최초 턴 이후 스킬을 모았을 때 이전에 턴에 저장된 값에 의해 일반 공격이 실행되지 않도록 초기화.
				damageBar = 0;	// 최초 턴 이후 스킬을 모았을 때 이전에 턴에 저장된 일반 공격력 값에 의해 플레이어의 공격이 실행되지 않도록 초기화.
				damageSor = player[0].skill();
				damageBar = player[1].skill();
			} else {
				damageSor = player[0].attack();
				damageBar = player[1].attack();
			}
			
			if (player[0].isLive) { // Player 1이 살아있다면 실행.
				if (damageSor == 0) {
					System.out.println(player[0].playerName + "는 스킬을 " + player[0].saveskill + "개 모았습니다.");
				} else {
					System.out.println(player[0].playerName + "가 공격력 " + damageSor + "으로 공격합니다.");	
				}
			}
			if (player[1].isLive) { // Player 2가 살아있다면 실행.
				if (damageBar == 0) {
					System.out.println(player[1].playerName + "은 스킬을 " + player[1].saveskill + "개 모았습니다.");
				} else {
					System.out.println(player[1].playerName + "이 공격력 " + damageBar + "으로 공격합니다.");
				}
			}
			System.out.println("");
			
			
			for (int j = 0; j < mobNum; j++) {
				if (mob[j].isLive) { // j번째 몹이 살아있다면
					// Player 1 Sorceress가 공격.
					mob[j].hp = mob[j].hp - damageSor;
					mob[j].checkHP();
				}
				if (mob[j].isLive) { // j번째 몹이 Player 1 Sorceress의 공격을 받고 살아있다면
					// Player 2 Barbarian이 공격.
					mob[j].hp = mob[j].hp - damageBar;
					mob[j].checkHP();
					int damage;
					// j번째 몹이 Player1, 2의 공격을 받고 살아있다면 몹이 플레이어를 공격.
					damage = mob[j].attack();
					System.out.println(mob[j] + "이(가) 공격력" + damage + "으로 공격합니다.");
					player[0].hp = player[0].hp - damage;
					player[1].hp = player[1].hp - damage;
				}

			}
			System.out.println("");
			
			
			// 몹의 남은 체력 표시 및 종료 조건 생성.
			int remainTotalHP = 0; // 종료조건 생성용.
			for (int j = 0; j < mobNum; j++) {
				System.out.print(mob[j].toString());
				remainTotalHP = remainTotalHP + mob[j].hp;
			}
			System.out.println("\n");
			if (remainTotalHP != 0) {
				System.out.print("플레이어의 체력은 ");
			} else {
				System.out.print("몹이 모두 죽었습니다. 남은 체력은 ");
			}
			
			System.out.print(player[0].toString()); // toString은 출력시 "다른 문장"이나 + " " + 와 결합하면 순서 인식을 안 하는지 순서가 엉망이 되어 분리함.
			System.out.print(" ");
			System.out.print(player[1].toString());
			
			System.out.println("\n");
			
			if (remainTotalHP == 0) {
				break;
			}
			
			// 플레이어는 살아있다면 매 턴마다 체력을 일정량 회복합니다.
			if (player[0].isLive) {
				player[0].recoveryHP();
				System.out.println(player[0].playerName + "은 최대 " + player[0].recovery + "만큼 체력을 회복합니다.");
			}
			if (player[1].isLive) {
				player[1].recoveryHP();
				System.out.println(player[1].playerName + "은 최대 " + player[1].recovery + "만큼 체력을 회복합니다.");
			}
			System.out.println("----------------------------------------------");
			
					
		}
		
		System.out.println("\n\n");
		BossMob boss = new BossMob();
		System.out.println("가 나타났습니다.\n\n");
		
		
		// 보스몹 디아블로와 전투 진행.
		for (int i = 0; i < 9999; i++) {
			System.out.println("턴 진행 (리턴 입력)");
			s.nextLine();
			

			// 플레이어의 공격.
			if (i % 5 == 0) {
				damageSor = player[0].skill();
				damageBar = player[1].skill();
			} else {
				damageSor = player[0].attack();
				damageBar = player[1].attack();
			}
			
			if (player[0].isLive) { // Player 1이 살아있다면 실행.
				if (damageSor == 0) {
					System.out.println(player[0].playerName + "는 스킬을 " + player[0].saveskill + "개 모았습니다.");
				} else {
					System.out.println(player[0].playerName + "가 공격력 " + damageSor + "으로 공격합니다.");	
				}
				boss.hp = boss.hp - damageSor;
			}
			if (player[1].isLive) { // Player 2가 살아있다면 실행.
				if (damageBar == 0) {
					System.out.println(player[1].playerName + "은 스킬을 " + player[1].saveskill + "개 모았습니다.");
				} else {
					System.out.println(player[1].playerName + "이 공격력 " + damageBar + "으로 공격합니다.");
				}
				boss.hp = boss.hp - damageBar;
			}
			System.out.println("");
			
			
			if (boss.isLive) {
//				boss.hp = boss.hp - damageSor - damageBar;
				boss.checkHP();
				// Player 1, 2의 공격을 받고 살아있다면 디아블로가 플레이어를 공격. 
				int damage;
				damage = boss.attack();
				System.out.println(boss.bossName + "가 공격력 " + damage + "으로 공격합니다.");
				if (player[0].isLive) {
					player[0].hp = player[0].hp - damage;
				}
				if (player[1].isLive) {
					player[1].hp = player[1].hp - damage;
				}
				
			}

			
			
			// 디아블로의 남은 체력 표시 및 종료 조건 생성.
			
			System.out.println(boss.toString());
			
			System.out.println("\n");
			
									
			System.out.print("플레이어의 체력은 ");
			System.out.print(player[0].toString()); // toString은 출력시 "다른 문장"이나 + " " + 와 결합하면 순서 인식을 안 하는지 순서가 엉망이 되어 분리함.
			System.out.print(" ");
			System.out.print(player[1].toString());
			
			System.out.println("\n");
			
			if (!boss.isLive) {
				System.out.println("플레이어가 이겼습니다. 게임을 종료합니다.");
				break;
			} else if (!player[0].isLive && !player[1].isLive) {
				System.out.println("플레이어는 졌습니다. 게임을 종료합니다.");
			}
			
			
			// 플레이어는 살아있다면 매 턴마다 체력을 일정량 회복합니다.
			if (player[0].isLive) {
				player[0].recoveryHP();
				System.out.println(player[0].playerName + "은 최대 " + player[0].recovery + "만큼 체력을 회복합니다.");
			}
			if (player[1].isLive) {
				player[1].recoveryHP();
				System.out.println(player[1].playerName + "은 최대 " + player[1].recovery + "만큼 체력을 회복합니다.");
			}	
			
			// 디아블로 역시 살아있다면 매 턴마다 체력을 일정량 회복합니다.
			if (boss.isLive) {
				boss.recoveryHP();
				System.out.println(boss.bossName + "은 최대 " + boss.recovery + "만큼 체력을 회복합니다.");
			}
			System.out.println("----------------------------------------------");

		}
		
	}

}

 

2. Player Super 클래스

public abstract class Player {
	String playerName;
	int hp;
	int recovery;
	int blending;
	boolean isLive = true;
	int damage;
	int saveskill;
	
	// abstract 클래스를 만든다고 
	public String toString() {
		System.out.print(" HP: " + this.hp);
		return "";
	}
	
	public abstract int attack();
	
	public abstract void checkHP();
	
	public abstract void recoveryHP();
	
	// abstract 메소드를 사용할 경우 반드시 그 클래스 역시 abstract 클래스로 만들어줘야한다.
	public abstract int skill();
	
	// abstract클래스라고 일반 메소드를 아예 못 쓰는게 아니다.
//	public int skill() {
//		return 0;		
//	}

}

 

2.2 Player의 Sub 클래스들

import java.util.Random;
import java.util.Scanner;

public class Sorceress extends Player {
	Random r = new Random();
	Scanner s = new Scanner(System.in);
	
	public Sorceress() {
		this.playerName = "소서러스";
		this.hp = 6500;
		this.recovery = 50;
		this.saveskill = 0;
	}
	
	public String toString() {
		System.out.print(this.playerName);
		return super.toString();
	}
	
	@Override
	public int attack() {
		this.damage = 100 + r.nextInt(200);
		return this.damage;
	}
	
	@Override
	public void checkHP() {
		if (this.hp < 1) {
			System.out.println(this.playerName + "이(가) 죽었습니다.");
			this.isLive = false;
			this.hp = 0;	// 사망시 HP 마이너스 된 값 0으로 보정.
		}
	}
	
	@Override
	public void recoveryHP() {
		if (this.hp < 6500) {
			this.hp = this.hp + this.recovery;
		}
		if (this.hp > 6500) {	// 회복은 하지만 자신의 최대 HP를 넘어갈 수 없도록 보정.
			this.hp = 6500;
		}
	}
	
	@Override
	public int skill() {
		for (int i = 0; i < 99; i++) {
			try {
				System.out.println("소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 " + this.saveskill + ")");
				int yourDecision = s.nextInt();
				s.nextLine();	// nextInt() return 소거용. 이거는 nextInt()에 정수가 들어왔을 경우에만 소거가 작동하지 nextInt()에 문자가 들어올 경우에는 아예 윗 라인에서 에러가 나고 바로 catch로 빠지기 때문에 입력이 들어오지 않는다.
				if (yourDecision == 1) {
					System.out.println(this.playerName + "가 메테오를 사용합니다.");
					this.damage = ((1000 + r.nextInt(4000)) * (this.saveskill + 1));
					this.saveskill = 0;
					break;	// 정상 입력이 들어왔을 경우 for문을 나가기 위한 제어.
				} else if (yourDecision == 2) {
					System.out.println("스킬을 모아둡니다.");
					this.saveskill = this.saveskill + 1;
					this.damage = 0; // 최초 턴 이후 스킬을 모았을 때 이전에 턴에 저장된 일반 공격력 값에 의해 플레이어의 공격이 실행되지 않도록 초기화.
					break;	// 정상 입력이 들어왔을 경우 for문을 나가기 위한 제어.
				} else {
					System.out.println("정수 '1' 또는 '2'만 입력해주세요.");
//					this.skill();	// for문을 돌기 때문에 얘가 있으면 안 된다. 얘가 있으면 for문 반복에 재귀 호출이 되어 버려서 오류 3번 입력시 정상 입력을 3번 해서 break를 3번 제어 받아야 루프를 완전히 나갈 수 있다.
			}
			System.out.println("");
			} catch (Exception e) {
				System.out.println("정수 '1' 또는 '2'만 입력해주세요.");
				s.nextLine();	// nextInt()에 문자열이 들어와서 오류를 내고 바로 빠졌을 경우 여기서 System.in에 들어있는 문자열을 소거시킨다. 얘가 없으면 무한루프를 타게 된다.
//				this.skill();	// for문을 돌기 때문에 얘가 있으면 안 된다. 얘가 있으면 for문 반복에 재귀 호출이 되어 버려서 오류 3번 입력시 정상 입력을 3번 해서 break를 3번 제어 받아야 루프를 완전히 나갈 수 있다.
			}
		}
			
		return this.damage;
		
	}
		
}

 

import java.util.Random;
import java.util.Scanner;

public class Barbarian extends Player {
	Random r = new Random();
	Scanner s = new Scanner(System.in);
	
	public Barbarian() {
		this.playerName = "바바리안";
		this.hp = 9700;
		this.recovery = 100;
		this.saveskill = 0;
	}

	public String toString() {
		System.out.print(this.playerName);
		return super.toString();
	}
	
	@Override
	public int attack() {
		this.damage = 300 + r.nextInt(100);
		return this.damage;		
	}
	
	@Override
	public void checkHP() {
		if (this.hp < 1) {
			System.out.println(this.playerName + "이(가) 죽었습니다.");
			this.isLive = false;
			this.hp = 0;	// 사망시 HP 마이너스 된 값 0으로 보정.
		}
	}
	
	@Override
	public void recoveryHP() {
		if (this.hp < 9700) {
			this.hp = this.hp + this.recovery;
		}
		if (this.hp > 9700) {	// 회복은 하지만 자신의 최대 HP를 넘어갈 수 없도록 보정.
			this.hp = 9700;
		}
	}
	
	@Override
	public int skill() {
		for (int i = 0; i < 99; i++) {
			try {
				System.out.println("바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 " + this.saveskill + ")");
				int yourDecision = s.nextInt();
				s.nextLine();	// nextInt() return 소거용. 이거는 nextInt()에 정수가 들어왔을 경우에만 소거가 작동하지 nextInt()에 문자가 들어올 경우에는 아예 윗 라인에서 에러가 나고 바로 catch로 빠지기 때문에 입력이 들어오지 않는다.
				if (yourDecision == 1) {
					System.out.println(this.playerName + "가 휠윈드를 사용합니다.");
					this.damage = ((2000 + r.nextInt(500)) * (this.saveskill + 1));
					this.saveskill = 0;
					break;	// 정상 입력이 들어왔을 경우 for문을 나가기 위한 제어.
				} else if (yourDecision == 2) {
					System.out.println("스킬을 모아둡니다.");
					this.saveskill = this.saveskill + 1;
					this.damage = 0; // 최초 턴 이후 스킬을 모았을 때 이전에 턴에 저장된 일반 공격력 값에 의해 플레이어의 공격이 실행되지 않도록 초기화.
					break;	// 정상 입력이 들어왔을 경우 for문을 나가기 위한 제어.
				} else {
					System.out.println("정수 '1' 또는 '2'만 입력해주세요.");
//					this.skill();	// for문을 돌기 때문에 얘가 있으면 안 된다. 얘가 있으면 for문 반복에 재귀 호출이 되어 버려서 오류 3번 입력시 정상 입력을 3번 해서 break를 3번 제어 받아야 루프를 완전히 나갈 수 있다.
			}
			System.out.println("");
			} catch (Exception e) {
				System.out.println("정수 '1' 또는 '2'만 입력해주세요.");
				s.nextLine();	// nextInt()에 문자열이 들어와서 오류를 내고 바로 빠졌을 경우 여기서 System.in에 들어있는 문자열을 소거시킨다. 얘가 없으면 무한루프를 타게 된다.
//				this.skill();	// for문을 돌기 때문에 얘가 있으면 안 된다. 얘가 있으면 for문 반복에 재귀 호출이 되어 버려서 오류 3번 입력시 정상 입력을 3번 해서 break를 3번 제어 받아야 루프를 완전히 나갈 수 있다.
			}
		}
			
		return this.damage;
		
	}

}

 

3. 몬스터 Super 클래스

public abstract class Monster {
	String mobName[] = {"루나틱","픽키","콘도르","카라멜","코코","쵸코","프릴도라","키메라","크램프","프리저"};
	int hp;
	int recovery;
	int blending;
	boolean isLive = true;
	int damage;
	
	public String toString() {
		System.out.print(" HP: " + this.hp + " / ");
		return "";
	}
	
	public abstract int attack();
	
	public abstract void checkHP();
	
	// 아래 public int skill()과 비교해보자.
	public abstract void recoveryHP();
	
	// public abstract skill()로 바꿀 경우 CommobMob 클래스에서 skill 메소드를 사용하지 않더라도 구현해줘야한다. 
	public int skill() {
		return 0;
	}
	

}

 

3.2 몬스터 Sub 클래스들

import java.util.Random;

public class CommonMob extends Monster {
	Random r = new Random();	
	
	// 방법 1.
//	String mob[]; 
//	
//	public CommonMob(int number) {
//		this.mob = new String[number];
//		for (int i = 0; i < number; i++) {
//			this.mob[i] = mobName[r.nextInt(10)];
//			this.hp = 300 + r.nextInt(200);
//			this.toString(i);
//		}
//		
//	}
//	
//	public String toString(int i) {
//		System.out.print(this.mob[i]);
//		return super.toString();
//	}
	
	// 방법 2.
	String commonMob;
	
	public CommonMob () {
		this.commonMob = mobName[r.nextInt(10)];
		this.hp = 2000 + r.nextInt(2000);
		this.toString();
	}
	
	public String toString() {
		System.out.print(this.commonMob);
		return super.toString();
	}
	
	@Override
	public int attack() {
		this.damage = 25 + r.nextInt(10);
		return this.damage;
	}
	
	@Override
	public void checkHP() {
		if (this.hp < 1) {
			System.out.println(this.commonMob + "이(가) 죽었습니다.");
			this.isLive = false;
			this.hp = 0;	// 사망시 HP 마이너스 된 값 0으로 보정.
		}
	}
	
	// Monster 클래스의 skill() 메소드와 비교해보자. recoveryHP() 메소드는 abstract로 만들었기 때문에 사용하지 않더라도 반드시 구현해줘야한다!
	@Override
	public void recoveryHP() {
		
	}
	
	// skill()메소드는 abstract 메소드가 아닌 일반 메소드로 만들었기 때문에 Sub 클래스에서 반드시 함수를 재정의해서 구현할 필요가 없다.
}

 

import java.util.Random;

public class BossMob extends Monster {
	Random r = new Random();
	
	String bossName;
	
	public BossMob () {
		this.bossName = "디아블로";
		this.hp = 30000;
		this.recovery = 100;
		this.toString();
	}
	
	public String toString() {
		System.out.print(this.bossName);
		return super.toString();
	}
	
	@Override
	public int attack() {
		if (r.nextInt(10) == 0) {	// 10% 확률로 실행.
			System.out.println("디아블로가 치명타로 공격합니다!");
			this.damage = 800 + r.nextInt(800);
			return this.damage;
		} else {					// 90% 확률로 실행.
			this.damage = 200 + r.nextInt(400);
			return this.damage;
		}
	}
	
	@Override
	public void checkHP() {
		if (this.hp < 1) {
			System.out.println(this.bossName + "이(가) 죽었습니다.");
			this.isLive = false;
			this.hp = 0;	// 사망시 HP 마이너스 된 값 0으로 보정.
		}
	}
	
	@Override
	public void recoveryHP() {
		if (this.hp < 30000) {
			this.hp = this.hp + this.recovery;
		}
		if (this.hp > 30000) {	// 회복은 하지만 자신의 최대 HP를 넘어갈 수 없도록 보정.
			this.hp = 30000;
		}
	}
	
	
	public int skill() {
		this.damage = 500 + r.nextInt(1000);
		return this.damage;
	}

}

 

 

 

콘솔 로그

더보기

소서러스 HP: 6500

바바리안 HP: 9700

 

플레이어는 전투가 시작되면 스킬을 1개 부여받고 이후 5턴마다 하나씩 부여받습니다.

스킬은 바로 사용할 수도 있지만 모아둘 경우 한 번에 2배, 3배로 공격할 수 있습니다.

대신 스킬을 모은 턴은 플레이어는 공격을 하지 않습니다.

 

쵸코 HP: 2416 / 픽키 HP: 3309 / 키메라 HP: 3028 / 쵸코 HP: 3253 / 카라멜 HP: 2690 / 가 나타났습니다.

턴 진행 (리턴 입력)

 

소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

2

스킬을 모아둡니다.

바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

2

스킬을 모아둡니다.

소서러스는 스킬을 1개 모았습니다.

바바리안은 스킬을 1개 모았습니다.

 

쵸코 HP: 2416 / 이(가) 공격력32으로 공격합니다.

픽키 HP: 3309 / 이(가) 공격력25으로 공격합니다.

키메라 HP: 3028 / 이(가) 공격력33으로 공격합니다.

쵸코 HP: 3253 / 이(가) 공격력25으로 공격합니다.

카라멜 HP: 2690 / 이(가) 공격력32으로 공격합니다.

 

쵸코 HP: 2416 / 픽키 HP: 3309 / 키메라 HP: 3028 / 쵸코 HP: 3253 / 카라멜 HP: 2690 / 

 

플레이어의 체력은 소서러스 HP: 6353 바바리안 HP: 9553

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 263으로 공격합니다.

바바리안이 공격력 369으로 공격합니다.

 

쵸코 HP: 1784 / 이(가) 공격력29으로 공격합니다.

픽키 HP: 2677 / 이(가) 공격력32으로 공격합니다.

키메라 HP: 2396 / 이(가) 공격력26으로 공격합니다.

쵸코 HP: 2621 / 이(가) 공격력25으로 공격합니다.

카라멜 HP: 2058 / 이(가) 공격력27으로 공격합니다.

 

쵸코 HP: 1784 / 픽키 HP: 2677 / 키메라 HP: 2396 / 쵸코 HP: 2621 / 카라멜 HP: 2058 / 

 

플레이어의 체력은 소서러스 HP: 6264 바바리안 HP: 9514

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 166으로 공격합니다.

바바리안이 공격력 335으로 공격합니다.

 

쵸코 HP: 1283 / 이(가) 공격력34으로 공격합니다.

픽키 HP: 2176 / 이(가) 공격력25으로 공격합니다.

키메라 HP: 1895 / 이(가) 공격력31으로 공격합니다.

쵸코 HP: 2120 / 이(가) 공격력28으로 공격합니다.

카라멜 HP: 1557 / 이(가) 공격력31으로 공격합니다.

 

쵸코 HP: 1283 / 픽키 HP: 2176 / 키메라 HP: 1895 / 쵸코 HP: 2120 / 카라멜 HP: 1557 / 

 

플레이어의 체력은 소서러스 HP: 6165 바바리안 HP: 9465

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 281으로 공격합니다.

바바리안이 공격력 343으로 공격합니다.

 

쵸코 HP: 659 / 이(가) 공격력27으로 공격합니다.

픽키 HP: 1552 / 이(가) 공격력34으로 공격합니다.

키메라 HP: 1271 / 이(가) 공격력31으로 공격합니다.

쵸코 HP: 1496 / 이(가) 공격력32으로 공격합니다.

카라멜 HP: 933 / 이(가) 공격력26으로 공격합니다.

 

쵸코 HP: 659 / 픽키 HP: 1552 / 키메라 HP: 1271 / 쵸코 HP: 1496 / 카라멜 HP: 933 / 

 

플레이어의 체력은 소서러스 HP: 6065 바바리안 HP: 9415

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 135으로 공격합니다.

바바리안이 공격력 357으로 공격합니다.

 

쵸코 HP: 167 / 이(가) 공격력29으로 공격합니다.

픽키 HP: 1060 / 이(가) 공격력30으로 공격합니다.

키메라 HP: 779 / 이(가) 공격력33으로 공격합니다.

쵸코 HP: 1004 / 이(가) 공격력34으로 공격합니다.

카라멜 HP: 441 / 이(가) 공격력29으로 공격합니다.

 

쵸코 HP: 167 / 픽키 HP: 1060 / 키메라 HP: 779 / 쵸코 HP: 1004 / 카라멜 HP: 441 / 

 

플레이어의 체력은 소서러스 HP: 5960 바바리안 HP: 9360

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 1)

2

스킬을 모아둡니다.

바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 1)

2

스킬을 모아둡니다.

소서러스는 스킬을 2개 모았습니다.

바바리안은 스킬을 2개 모았습니다.

 

쵸코 HP: 167 / 이(가) 공격력31으로 공격합니다.

픽키 HP: 1060 / 이(가) 공격력28으로 공격합니다.

키메라 HP: 779 / 이(가) 공격력25으로 공격합니다.

쵸코 HP: 1004 / 이(가) 공격력29으로 공격합니다.

카라멜 HP: 441 / 이(가) 공격력27으로 공격합니다.

 

쵸코 HP: 167 / 픽키 HP: 1060 / 키메라 HP: 779 / 쵸코 HP: 1004 / 카라멜 HP: 441 / 

 

플레이어의 체력은 소서러스 HP: 5870 바바리안 HP: 9320

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 229으로 공격합니다.

바바리안이 공격력 315으로 공격합니다.

 

쵸코이(가) 죽었습니다.

픽키 HP: 516 / 이(가) 공격력33으로 공격합니다.

키메라 HP: 235 / 이(가) 공격력28으로 공격합니다.

쵸코 HP: 460 / 이(가) 공격력34으로 공격합니다.

카라멜이(가) 죽었습니다.

카라멜 HP: 0 / 이(가) 공격력28으로 공격합니다.

 

쵸코 HP: 0 / 픽키 HP: 516 / 키메라 HP: 235 / 쵸코 HP: 460 / 카라멜 HP: 0 / 

 

플레이어의 체력은 소서러스 HP: 5797 바바리안 HP: 9297

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 180으로 공격합니다.

바바리안이 공격력 336으로 공격합니다.

 

픽키이(가) 죽었습니다.

픽키 HP: 0 / 이(가) 공격력32으로 공격합니다.

키메라이(가) 죽었습니다.

키메라 HP: 0 / 이(가) 공격력28으로 공격합니다.

쵸코이(가) 죽었습니다.

쵸코 HP: 0 / 이(가) 공격력33으로 공격합니다.

 

쵸코 HP: 0 / 픽키 HP: 0 / 키메라 HP: 0 / 쵸코 HP: 0 / 카라멜 HP: 0 / 

 

몹이 모두 죽었습니다. 남은 체력은 소서러스 HP: 5754 바바리안 HP: 9304

 

 

 

 

디아블로 HP: 30000 / 가 나타났습니다.

 

 

턴 진행 (리턴 입력)

 

소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 2)

1

소서러스가 메테오를 사용합니다.

바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 2)

1

바바리안가 휠윈드를 사용합니다.

소서러스가 공격력 8100으로 공격합니다.

바바리안이 공격력 7461으로 공격합니다.

 

디아블로가 공격력 270으로 공격합니다.

디아블로 HP: 14439 / 

 

 

플레이어의 체력은 소서러스 HP: 5484 바바리안 HP: 9034

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 123으로 공격합니다.

바바리안이 공격력 324으로 공격합니다.

 

디아블로가 치명타로 공격합니다!

디아블로가 공격력 995으로 공격합니다.

디아블로 HP: 14092 / 

 

 

플레이어의 체력은 소서러스 HP: 4539 바바리안 HP: 8139

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 183으로 공격합니다.

바바리안이 공격력 354으로 공격합니다.

 

디아블로가 공격력 483으로 공격합니다.

디아블로 HP: 13655 / 

 

 

플레이어의 체력은 소서러스 HP: 4106 바바리안 HP: 7756

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 261으로 공격합니다.

바바리안이 공격력 376으로 공격합니다.

 

디아블로가 공격력 471으로 공격합니다.

디아블로 HP: 13118 / 

 

 

플레이어의 체력은 소서러스 HP: 3685 바바리안 HP: 7385

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 185으로 공격합니다.

바바리안이 공격력 325으로 공격합니다.

 

디아블로가 공격력 476으로 공격합니다.

디아블로 HP: 12708 / 

 

 

플레이어의 체력은 소서러스 HP: 3259 바바리안 HP: 7009

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

1

소서러스가 메테오를 사용합니다.

바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

1

바바리안가 휠윈드를 사용합니다.

소서러스가 공격력 4762으로 공격합니다.

바바리안이 공격력 2316으로 공격합니다.

 

디아블로가 공격력 270으로 공격합니다.

디아블로 HP: 5730 / 

 

 

플레이어의 체력은 소서러스 HP: 3039 바바리안 HP: 6839

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 184으로 공격합니다.

바바리안이 공격력 377으로 공격합니다.

 

디아블로가 공격력 573으로 공격합니다.

디아블로 HP: 5269 / 

 

 

플레이어의 체력은 소서러스 HP: 2516 바바리안 HP: 6366

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 182으로 공격합니다.

바바리안이 공격력 349으로 공격합니다.

 

디아블로가 공격력 297으로 공격합니다.

디아블로 HP: 4838 / 

 

 

플레이어의 체력은 소서러스 HP: 2269 바바리안 HP: 6169

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 262으로 공격합니다.

바바리안이 공격력 302으로 공격합니다.

 

디아블로가 공격력 434으로 공격합니다.

디아블로 HP: 4374 / 

 

 

플레이어의 체력은 소서러스 HP: 1885 바바리안 HP: 5835

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서러스가 공격력 217으로 공격합니다.

바바리안이 공격력 315으로 공격합니다.

 

디아블로가 공격력 511으로 공격합니다.

디아블로 HP: 3942 / 

 

 

플레이어의 체력은 소서러스 HP: 1424 바바리안 HP: 5424

 

소서러스은 최대 50만큼 체력을 회복합니다.

바바리안은 최대 100만큼 체력을 회복합니다.

디아블로은 최대 100만큼 체력을 회복합니다.

----------------------------------------------

턴 진행 (리턴 입력)

 

소서리스의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

1

소서러스가 메테오를 사용합니다.

바바리안의 스킬을 사용하려면 '1', 모아두려면 '2'를 입력하세요. (현재 모아놓은 스킬은 0)

1

바바리안가 휠윈드를 사용합니다.

소서러스가 공격력 2803으로 공격합니다.

바바리안이 공격력 2479으로 공격합니다.

 

디아블로이(가) 죽었습니다.

디아블로가 공격력 364으로 공격합니다.

디아블로 HP: 0 / 

 

 

플레이어의 체력은 소서러스 HP: 1110 바바리안 HP: 5160

 

플레이어가 이겼습니다. 게임을 종료합니다.

 

+ Recent posts