Oyun Karakteri Geliştirme
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 90 / 91.
Görev
KolayFarklı karakter sınıflarının benzersiz yetenekleri kullanarak savaştığı bir Oyun Karakteri Geliştirme sistemi oluşturalım. Kalıtım, arayüzler, trait'ler ve kapsüllemenin bir oyun bağlamında birlikte nasıl çalıştığını göstermek için deneyim ve seviye atlama sistemine sahip bir karakter hiyerarşisi oluşturacaksın.
Kodunu altı dosyaya ayıracaksın:
Ability.php: İki metoda sahip birAbilityarayüzü tanımla:getName(): stringveuse(Character $target): string. Bu sözleşme, belirli etkilerinden bağımsız olarak tüm yeteneklerin tutarlı bir şekilde kullanılabilmesini sağlar.CombatLogger.php: BirCombatLoggertrait'i oluştur velogAction(string $action): stringmetodunu sağla. Bu metot, eylem dizesinin başına"[COMBAT] "ekleyerek geri döndürmelidir. Karakterler, savaş mesajlarını tutarlı bir biçimde biçimlendirmek için bu trait'i kullanacaktır.Character.php: Ability ve CombatLogger dosyalarını dahil et.CombatLoggertrait'ini kullanan soyut birCharactersınıfı oluştur.name(string, public readonly) için yapıcı terfisini kullan.health(int, 100 ile başlayan),level(int, 1 ile başlayan) veexperience(int, 0 ile başlayan) için private özellikler ekle. Şunları uygula:getHealth(): intvegetLevel(): int: private özellikler için getter'lartakeDamage(int $amount): void: canı azaltır ancak 0'ın altına düşürmezheal(int $amount): void: canı artırır ancak 100'ün üzerine çıkarmazgainExperience(int $xp): string: XP ekler; deneyim 100 veya daha fazlasına ulaşırsa seviye atlatır (XP'yi 0'a sıfırlar, seviyeyi artırır, 20 HP iyileştirir),"[name] leveled up to [level]!"döndürür; aksi takdirde"[name] gained [xp] XP"döndürürisAlive(): bool: can 0'dan büyükse true döndürürabstract getSpecialAbility(): Ability: her karakter türü kendi benzersiz yeteneğini sağlarattack(Character $target): string: hedefe 10 hasar verir,logAction()kullanarak"[COMBAT] [name] attacks [target name] for 10 damage"döndürür
Warrior.php: Character dosyasını dahil et.Charactersınıfını genişleten birWarriorsınıfı oluştur.getSpecialAbility()metodunu,Abilityarayüzünü uygulayan anonim bir sınıf döndürecek şekilde uygula:getName()"Shield Bash"döndürüruse()25 hasar verir ve"[COMBAT] Shield Bash hits [target name] for 25 damage!"döndürür (trait'inlogAction()metodunu kullan)
Mage.php: Character dosyasını dahil et.Charactersınıfını genişleten birMagesınıfı oluştur.getSpecialAbility()metodunu,Abilityarayüzünü uygulayan anonim bir sınıf döndürecek şekilde uygula:getName()"Fireball"döndürüruse()35 hasar verir ve"[COMBAT] Fireball engulfs [target name] for 35 damage!"döndürür
main.php: Warrior ve Mage dosyalarını dahil et. İki girdi alacaksın: karakter verileri (JSON) ve bir dizi savaş eylemi (JSON).Karakterlerin JSON biçimi:
[{"type": "warrior", "name": "Thorin"}, {"type": "mage", "name": "Gandalf"}]Eylemlerin JSON biçimi:
[{"action": "attack", "attacker": 0, "target": 1}, {"action": "special", "attacker": 1, "target": 0}, {"action": "xp", "character": 0, "amount": 100}, {"action": "status", "character": 0}]Tüm karakterleri oluştur ve bir dizide sakla (indeks 0, 1 vb.). Her eylemi işle:
"attack": attacker indeksindeki karakter hedefe saldırır; sonucu yazdır"special": karakter özel yeteneğini hedef üzerinde kullanır; sonucu yazdır"xp": karakter deneyim kazanır; sonucu yazdır"heal": karakter verilen miktar kadar iyileşir;"[name] healed to [health] HP"yazdır"status":"[name] - Level [level], HP: [health], Alive: [Yes/No]"yazdır
Her sonucu yeni bir satıra yazdır.
Bu sistem; soyut sınıfların paylaşılan karakter davranışlarını nasıl tanımladığını, arayüzlerin yeteneklerin tutarlı bir sözleşmeye uymasını nasıl sağladığını, trait'lerin yeniden kullanılabilir günlük kaydı işlevselliği sunduğunu ve anonim sınıfların kod tabanını tek kullanımlık sınıflarla karmaşıklaştırmadan benzersiz yetenek uygulamalarının nasıl oluşturulacağını gösterir.
Kendin dene
<?php
require_once 'Warrior.php';
require_once 'Mage.php';
// Girişi oku
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));
// JSON girdilerini ayrıştır
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);
// TODO: Karakter nesnelerini saklamak için bir dizi oluştur
$characters = [];
// TODO: $charactersData üzerinde döngü yap ve Warrior veya Mage nesneleri oluştur
// "type" alanına göre, bunları $characters dizisinde sakla
// TODO: $actionsData içindeki her eylemi işle
// Bu eylem türlerini işle:
// - "attack": Saldırgan indeksindeki karakter hedefe saldırır; sonucu yazdır
// - "special": Karakter hedef üzerinde getSpecialAbility()->use() kullanır; sonucu yazdır
// - "xp": Karakter deneyim kazanır; sonucu yazdır
// - "heal": Karakter iyileşir; "[name] healed to [health] HP" yazdır
// - "status": "[name] - Level [level], HP: [health], Alive: [Yes/No]" yazdır
?>Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi