Phát triển 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 GDScript của Coddy. Bài học 64 trên 65.
Thử thách
Trung bìnhXây dựng các nhân vật trong một trò chơi nhập vai: lớp trừu tượng Character, ba lớp kế thừa từ lớp này và các kỹ năng mà nhân vật học được.
Character trong character.gd là một lớp @abstract:
- Thuộc tính:
character_name(từ hàm khởi tạo),level1,max_healthvàhealth100.0,max_manavàmana50,strength,intelligencevàagility10,defense5vàabilities, mộtArray[Ability]. Giá trị sức khỏe làfloat, các chỉ số khác làint. - Tín hiệu
defeated(character_name: String). - Các phương thức trừu tượng
class_title() -> Stringvàattack_power() -> float. level_up() -> String: tăng cấp+1, sức khỏe tối đa+10, mana tối đa+5, sức mạnh, trí thông minh, sự nhanh nhẹn và phòng thủ đều+1; sức khỏe và mana được hồi đầy đến mức tối đa. Trả vềNAME reached level N!.attack(target): in raNAME attacks TARGET, sau đó trả vềtarget.take_damage(attack_power()).take_damage(amount) -> float: sát thương bằngamount - defense * 0.5, nhưng tối thiểu là1.0; sức khỏe giảm đi lượng sát thương đó và không bao giờ thấp hơn0.0. Phương thức in raNAME takes D damage (HP H)với mỗi số có một chữ số thập phân, phát tín hiệudefeatedkhi đòn đánh này làm sức khỏe giảm xuống0, rồi trả về lượng sát thương.is_alive(): sức khỏe lớn hơn0.learn_ability(ability)thêm vàoabilities.use_ability(index, target) -> float: nếu chỉ số nằm ngoài phạm vi củaabilities, in raNAME has no ability INDEXvà trả về0.0; nếu không, trả về giá trị màuse()của kỹ năng trả về._to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D, sức khỏe có một chữ số thập phân.
Mỗi lớp con gọi hàm khởi tạo của lớp cha, sau đó đặt các chỉ số khởi đầu riêng (các chỉ số còn lại giữ nguyên giá trị của lớp cơ sở), trả về tên lớp từ class_title() và ghi đè level_up() bằng super():
Warrior: sức khỏe150.0, mana30, sức mạnh15, trí thông minh5, phòng thủ8; sức tấn côngstrength * 1.2; khi lên cấp, tăng thêm sức mạnh+2và sức khỏe tối đa+10(hồi đầy sức khỏe).Mage: sức khỏe80.0, mana150, sức mạnh5, trí thông minh20, phòng thủ3; sức tấn côngintelligence * 0.4; sau một đòn tấn công thông thường, hồi lại5mana (không vượt quá mức tối đa); khi lên cấp, tăng thêm trí thông minh+2và mana tối đa+15(hồi đầy mana).Rogue: sức khỏe100.0, mana60, sức mạnh12, trí thông minh8, sự nhanh nhẹn18, phòng thủ4; sức tấn côngstrength * 0.5 + agility * 0.7; khi lên cấp, tăng thêm sự nhanh nhẹn+2.
Ability trong ability.gd: hàm khởi tạo nhận ability_name, mana_cost (int) và damage (float). use(user, target) -> float in ra USER does not have enough mana for ABILITY và trả về 0.0 khi mana của người dùng thấp hơn mức tiêu hao. Nếu không, phương thức trừ mana, in ra USER casts ABILITY on TARGET và trả về target.take_damage(damage + user.intelligence * 0.5).
Code được cung cấp kết nối với tín hiệu defeated của từng nhân vật và in ra NAME is defeated!. Với đầu vào này:
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragornđầu ra là:
Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9Đặt code của bạn trong character.gd, warrior.gd, mage.gd, rogue.gd và ability.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
var heroes := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"hero":
var hero: Character
match f[0]:
"warrior":
hero = Warrior.new(f[1])
"mage":
hero = Mage.new(f[1])
"rogue":
hero = Rogue.new(f[1])
hero.defeated.connect(func(who): print(who, " is defeated!"))
heroes[f[1]] = hero
"learn":
heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
"attack":
heroes[f[0]].attack(heroes[f[1]])
"cast":
heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
"level":
print(heroes[f[0]].level_up())
"status":
print(heroes[f[0]])
line = OS.read_string_from_stdin()
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớp3Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChuỗi kế thừaKiểm tra kiểu bằng isTổng kết: phân cấp nhân viên6Phương thức đặc biệt
Giới thiệu về phương thức ảoPhương thức _to_stringTrình lặp tùy chỉnhÔn tập: danh sách tùy chỉnh12Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngPhát triển nhân vật trò chơiDịch vụ cho thuê phương tiệnTự luyện tập: Trình biên dịch GDScript online