Pengembangan Karakter Game
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 90 dari 91.
Tantangan
MudahMari kita bangun sistem Pengembangan Karakter Game yang memungkinkan berbagai class karakter bertarung menggunakan kemampuan unik. Kamu akan membuat hierarki karakter dengan sistem pengalaman dan kenaikan level, untuk menunjukkan cara pewarisan, interface, trait, dan enkapsulasi bekerja bersama dalam konteks game.
Kamu akan mengatur kodemu dalam enam file:
Ability.php: Definisikan interfaceAbilitydengan dua method:getName(): stringdanuse(Character $target): string. Kontrak ini memastikan semua kemampuan dapat digunakan secara konsisten, terlepas dari efek spesifiknya.CombatLogger.php: Buat traitCombatLoggeryang menyediakan methodlogAction(string $action): string. Method ini harus mengembalikan string aksi yang diawali dengan"[COMBAT] ". Karakter akan menggunakan trait ini untuk memformat pesan pertarungan secara konsisten.Character.php: Sertakan file Ability dan CombatLogger. Buat class abstrakCharacteryang menggunakan traitCombatLogger. Gunakan promosi constructor untukname(string, public readonly). Sertakan property privat untukhealth(int, dimulai dari 100),level(int, dimulai dari 1), danexperience(int, dimulai dari 0). Implementasikan:getHealth(): intdangetLevel(): int: getter untuk property privattakeDamage(int $amount): void: mengurangi health, tetapi tidak pernah kurang dari 0heal(int $amount): void: menambah health, tetapi tidak pernah lebih dari 100gainExperience(int $xp): string: menambahkan XP; jika experience mencapai 100 atau lebih, naikkan level (atur ulang XP ke 0, naikkan level, pulihkan 20 HP), lalu kembalikan"[name] leveled up to [level]!"; jika tidak, kembalikan"[name] gained [xp] XP"isAlive(): bool: mengembalikan true jika health lebih besar dari 0abstract getSpecialAbility(): Ability: setiap jenis karakter menyediakan kemampuan uniknyaattack(Character $target): string: memberikan 10 damage kepada target, menggunakanlogAction()untuk mengembalikan"[COMBAT] [name] attacks [target name] for 10 damage"
Warrior.php: Sertakan file Character. Buat classWarrioryang mewarisiCharacter. ImplementasikangetSpecialAbility()agar mengembalikan class anonim yang mengimplementasikanAbility:getName()mengembalikan"Shield Bash"use()memberikan 25 damage dan mengembalikan"[COMBAT] Shield Bash hits [target name] for 25 damage!"(gunakanlogAction()dari trait)
Mage.php: Sertakan file Character. Buat classMageyang mewarisiCharacter. ImplementasikangetSpecialAbility()agar mengembalikan class anonim yang mengimplementasikanAbility:getName()mengembalikan"Fireball"use()memberikan 35 damage dan mengembalikan"[COMBAT] Fireball engulfs [target name] for 35 damage!"
main.php: Sertakan file Warrior dan Mage. Kamu akan menerima dua input: data karakter (JSON) dan rangkaian aksi pertarungan (JSON).Format JSON karakter:
[{"type": "warrior", "name": "Thorin"}, {"type": "mage", "name": "Gandalf"}]Format JSON aksi:
[{"action": "attack", "attacker": 0, "target": 1}, {"action": "special", "attacker": 1, "target": 0}, {"action": "xp", "character": 0, "amount": 100}, {"action": "status", "character": 0}]Buat semua karakter dan simpan dalam array (indeks 0, 1, dan seterusnya). Proses setiap aksi:
"attack": Karakter pada indeks attacker menyerang target; cetak hasilnya"special": Karakter menggunakan kemampuan khususnya pada target; cetak hasilnya"xp": Karakter mendapatkan pengalaman; cetak hasilnya"heal": Karakter memulihkan health sebesar nilai yang diberikan; cetak"[name] healed to [health] HP""status": Cetak"[name] - Level [level], HP: [health], Alive: [Yes/No]"
Cetak setiap hasil pada baris baru.
Sistem ini menunjukkan cara class abstrak mendefinisikan perilaku karakter bersama, interface memastikan kemampuan mengikuti kontrak yang konsisten, trait menyediakan fungsi pencatatan yang dapat digunakan kembali, dan class anonim membuat implementasi kemampuan unik tanpa memenuhi codebase-mu dengan class yang hanya digunakan sekali.
Coba sendiri
<?php
require_once 'Warrior.php';
require_once 'Mage.php';
// Baca input
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));
// Uraikan input JSON
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);
// TODO: Buat array untuk menyimpan object karakter
$characters = [];
// TODO: Lakukan perulangan pada $charactersData dan buat object Warrior atau Mage
// berdasarkan field "type", lalu simpan dalam array $characters
// TODO: Proses setiap aksi dalam $actionsData
// Tangani jenis aksi berikut:
// - "attack": Karakter pada indeks penyerang menyerang target; cetak hasilnya
// - "special": Karakter menggunakan getSpecialAbility()->use() pada target; cetak hasilnya
// - "xp": Karakter memperoleh pengalaman; cetak hasilnya
// - "heal": Karakter memulihkan kesehatan; cetak "[name] healed to [health] HP"
// - "status": Cetak "[name] - Level [level], HP: [health], Alive: [Yes/No]"
?>Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses Pembayaran9Trait
Pengantar TraitMenggunakan Beberapa TraitResolusi Konflik TraitMetode Abstrak dalam TraitTrait vs Pewarisan15Tantangan Akhir
Platform E-LearningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan KendaraanLatihan sendiri: Compiler PHP online