게임 캐릭터 시스템
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 109번째.
챌린지
쉬움여러분이 마스터한 모든 OOP 개념을 한데 모은 게임 캐릭터 시스템을 구축해 봅시다! 실제 게임에서 캐릭터가 어떻게 작동하는지 모델링하여, 고유한 능력, 스탯 및 전투 메커니즘을 가진 다양한 캐릭터 클래스를 만들 것입니다.
시스템은 다음 6개의 파일로 구성됩니다:
character.dart: 모든 캐릭터 유형의 기초가 되는 추상 클래스Character를 만듭니다. 각 캐릭터는name(String), private_health(int),attackPower(int),defense(int)를 가집니다. health에 대한 getter와 다음 메서드들을 포함하세요:takeDamage(int damage)- 체력을damage - defense만큼 감소시킵니다 (최소 1의 피해를 입으며, 체력은 0 미만으로 내려갈 수 없습니다).name takes X damage! Health: Y를 출력합니다.bool isAlive()- 체력이 0보다 크면 true를 반환합니다.- 서브클래스가 각자의 고유한 공격 스타일을 위해 구현할 추상 메서드
String attack()
toString()을 오버라이드하여name [Class] - HP: health, ATK: attackPower, DEF: defense를 반환하도록 합니다. 여기서 Class는runtimeType에서 가져옵니다.abilities.dart: 특별한 능력을 제공하는 두 개의 믹스인(mixin)을 만듭니다:CanHeal-heal(int amount)메서드를 제공합니다. 믹스인은 private 필드에 직접 접근할 수 없으므로, 이 믹스인은 캐릭터 클래스가 구현할 추상 메서드void restoreHealth(int amount)를 정의해야 합니다.heal()메서드는restoreHealth(amount)를 호출하고name heals for amount HP!를 출력합니다.CanCastSpells-int mana(기본값 100)와castSpell(String spellName, int manaCost)메서드를 제공합니다. 마나가 충분하면 마나를 감소시키고name casts spellName!을 출력한 후 true를 반환합니다. 마나가 부족하면Not enough mana!를 출력하고 false를 반환합니다.
warrior.dart:Character를 상속받는Warrior클래스를 만듭니다. 전사(Warrior)는 방어력이 높은 탱커입니다. 체력 150, 공격력 20, 방어력 15로 초기화합니다.attack()을 구현하여name swings a mighty sword!를 반환하도록 합니다.mage.dart:Character를 상속받고CanCastSpells와CanHeal믹스인을 사용하는Mage클래스를 만듭니다. 마법사(Mage)는 취약하지만 강력합니다. 체력 80, 공격력 35, 방어력 5로 초기화합니다.attack()을 구현하여name hurls a fireball!을 반환하도록 합니다.restoreHealth(int amount)를 구현하여 체력을 증가시킵니다 (최대 80으로 제한).archer.dart:Character를 상속받는Archer클래스를 만듭니다. 궁수(Archer)는 균형 잡힌 파이터입니다. 체력 100, 공격력 25, 방어력 10으로 초기화합니다.attack()을 구현하여name fires a precise arrow!를 반환하도록 합니다.main.dart: 각 캐릭터 유형을 하나씩 생성하여 캐릭터 시스템을 시연합니다: 이름이Thorin인 Warrior, 이름이Gandalf인 Mage, 이름이Legolas인 Archer를 만듭니다.toString()을 사용하여 각 캐릭터를 출력합니다. 그런 다음 전투 시퀀스를 시뮬레이션합니다:- Thorin의 공격 메시지 출력
- Gandalf가 30의 피해를 입음
- Gandalf가
Healing Light를 시전 (비용 25 마나) - Gandalf가 20 HP만큼 회복
- Gandalf의 공격 메시지 출력
- Thorin이 40의 피해를 입음
- Legolas의 공격 메시지 출력
- 각 캐릭터의 생존 여부를
name alive: true/false형식으로 출력
예상 출력:
Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: true직접 해보기
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: "Thorin"이라는 이름의 Warrior 생성
// TODO: "Gandalf"라는 이름의 Mage 생성
// TODO: "Legolas"라는 이름의 Archer 생성
// TODO: toString()을 사용하여 각 캐릭터 출력
// TODO: 전투 시퀀스 시뮬레이션:
// 1. Thorin의 공격 메시지 출력
// 2. Gandalf가 30의 데미지를 입음
// 3. Gandalf가 "Healing Light" 시전 (마나 25 소모)
// 4. Gandalf가 20 HP 회복
// 5. Gandalf의 공격 메시지 출력
// 6. Thorin이 40의 데미지를 입음
// 7. Legolas의 공격 메시지 출력
// 8. 각 캐릭터의 생존 여부 출력: "name alive: true/false"
}