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
플레이어가 이겼습니다. 게임을 종료합니다.
'개발자 > Java' 카테고리의 다른 글
Java (자바) Abstract, @Override (0) | 2020.04.25 |
---|---|
Java (자바) 반올림(올림, 내림) 그리고 자릿수 맞추기(포맷팅) (0) | 2020.04.25 |
Java (자바) 상속, 객체데이터를 이용한 문제 - 학생, 선생, 매점 직원 (0) | 2020.04.22 |
Java (자바) 프로젝트 가져오기 (Import) (0) | 2020.04.21 |
Java (자바) 상속 - 도형 넓이 구하기 (0) | 2020.04.19 |