Phát triển nhân vật trong game
Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 90 trên 91.
Thử thách
DễHãy xây dựng hệ thống Phát triển nhân vật trong trò chơi, nơi các lớp nhân vật khác nhau chiến đấu bằng những kỹ năng riêng biệt. Bạn sẽ tạo một hệ thống phân cấp nhân vật cùng hệ thống kinh nghiệm và lên cấp, qua đó minh họa cách tính kế thừa, giao diện, trait và tính đóng gói phối hợp với nhau trong bối cảnh trò chơi.
Bạn sẽ sắp xếp code trong sáu tệp:
Ability.php: Định nghĩa giao diệnAbilityvới hai phương thức:getName(): stringvàuse(Character $target): string. Giao diện này đảm bảo mọi kỹ năng đều có thể được sử dụng theo cách nhất quán, bất kể hiệu ứng cụ thể của chúng.CombatLogger.php: Tạo traitCombatLoggercung cấp phương thứclogAction(string $action): string. Phương thức này sẽ trả về chuỗi hành động với tiền tố"[COMBAT] ". Các nhân vật sẽ dùng trait này để định dạng thông báo chiến đấu nhất quán.Character.php: Bao gồm các tệp Ability và CombatLogger. Tạo lớp trừu tượngCharactersử dụng traitCombatLogger. Dùng cú pháp khởi tạo thuộc tính trong hàm khởi tạo choname(string, public readonly). Thêm các thuộc tính private chohealth(int, bắt đầu từ 100),level(int, bắt đầu từ 1) vàexperience(int, bắt đầu từ 0). Triển khai:getHealth(): intvàgetLevel(): int: các phương thức getter cho thuộc tính privatetakeDamage(int $amount): void: giảm máu nhưng không bao giờ xuống dưới 0heal(int $amount): void: tăng máu nhưng không bao giờ vượt quá 100gainExperience(int $xp): string: cộng XP; nếu kinh nghiệm đạt 100 trở lên thì lên cấp (đặt lại XP thành 0, tăng cấp, hồi 20 HP), trả về"[name] leveled up to [level]!"; nếu không thì trả về"[name] gained [xp] XP"isAlive(): bool: trả về true nếu máu lớn hơn 0abstract getSpecialAbility(): Ability: mỗi loại nhân vật cung cấp kỹ năng riêngattack(Character $target): string: gây 10 sát thương lên mục tiêu, dùnglogAction()để trả về"[COMBAT] [name] attacks [target name] for 10 damage"
Warrior.php: Bao gồm tệp Character. Tạo lớpWarriorkế thừaCharacter. Triển khaigetSpecialAbility()để trả về một lớp ẩn danh triển khaiAbility:getName()trả về"Shield Bash"use()gây 25 sát thương và trả về"[COMBAT] Shield Bash hits [target name] for 25 damage!"(dùnglogAction()của trait)
Mage.php: Bao gồm tệp Character. Tạo lớpMagekế thừaCharacter. Triển khaigetSpecialAbility()để trả về một lớp ẩn danh triển khaiAbility:getName()trả về"Fireball"use()gây 35 sát thương và trả về"[COMBAT] Fireball engulfs [target name] for 35 damage!"
main.php: Bao gồm các tệp Warrior và Mage. Bạn sẽ nhận hai đầu vào: dữ liệu nhân vật (JSON) và một chuỗi các hành động chiến đấu (JSON).Định dạng JSON của nhân vật:
[{"type": "warrior", "name": "Thorin"}, {"type": "mage", "name": "Gandalf"}]Định dạng JSON của hành động:
[{"action": "attack", "attacker": 0, "target": 1}, {"action": "special", "attacker": 1, "target": 0}, {"action": "xp", "character": 0, "amount": 100}, {"action": "status", "character": 0}]Tạo tất cả nhân vật và lưu vào một mảng (chỉ số 0, 1, v.v.). Xử lý từng hành động:
"attack": Nhân vật ở chỉ số attacker tấn công mục tiêu; in ra kết quả"special": Nhân vật dùng kỹ năng đặc biệt lên mục tiêu; in ra kết quả"xp": Nhân vật nhận kinh nghiệm; in ra kết quả"heal": Nhân vật hồi máu theo lượng đã cho; in ra"[name] healed to [health] HP""status": In ra"[name] - Level [level], HP: [health], Alive: [Yes/No]"
In mỗi kết quả trên một dòng mới.
Hệ thống này minh họa cách lớp trừu tượng định nghĩa hành vi chung của nhân vật, giao diện đảm bảo các kỹ năng tuân theo một giao diện nhất quán, trait cung cấp chức năng ghi nhật ký có thể tái sử dụng, còn lớp ẩn danh tạo các cách triển khai kỹ năng riêng mà không làm codebase của bạn rối thêm với những lớp chỉ dùng một lần.
Tự làm thử
<?php
require_once 'Warrior.php';
require_once 'Mage.php';
// Đọc đầu vào
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));
// Phân tích cú pháp đầu vào JSON
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);
// TODO: Tạo mảng để lưu các đối tượng nhân vật
$characters = [];
// TODO: Duyệt $charactersData và tạo các đối tượng Warrior hoặc Mage
// dựa trên trường "type", rồi lưu chúng vào mảng $characters
// TODO: Xử lý từng hành động trong $actionsData
// Xử lý các loại hành động sau:
// - "attack": Nhân vật tại chỉ số kẻ tấn công tấn công mục tiêu; in ra kết quả
// - "special": Nhân vật dùng getSpecialAbility()->use() lên mục tiêu; in ra kết quả
// - "xp": Nhân vật nhận kinh nghiệm; in ra kết quả
// - "heal": Nhân vật hồi máu; in ra "[name] healed to [health] HP"
// - "status": In ra "[name] - Level [level], HP: [health], Alive: [Yes/No]"
?>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 $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toán9Đặc tính
Giới thiệu về đặc tínhSử dụng nhiều đặc tínhGiải quyết xung đột giữa các đặc tínhPhương thức trừu tượng trong đặc tínhĐặc tính và kế thừa15Thử 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 trong gameDịch vụ cho thuê phương tiệnTự luyện tập: Trình biên dịch PHP online