게임 캐릭터 개발
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 86번째.
이 챌린지에서는 복잡하고 상호 작용하는 개체를 모델링하는 OOP의 강력한 기능을 보여 주는 Game Character Development 시스템을 구축합니다.
base Character 클래스가 체력, 이름, 레벨과 같은 공통 속성을 정의하는 캐릭터 계층 구조를 설계하세요. Warrior, Mage, Archer와 같은 특수화된 클래스는 고유한 능력과 전투 스타일을 추가하여 이 base를 확장합니다.
여기서는 인터페이스가 자연스럽게 작동합니다. Attackable은 전투 메서드를 정의하고, Healable은 회복 능력을 처리할 수 있습니다. Mage는 두 인터페이스를 모두 구현할 수 있는 반면, Warrior는 공격에만 집중합니다.
서로 다른 공격 행동에 Strategy 패턴을 사용하여 캐릭터가 전투 스타일을 동적으로 전환할 수 있도록 하는 것을 고려해 보세요. State 패턴은 행동에 영향을 미치는 normal, poisoned 또는 stunned 상태와 같은 캐릭터 조건을 관리하는 데 사용할 수 있습니다.
characters가 무기와 갑옷을 상속받는 대신 이를 "have"하는 장비 시스템에서 구성(composition)에 대해 생각해 보세요. character class 또는 damage type에는 열거형을 사용하고, 잘못된 수정을 방지하기 위해 캡슐화를 적용하여 능력치를 보호하세요.
챌린지
쉬움복잡하고 상호작용하는 게임 엔터티를 모델링하는 OOP의 강력한 기능을 보여 주는 Game Character Development 시스템을 만들어 봅시다! 다양한 combat 스타일, 특수 abilities, 그리고 캐릭터의 동작 방식에 영향을 주는 상태 시스템을 갖춘 캐릭터 계층 구조를 만들게 됩니다.
코드를 일곱 개의 파일로 구성합니다:
DamageType.java: 게임에서 다양한 damage 유형을 나타내는 enum을 만드세요.PHYSICAL,MAGICAL,RANGED값을 포함하세요.description(String) private 필드를 추가하고, 이 필드를 설정하는 constructor와 getter를 만드세요. Physical damage의 description은 "brute force", magical은 "arcane energy", ranged는 "precision strike"여야 합니다.Attackable.java: combat capabilities를 정의하는 interface를 만드세요. 공격을 설명하는 String을 반환하는attack(Character target)메서드와 DamageType을 반환하는getDamageType()메서드를 선언하세요.Healable.java: 회복 abilities를 위한 interface를 만드세요. 회복 동작을 설명하는 String을 반환하는heal(int amount)메서드를 선언하세요.Character.java: 모든 게임 캐릭터를 위한 abstract 기반 class를 만드세요.name(String),health(int),maxHealth(int),level(int)을 위한 private 필드를 포함하세요. constructor는 name, maxHealth, level을 매개변수로 받고, 처음에는 health를 maxHealth와 같게 설정합니다. 모든 필드의 getter를 포함하세요. health가 0 이상 maxHealth 이하로 유지되도록 하는 protected 메서드setHealth(int health)를 추가하세요. health를 감소시키고"[name] takes [damage] damage! Health: [health]/[maxHealth]"를 반환하는takeDamage(int damage)메서드를 만드세요. health가 0보다 클 때 true를 반환하는isAlive()메서드를 추가하세요. String을 반환하는 abstract 메서드getCharacterClass()를 선언하세요.Warrior.java: Character를 확장하고 Attackable을 구현하는 class를 만드세요.strength(int) private 필드를 추가하세요. constructor는 name, maxHealth, level, strength를 매개변수로 받습니다.getCharacterClass()가"Warrior"를 반환하도록 구현하세요.getDamageType()이PHYSICAL을 반환하도록 구현하세요.attack(Character target)은 strength와 level의 합만큼 damage를 입히고, 대상의 takeDamage 메서드를 호출한 다음,"[name] strikes with [damageType description] for [damage] damage!"뒤에 줄바꿈과 takeDamage 결과를 붙여 반환하도록 구현하세요.Mage.java: Character를 확장하고 Attackable과 Healable을 모두 구현하는 class를 만드세요.intelligence(int)와mana(int) private 필드를 추가하세요. constructor는 name, maxHealth, level, intelligence, mana를 매개변수로 받습니다.getCharacterClass()가"Mage"를 반환하도록 구현하세요.getDamageType()이MAGICAL을 반환하도록 구현하세요.attack(Character target)은 intelligence의 2배만큼 damage를 입히며, Warrior와 동일한 형식을 따르도록 구현하세요.heal(int amount)는 setHealth를 사용해 health를 회복하고"[name] channels healing magic! Health: [health]/[maxHealth]"를 반환하도록 구현하세요.Main.java: 게임 시스템을 실제로 동작하게 만드세요! 쉼표로 구분된 command 문자열을 입력받습니다:CREATE_WARRIOR:name:maxHealth:level:strengthCREATE_MAGE:name:maxHealth:level:intelligence:manaATTACK:attackerName:targetNameHEAL:mageName:amountSTATUS:characterName
캐릭터 collection을 유지하세요. 각 command를 처리하고 다음을 출력하세요:
- CREATE_WARRIOR/CREATE_MAGE:
[name] the [characterClass] joins the battle! - ATTACK: 공격 결과를 출력하세요(attack 메서드가 반환하는 String).
- HEAL: 회복 결과를 출력하거나, 해당 캐릭터가 Mage가 아니면
[name] cannot heal을 출력하세요. - STATUS:
[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]
모든 command를 처리한 후
--- Battle Summary ---를 출력하고 각 캐릭터의 상태를 출력하세요.
입력으로 하나의 쉼표로 구분된 command 문자열을 받습니다.
예를 들어 입력이 CREATE_WARRIOR:Thorin:100:5:15,CREATE_MAGE:Gandalf:80:7:12:50,ATTACK:Thorin:Gandalf,HEAL:Gandalf:25,STATUS:Gandalf라면 출력은 다음과 같습니다:
Thorin the Warrior joins the battle!
Gandalf the Mage joins the battle!
Thorin strikes with brute force for 20 damage!
Gandalf takes 20 damage! Health: 60/80
Gandalf channels healing magic! Health: 80/80
Gandalf (Mage) - Level 7 - Health: 80/80 - Alive
--- Battle Summary ---
Thorin (Warrior) - Level 5 - Health: 100/100 - Alive
Gandalf (Mage) - Level 7 - Health: 80/80 - Alive이 challenge는 상속(Character 계층 구조), 여러 interface 구현(Mage가 Attackable과 Healable을 모두 구현), 메서드가 있는 enum(DamageType), 다형성(서로 다른 캐릭터 유형을 동일한 방식으로 처리), 캡슐화(protected health 관리)를 흥미로운 게임 시스템으로 결합합니다!
직접 해보기
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.LinkedHashMap;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: 캐릭터를 관리하기 위해 컬렉션을 사용하세요 (LinkedHashMap은 삽입 순서를 유지합니다)
// LinkedHashMap<String, Character> characters = new LinkedHashMap<>();
// TODO: 개별 명령어를 얻기 위해 입력을 쉼표로 분할하세요
// String[] commands = input.split(",");
// TODO: 각 명령어를 처리하세요:
// - CREATE_WARRIOR:name:maxHealth:level:strength
// Print: "[name] the Warrior joins the battle!"
//
// - CREATE_MAGE:name:maxHealth:level:intelligence:mana
// Print: "[name] the Mage joins the battle!"
//
// - ATTACK:attackerName:targetName
// attack 메서드의 공격 결과를 출력하세요
//
// - HEAL:mageName:amount
// 치유 결과를 출력하거나, Mage가 아닌 경우 "[name] cannot heal"을 출력하세요
//
// - STATUS:characterName
// 출력: "[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]"
// TODO: After all commands, print "--- Battle Summary ---"
// 그런 다음 각 캐릭터의 상태를 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러