Menu
CoddyTech

游戏角色系统

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 109 课,共 110 课。

challenge icon

挑战

简单

让我们来构建一个游戏角色系统,把你掌握的所有面向对象编程概念结合起来!你将创建不同的角色类,每个类都有独特的能力、属性和战斗机制,模拟角色在真实游戏中的运作方式。

你的系统将由 6 个文件组成:

  • character.dart:创建一个抽象的 Character 类,作为所有角色类型的基础。每个角色都有一个 name(String)、一个私有的 _health(int)、一个 attackPower(int)和一个 defense(int)。添加一个用于获取 health 的 getter,以及以下方法:
    • takeDamage(int damage):将 health 减少 damage - defense(至少受到 1 点伤害,health 不能低于 0)。打印 name takes X damage! Health: Y
    • bool isAlive():如果 health 大于 0,则返回 true
    • 一个抽象方法 String attack(),由子类实现各自独特的攻击方式
    重写 toString(),使其返回 name [Class] - HP: health, ATK: attackPower, DEF: defense,其中 Class 来自 runtimeType。
  • abilities.dart:创建两个提供特殊能力的混入:
    • CanHeal:提供一个 heal(int amount) 方法。由于混入不能直接访问私有字段,因此这个混入应定义一个抽象方法 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 类。战士是防御力很高的坦克型角色。初始化时设置 health 为 150、攻击力为 20、防御力为 15。实现 attack(),使其返回 name swings a mighty sword!
  • mage.dart:创建一个继承 Character 并使用 CanCastSpells 和 CanHeal 混入的 Mage 类。法师较为脆弱,但力量强大。初始化时设置 health 为 80、攻击力为 35、防御力为 5。实现 attack(),使其返回 name hurls a fireball!。实现 restoreHealth(int amount),以增加 health(最多恢复到 80)。
  • archer.dart:创建一个继承 Character 的 Archer 类。弓箭手是各项能力均衡的战士。初始化时设置 health 为 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 点生命值
    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"
}

面向对象编程中的所有课

自己练习: Dart 在线编译器