游戏角色系统
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 109 课,共 110 课。
挑战
简单让我们来构建一个游戏角色系统,把你掌握的所有面向对象编程概念结合起来!你将创建不同的角色类,每个类都有独特的能力、属性和战斗机制,模拟角色在真实游戏中的运作方式。
你的系统将由 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: Ybool 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()打印每个角色。然后模拟一段战斗过程:- 打印 Thorin 的攻击信息
- Gandalf 受到 30 点伤害
- Gandalf 施放
Healing Light(消耗 25 点法力值) - Gandalf 恢复 20 点生命值
- 打印 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"
}
面向对象编程中的所有课
自己练习: Dart 在线编译器