Hệ thống nhân vật trò chơi
Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 109 trên 110.
Thử thách
DễHãy xây dựng một hệ thống nhân vật trong game kết hợp tất cả các khái niệm OOP bạn đã nắm vững! Bạn sẽ tạo các lớp nhân vật khác nhau với kỹ năng, chỉ số và cơ chế chiến đấu riêng, mô phỏng cách các nhân vật có thể hoạt động trong một game thực tế.
Hệ thống của bạn sẽ được tổ chức trong sáu tệp:
character.dart: Tạo một lớp trừu tượngCharacterlàm nền tảng cho mọi loại nhân vật. Mỗi nhân vật cóname(String),_health(int) riêng tư,attackPower(int) vàdefense(int). Thêm getter cho health và các phương thức sau:takeDamage(int damage)- giảm health theodamage - defense(lượng sát thương nhận vào tối thiểu là 1, health không thể thấp hơn 0). In raname takes X damage! Health: Ybool isAlive()- trả về true nếu health lớn hơn 0- Một phương thức trừu tượng
String attack()mà các lớp con triển khai để tạo phong cách tấn công riêng
toString()để trả vềname [Class] - HP: health, ATK: attackPower, DEF: defense, trong đó Class lấy từruntimeType.abilities.dart: Tạo hai mixin cung cấp các kỹ năng đặc biệt:CanHeal- cung cấp phương thứcheal(int amount). Vì mixin không thể truy cập trực tiếp các trường riêng tư, mixin này nên định nghĩa phương thức trừu tượngvoid restoreHealth(int amount)để lớp nhân vật triển khai. Phương thứcheal()gọirestoreHealth(amount)và in raname heals for amount HP!CanCastSpells- cung cấpint mana(mặc định là 100) và phương thứccastSpell(String spellName, int manaCost), giảm mana nếu đủ, in raname casts spellName!rồi trả về true. Nếu không đủ mana, in raNot enough mana!và trả về false.
warrior.dart: Tạo lớpWarriorkế thừaCharacter. Các Warrior là những đấu sĩ chịu đòn với khả năng phòng thủ cao. Khởi tạo với 150 health, 20 attack power và 15 defense. Triển khaiattack()để trả vềname swings a mighty sword!mage.dart: Tạo lớpMagekế thừaCharactervà sử dụng các mixinCanCastSpellsvàCanHeal. Mage yếu ớt nhưng mạnh mẽ. Khởi tạo với 80 health, 35 attack power và 5 defense. Triển khaiattack()để trả vềname hurls a fireball!. Triển khairestoreHealth(int amount)để tăng health (tối đa là 80).archer.dart: Tạo lớpArcherkế thừaCharacter. Archer là những đấu sĩ cân bằng. Khởi tạo với 100 health, 25 attack power và 10 defense. Triển khaiattack()để trả vềname fires a precise arrow!main.dart: Minh họa hệ thống nhân vật bằng cách tạo một nhân vật thuộc mỗi loại: một Warrior tên làThorin, một Mage tên làGandalfvà một Archer tên làLegolas. In ra từng nhân vật bằngtoString(). Sau đó mô phỏng một trận chiến theo trình tự:- In ra thông báo tấn công của Thorin
- Gandalf nhận 30 sát thương
- Gandalf dùng phép
Healing Light(tốn 25 mana) - Gandalf hồi 20 HP
- In ra thông báo tấn công của Gandalf
- Thorin nhận 40 sát thương
- In ra thông báo tấn công của Legolas
- In ra trạng thái sống của từng nhân vật theo định dạng:
name alive: true/false
Đầu ra mong đợi:
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: trueTự làm thử
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: Tạo một Warrior tên là "Thorin"
// TODO: Tạo một Mage tên là "Gandalf"
// TODO: Tạo một Archer tên là "Legolas"
// TODO: In ra từng nhân vật bằng toString()
// TODO: Mô phỏng trình tự trận đấu:
// 1. In ra thông báo tấn công của Thorin
// 2. Gandalf chịu 30 sát thương
// 3. Gandalf dùng phép "Healing Light" (tốn 25 mana)
// 4. Gandalf hồi 20 HP
// 5. In ra thông báo tấn công của Gandalf
// 6. Thorin chịu 40 sát thương
// 7. In ra thông báo tấn công của Legolas
// 8. In ra trạng thái còn sống của từng nhân vật: "name alive: true/false"
}
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật11Phương thức đặc biệt
Ghi đè toString()Ghi đè hashCode và ==Giao diện ComparablePhương thức call()Ghi đè noSuchMethodÔn tập: bộ sưu tập tùy chỉnh17Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngHệ thống nhân vật trò chơiDịch vụ cho thuê phương tiện3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online