Menu
Coddy logo textTech

게임 캐릭터 시스템

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 109번째.

challenge icon

챌린지

쉬움

여러분이 마스터한 모든 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를 상속받고 CanCastSpellsCanHeal 믹스인을 사용하는 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()을 사용하여 각 캐릭터를 출력합니다. 그런 다음 전투 시퀀스를 시뮬레이션합니다:
    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 형식으로 출력

예상 출력:

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"
}

객체 지향 프로그래밍의 모든 레슨