본문 바로가기
Java/기본 개념 및 클래스

[Java] 23. 개념 응용하기: 함수와 메서드를 이용한 응용문제

글: Song hyun 2024. 4. 16.
728x90
반응형

응용 문제 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;
					}
				}
			}

		}

	}

}
728x90
반응형