응용 문제 1.
객체 지향 프로그래밍의 개념을 응용하여, 간단한 게임을 만들어보자.
(1) Warrior, Magician, Archer 총 3개의 클래스를 만들어라.
(2) 3개의 클래스를 인스턴스화하고, 각각 초기화해라.
(3) 사용받은 값에 따라 직업을 선택하고, 몬스터와 전투한 뒤 체력에 따라 승리/패배를 출력하는 코드를 작성해라.
풀이 과정.
1. 클래스 파일 생성
(1) Warrior, Magician, Archer 총 3개의 클래스 파일을 생성하고,
(2) 각각의 클래스에 이름, 레벨, 체력, 힘, 돈, 크리티컬과 같은 요소들을 변수로 선언한다.
(3) 사용자의 정보를 입력받아 쓸 수 있게끔 사용자 지정 생성자를 만든다.
(4) 다른 캐릭터를 공격할 때, 공격 받았을 때, 레벨업 할 때, 상태창을 볼 때 등의 경우를 메서드로 작성한다.
2. 실행 파일 작성
(1) 작성한 클래스, 메서드들을 실험해볼 TestBattleSituation을 메인 함수와 함께 생성한다.
(2) 사용자가 입력받은 값에 따라 캐릭터를 선택할 수 있게 하고(1,2,3)
(3) 선택한 캐릭터를 호출한 뒤,
(4) 전투 시뮬레이션을 시작한다.
(5) 전투 시뮬레이션은 총 3개의 선택지로 구성되어 있는데, (전투, 도망, 종료)
(5)-1. 전투를 선택 시, 선택한 캐릭터에 맞는 공격력을 바탕으로 적 몬스터를 공격하게 한다.
(ex: a 캐릭터 때릴 때의 메서드+b캐릭터 맞을 때의 메서드)
(5)-2. 도망을 선택 시, 돈(money 변수)을 0으로 초기화하고, 캐릭터 선택 화면으로 돌아간다.
(5)-3. 종료를 선택 시, break, flag=false를 통해 if 문과 반복문을 종료하게끔 한다.
(6) (1)~(5)까지의 코드를 while문으로 감싸, 전투 실행을 반복할 수 있게끔 한다.
(7) critical이 10 이상 쌓이거나, 전투에서 승리 시 레벨업을 통해 체력, 힘, 돈이 추가되게끔 한다.
Warrior 클래스
package basic.ch09;
public class Warrior {
String name;
int level;
int health;
int power;
int money;
int critical;
public Warrior(String A, int a, int b, int c) {
name = A;
level = a;
health = b;
power = c;
critical = 0;
}
// 상태창
public void checkMe() {
System.out.println("---- 상태창 ----");
System.out.println(" 닉네임: " + name);
System.out.println(" 레벨: " + level);
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
System.out.println(" 소지금: " + money);
System.out.println("------***------");
}
public void showInfo() {
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
}
// 전사 공격하기
public void hit(Warrior warrior) {
power -= 3;
warrior.health -= 15;
critical++;
System.out.println(name + "가 검을 휘둘렀다!");
System.out.println(critical + " 콤보!");
System.out.println(warrior.name + "는 15의 데미지를 입었다.");
}
// 마법사 공격하기
public void hit(Magician magician) {
power -= 3;
magician.health -= 15;
critical++;
System.out.println(name + "가 검을 휘둘렀다!");
System.out.println(critical + " 콤보!");
System.out.println(magician.name + "는 15의 데미지를 입었다.");
}
// 궁수 공격하기
public void hit(Archer archer) {
power -= 3;
archer.health -= 15;
critical++;
System.out.println(name + "가 검을 휘둘렀다!");
System.out.println(critical + " 콤보!");
System.out.println(archer.name + "는 15의 데미지를 입었다.");
}
// 전사-맞았을 때
public void attackedWa() {
health -= 15;
}
// 마법사-맞았을 때
public void attackedMa() {
health -= 30;
}
// 궁수-맞았을 때
public void attackedAr() {
health -= 15;
}
// 도망치기
public void run() {
System.out.println("무서워서 그만 도망쳐 버렸다!");
System.out.println("가진 돈을 모두 잃었다...");
critical = 0;
money = 0;
}
// 전투 후 리셋
public void reSet(Warrior warrior) {
this.health = 30;
this.power = 30;
}
// 레벨업
public void levelUp() {
if (critical >= 10) {
level++;
health += 30;
power += 30;
money += 10;
System.out.println("레벨이 올라갔다!");
checkMe();
}
}
}
Magician 클래스 파일
package basic.ch09;
public class Magician {
String name;
int level;
int health;
int power;
int money;
int critical;
public Magician(String A, int a, int b, int c) {
name = A;
level = a;
health = b;
power = c;
critical = 0;
}
// 상태창
public void checkMe() {
System.out.println("---- 상태창 ----");
System.out.println(" 닉네임: " + name);
System.out.println(" 레벨: " + level);
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
System.out.println(" 소지금: " + money);
System.out.println("------***------");
}
public void showInfo() {
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
}
// 전사 공격하기
public void hit(Warrior warrior) {
power -= 3;
warrior.health -= 20;
critical++;
System.out.println(name + "가 주문을 외웠다!");
System.out.println(critical + " 콤보!");
System.out.println(warrior.name + "는 15의 데미지를 입었다.");
}
// 마법사 공격하기
public void hit(Magician magician) {
power -= 3;
magician.health -= 15;
critical++;
System.out.println(name + "가 주문을 외웠다!");
System.out.println(critical + " 콤보!");
System.out.println(magician.name + "는 15의 데미지를 입었다.");
}
// 궁수 공격하기
public void hit(Archer archer) {
power -= 3;
archer.health -= 15;
critical++;
System.out.println(name + "가 주문을 외웠다!");
System.out.println(critical + " 콤보!");
System.out.println(archer.name + "는 15의 데미지를 입었다.");
}
// 전사-맞았을 때
public void attackedWa() {
health -= 15;
}
// 마법사-맞았을 때
public void attackedMa() {
health -= 30;
}
// 궁수-맞았을 때
public void attackedAr() {
health -= 15;
}
// 도망치기
public void run() {
System.out.println("무서워서 그만 도망쳐 버렸다!");
System.out.println("가진 돈을 모두 잃었다...");
critical = 0;
money = 0;
}
// 레벨업
public void levelUp() {
if (critical >= 10) {
level++;
health += 30;
power += 30;
money += 10;
System.out.println("레벨이 올라갔다!");
checkMe();
}
}
}
Archer 클래스 파일
package basic.ch09;
public class Archer {
String name;
int level;
int health;
int power;
int money;
int critical;
public Archer(String A, int a, int b, int c) {
name = A;
level = a;
health = b;
power = c;
critical = 0;
}
// 상태창
public void checkMe() {
System.out.println("---- 상태창 ----");
System.out.println(" 닉네임: " + name);
System.out.println(" 레벨: " + level);
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
System.out.println(" 소지금: " + money);
System.out.println("------***------");
}
public void showInfo() {
System.out.println(" HP: " + health);
System.out.println(" MP: " + power);
}
// 전사 공격하기
public void hit(Warrior warrior) {
power -= 3;
warrior.health -= 15;
critical++;
System.out.println(name + "가 화살을 쐈다!");
System.out.println(critical + " 콤보!");
System.out.println(warrior.name + "는 15의 데미지를 입었다.");
}
// 마법사 공격하기
public void hit(Magician magician) {
power -= 3;
magician.health -= 15;
critical++;
System.out.println(name + "가 화살을 쐈다!");
System.out.println(critical + " 콤보!");
System.out.println(magician.name + "는 15의 데미지를 입었다.");
}
// 궁수 공격하기
public void hit(Archer archer) {
power -= 3;
archer.health -= 15;
critical++;
System.out.println(name + "가 화살을 쐈다!");
System.out.println(critical + " 콤보!");
System.out.println(archer.name + "는 15의 데미지를 입었다.");
}
// 전사-맞았을 때
public void attackedWa() {
health -= 15;
}
// 마법사-맞았을 때
public void attackedMa() {
health -= 30;
}
// 궁수-맞았을 때
public void attackedAr() {
health -= 15;
}
// 도망치기
public void run() {
System.out.println("무서워서 그만 도망쳐 버렸다!");
System.out.println("가진 돈을 모두 잃었다...");
critical = 0;
money = 0;
}
// 레벨업
public void levelUp() {
if (critical >= 10) {
level++;
health += 30;
power += 30;
money += 10;
System.out.println("레벨이 올라갔다!");
checkMe();
}
}
}
실행 파일
package basic.ch09;
import java.util.Scanner;
public class BattleSituation {
public static void main(String[] args) {
Warrior warrior1 = new Warrior("홍길동", 1, 100, 30);
Archer archer1 = new Archer("임꺽정", 1, 60, 70);
Magician magician1 = new Magician("마법사", 1, 30, 100);
Warrior warrior2 = new Warrior("지나가는 오크", 1, 30, 30);
boolean flag = true;
while (flag) {
System.out.println("----------------");
System.out.println("게임을 시작합니다.");
System.out.println();
warrior2.reSet(warrior2);
System.out.println("----------------");
System.out.println("캐릭터를 선택하세요.");
System.out.println("1. 전사 / 2. 마법사 / 3. 궁수");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
System.out.println("----------------");
System.out.println();
if (choice == 1) {
System.out.println("전사를 선택했습니다.");
System.out.println("전투를 시작합니다.");
System.out.println("----------------");
System.out.println();
warrior1.checkMe();
System.out.println();
boolean keep = (warrior1.health) > 0;
while (keep) {
System.out.println("무엇을 할까요?");
System.out.println("1.공격하기 / 2.도망치기 / 3.종료하기");
System.out.println();
int choice2 = sc.nextInt();
if (choice2 == 1) {
warrior1.hit(warrior2);
System.out.println();
System.out.println();
if (warrior1.health < 0) {
System.out.println("이런, 전투에서 패배했다...");
System.out.println("가진 돈을 모두 잃었다.");
System.out.println("마을로 돌아가자.");
warrior1.money = 0;
warrior1.checkMe();
break;
}
else if (warrior1.critical == 10) {
warrior1.levelUp();
System.out.println();
}
else if (warrior2.health <= 0) {
System.out.println("야호! 전투에서 승리했다!");
System.out.println();
warrior1.levelUp();
warrior1.checkMe();
break;
}
warrior2.hit(warrior1);
System.out.println("이런!" + warrior1.health + "만큼의 체력이 남았다.");
System.out.println();
} else if (choice2 == 2) {
warrior1.run();
warrior1.checkMe();
break;
} else {
System.out.println("전투를 종료합니다.");
warrior1.checkMe();
flag = false;
break;
}
}
}
if (choice == 2) {
System.out.println("마법사를 선택했습니다.");
System.out.println("전투를 시작합니다.");
System.out.println("----------------");
System.out.println();
magician1.checkMe();
System.out.println();
boolean keep = (magician1.health) > 0;
while (keep) {
System.out.println("무엇을 할까요?");
System.out.println("1.공격하기 / 2.도망치기 / 3.종료하기");
System.out.println();
int choice2 = sc.nextInt();
if (choice2 == 1) {
magician1.hit(warrior2);
System.out.println();
System.out.println();
if (magician1.health <= 0) {
System.out.println("이런, 전투에서 패배했다...");
System.out.println("가진 돈을 모두 잃었다.");
System.out.println("마을로 돌아가자.");
magician1.money = 0;
magician1.checkMe();
break;
}
else if (magician1.critical == 10) {
magician1.levelUp();
System.out.println();
}
else if (warrior2.health <= 0) {
System.out.println("야호! 전투에서 승리했다!");
System.out.println();
warrior1.levelUp();
magician1.checkMe();
break;
}
warrior2.hit(magician1);
System.out.println("이런!" + magician1.health + "만큼의 체력이 남았다.");
System.out.println();
} else if (choice2 == 2) {
magician1.run();
magician1.checkMe();
break;
} else {
System.out.println("전투를 종료합니다.");
magician1.checkMe();
flag = false;
break;
}
}
}
if (choice == 3) {
System.out.println("궁수를 선택했습니다.");
System.out.println("전투를 시작합니다.");
System.out.println("----------------");
System.out.println();
archer1.checkMe();
System.out.println();
boolean keep = (archer1.health) > 0;
while (keep) {
System.out.println("무엇을 할까요?");
System.out.println("1.공격하기 / 2.도망치기 / 3.종료하기");
System.out.println();
int choice2 = sc.nextInt();
if (choice2 == 1) {
archer1.hit(warrior2);
System.out.println();
System.out.println();
if (archer1.health <= 0) {
System.out.println("이런, 전투에서 패배했다...");
System.out.println("가진 돈을 모두 잃었다.");
System.out.println("마을로 돌아가자.");
archer1.money = 0;
archer1.checkMe();
break;
}
else if (archer1.critical == 10) {
archer1.levelUp();
System.out.println();
}
else if (warrior2.health <= 0) {
System.out.println("야호! 전투에서 승리했다!");
System.out.println();
archer1.levelUp();
magician1.checkMe();
break;
}
warrior2.hit(archer1);
System.out.println("이런!" + archer1.health + "만큼의 체력이 남았다.");
System.out.println();
} else if (choice2 == 2) {
archer1.run();
archer1.checkMe();
break;
} else {
System.out.println("전투를 종료합니다.");
archer1.checkMe();
flag = false;
break;
}
}
}
}
}
}
'Java > 기본 개념 및 클래스' 카테고리의 다른 글
[Java] 25. getter/setter 메서드 (0) | 2024.04.17 |
---|---|
[Java] 24. 접근 제어 지시자와 정보 은닉 (0) | 2024.04.17 |
[Java] 22. 객체 지향 패러다임 (0) | 2024.04.16 |
[Java] 21. 생성자: 기본 생성자와 사용자 정의 생성자 (0) | 2024.04.16 |
[Java] 20. 함수, 인스턴스화, 메서드 연습 문제 (0) | 2024.04.16 |